From dda93e4ba0c559396027a7975594d7226e07206e Mon Sep 17 00:00:00 2001 From: Barracuda09 Date: Mon, 30 Oct 2023 20:20:57 +0100 Subject: [PATCH] Refactor: How Streams and Streamclient are handled and how data is send --- Makefile | 13 +- SatPI.plantuml | 58 +- SatPI.png | Bin 310359 -> 257948 bytes SatPI.svg | 2 +- src/Defs.h | 3 + src/HeaderVector.cpp | 4 +- src/HttpServer.cpp | 16 +- src/HttpcServer.cpp | 41 +- src/HttpcServer.h | 16 +- src/Log.cpp | 9 +- src/Log.h | 11 +- src/Properties.cpp | 15 +- src/Properties.h | 8 +- src/RtspServer.cpp | 130 +---- src/RtspServer.h | 22 +- src/Stream.cpp | 582 ++++++++++---------- src/Stream.h | 158 +++--- src/StreamClient.cpp | 145 ----- src/StreamInterface.h | 91 --- src/StreamManager.cpp | 37 +- src/StreamManager.h | 5 +- src/StringConverter.cpp | 4 +- src/StringConverter.h | 2 +- src/TransportParamVector.cpp | 4 +- src/Utils.cpp | 2 +- src/base/CharPointerArray.h | 2 +- src/base/M3UParser.cpp | 2 +- src/base/Thread.cpp | 12 +- src/base/Thread.h | 17 +- src/base/ThreadBase.cpp | 4 +- src/decrypt/dvbapi/Client.cpp | 16 +- src/decrypt/dvbapi/ClientProperties.h | 6 +- src/decrypt/dvbapi/Filter.h | 4 +- src/decrypt/dvbapi/FilterData.h | 6 +- src/decrypt/dvbapi/Keys.cpp | 2 +- src/decrypt/dvbapi/Keys.h | 2 +- src/decrypt/dvbca/DVBCA.cpp | 10 +- src/input/Device.h | 11 +- src/input/DeviceData.cpp | 12 +- src/input/DeviceData.h | 6 +- src/input/childpipe/TSReader.cpp | 29 +- src/input/childpipe/TSReader.h | 4 +- src/input/childpipe/TSReaderData.cpp | 6 +- src/input/dvb/Frontend.cpp | 48 +- src/input/dvb/Frontend.h | 10 +- src/input/dvb/FrontendData.cpp | 8 +- src/input/dvb/FrontendDecryptInterface.h | 6 +- src/input/dvb/Frontend_DecryptInterface.cpp | 6 +- src/input/dvb/delivery/DVBS.cpp | 8 +- src/input/file/TSReader.cpp | 14 +- src/input/file/TSReader.h | 4 +- src/input/file/TSReaderData.cpp | 2 +- src/input/stream/Streamer.cpp | 14 +- src/input/stream/Streamer.h | 4 +- src/input/stream/StreamerData.cpp | 2 +- src/main.cpp | 10 +- src/mpegts/Filter.cpp | 26 +- src/mpegts/Filter.h | 2 +- src/mpegts/NIT.cpp | 6 +- src/mpegts/PAT.cpp | 13 +- src/mpegts/PCR.cpp | 2 +- src/mpegts/PCR.h | 4 +- src/mpegts/PMT.cpp | 16 +- src/mpegts/PacketBuffer.cpp | 39 +- src/mpegts/PacketBuffer.h | 7 +- src/mpegts/PidTable.cpp | 7 +- src/mpegts/SDT.cpp | 8 +- src/mpegts/SDT.h | 2 +- src/mpegts/TableData.cpp | 10 +- src/mpegts/TableData.h | 18 +- src/output/StreamClient.cpp | 378 +++++++++++++ src/{ => output}/StreamClient.h | 217 +++++--- src/output/StreamClientOutputHttp.cpp | 65 +++ src/output/StreamClientOutputHttp.h | 81 +++ src/output/StreamClientOutputRtp.cpp | 180 ++++++ src/output/StreamClientOutputRtp.h | 98 ++++ src/output/StreamClientOutputRtpTcp.cpp | 137 +++++ src/output/StreamClientOutputRtpTcp.h | 91 +++ src/output/StreamThreadBase.cpp | 250 --------- src/output/StreamThreadBase.h | 146 ----- src/output/StreamThreadHttp.cpp | 96 ---- src/output/StreamThreadHttp.h | 71 --- src/output/StreamThreadRtcp.cpp | 84 --- src/output/StreamThreadRtcp.h | 65 --- src/output/StreamThreadRtcpBase.cpp | 237 -------- src/output/StreamThreadRtcpBase.h | 117 ---- src/output/StreamThreadRtcpTcp.cpp | 84 --- src/output/StreamThreadRtcpTcp.h | 62 --- src/output/StreamThreadRtp.cpp | 111 ---- src/output/StreamThreadRtp.h | 82 --- src/output/StreamThreadRtpTcp.cpp | 118 ---- src/output/StreamThreadRtpTcp.h | 80 --- src/output/StreamThreadTSWriter.cpp | 72 --- src/output/StreamThreadTSWriter.h | 76 --- src/socket/SocketAttr.cpp | 8 +- src/socket/SocketAttr.h | 5 + src/socket/TcpSocket.cpp | 2 +- src/socket/UdpSocket.cpp | 4 +- src/upnp/ssdp/Server.cpp | 28 +- web/config.html | 1 + web/frontend.html | 1 + 101 files changed, 1894 insertions(+), 2978 deletions(-) delete mode 100644 src/StreamClient.cpp delete mode 100644 src/StreamInterface.h create mode 100644 src/output/StreamClient.cpp rename src/{ => output}/StreamClient.h (55%) create mode 100644 src/output/StreamClientOutputHttp.cpp create mode 100644 src/output/StreamClientOutputHttp.h create mode 100644 src/output/StreamClientOutputRtp.cpp create mode 100644 src/output/StreamClientOutputRtp.h create mode 100644 src/output/StreamClientOutputRtpTcp.cpp create mode 100644 src/output/StreamClientOutputRtpTcp.h delete mode 100644 src/output/StreamThreadBase.cpp delete mode 100644 src/output/StreamThreadBase.h delete mode 100644 src/output/StreamThreadHttp.cpp delete mode 100644 src/output/StreamThreadHttp.h delete mode 100644 src/output/StreamThreadRtcp.cpp delete mode 100644 src/output/StreamThreadRtcp.h delete mode 100644 src/output/StreamThreadRtcpBase.cpp delete mode 100644 src/output/StreamThreadRtcpBase.h delete mode 100644 src/output/StreamThreadRtcpTcp.cpp delete mode 100644 src/output/StreamThreadRtcpTcp.h delete mode 100644 src/output/StreamThreadRtp.cpp delete mode 100644 src/output/StreamThreadRtp.h delete mode 100644 src/output/StreamThreadRtpTcp.cpp delete mode 100644 src/output/StreamThreadRtpTcp.h delete mode 100644 src/output/StreamThreadTSWriter.cpp delete mode 100644 src/output/StreamThreadTSWriter.h diff --git a/Makefile b/Makefile index a1af2682..57c19ba0 100755 --- a/Makefile +++ b/Makefile @@ -68,7 +68,6 @@ SOURCES = Version.cpp \ main.cpp \ Satpi.cpp \ Stream.cpp \ - StreamClient.cpp \ StreamManager.cpp \ StringConverter.cpp \ TransportParamVector.cpp \ @@ -108,14 +107,10 @@ SOURCES = Version.cpp \ mpegts/PMT.cpp \ mpegts/SDT.cpp \ mpegts/TableData.cpp \ - output/StreamThreadBase.cpp \ - output/StreamThreadHttp.cpp \ - output/StreamThreadRtcpBase.cpp \ - output/StreamThreadRtcp.cpp \ - output/StreamThreadRtcpTcp.cpp \ - output/StreamThreadRtp.cpp \ - output/StreamThreadRtpTcp.cpp \ - output/StreamThreadTSWriter.cpp \ + output/StreamClient.cpp \ + output/StreamClientOutputHttp.cpp \ + output/StreamClientOutputRtp.cpp \ + output/StreamClientOutputRtpTcp.cpp \ socket/HttpcSocket.cpp \ socket/TcpSocket.cpp \ socket/SocketAttr.cpp \ diff --git a/SatPI.plantuml b/SatPI.plantuml index d45db9d2..72340bba 100644 --- a/SatPI.plantuml +++ b/SatPI.plantuml @@ -103,22 +103,16 @@ class HttpcServer { processStreamingRequest(..) } -class StreamInterface #aaaaff { - getInputDevice() = 0 - getStreamClient(..) = 0 - getDecryptDevice() = 0 -} - -Stream --|> StreamInterface -Stream *-- StreamClient : " _client[..] " +Stream *-- output::StreamClient : " _streamClientVector[..] " +Stream *-- mpegts::PacketBuffer : " _tsBuffer[..] " Stream *-- input::Device -Stream *-- output::StreamThreadBase decrypt::dvbapi::Client ..* Stream : " _decrypt " class Stream #aaaaff { XMLSupport - -- + ** Thread DataReader** + ** Thread Monitor/RTCP** + -- enabled - StreamingType (RSTP/RTP/HTTP/..) streamInUse -- getFrontendDecryptInterface() @@ -149,10 +143,10 @@ class StreamManager #aaaaff { getFrontendDecryptInterface(..) } -StreamClient *-- socket::SocketAttr : " _rtp " -StreamClient *-- socket::SocketAttr : " _rtcp " -StreamClient *.. socket::SocketClient : " _httpStream " -class StreamClient #aaaaff { +output::StreamClient *-- socket::SocketAttr : " _rtp " +output::StreamClient *-- socket::SocketAttr : " _rtcp " +output::StreamClient *.. socket::SocketClient : " _httpStream " +class output::StreamClient #ccffff { Mutex _mutex -- SocketClient *_httpStream @@ -171,33 +165,19 @@ class mpegts::PMT #11ff11 class mpegts::PCR #11ff11 class mpegts::SDT #11ff11 -output::StreamThreadBase *-- mpegts::PacketBuffer : " _tsBuffer[..] " -output::StreamThreadBase *.. StreamInterface -class output::StreamThreadBase #ccffff { - ** Thread ** - -- -} - -class output::StreamThreadRtcp #ccffff -class output::StreamThreadHttp #ccffff - -output::StreamThreadRtcp --* output::StreamThreadRtp - -output::StreamThreadRtp --|> output::StreamThreadBase -class output::StreamThreadRtp #ccffff { - cseq -} - -output::StreamThreadHttp --|> output::StreamThreadBase -class input::stream::Streamer #55ccff -input::Device <|-- input::stream::Streamer +class output::StreamClientOutputHttp #ccffff +class output::StreamClientOutputRtp #ccffff +class output::StreamClientOutputRtpTcp #ccffff +output::StreamClientOutputHttp --|> output::StreamClient +output::StreamClientOutputRtp --|> output::StreamClient +output::StreamClientOutputRtpTcp --|> output::StreamClient -class input::file::TSReader #99cc11 -class TSReaderData #99cc11 +class input::childpipe::TSReader #99cc11 +class TSReaderData #99cc11 -input::Device <|-- input::file::TSReader -input::file::TSReader *-- TSReaderData +input::Device <|-- input::childpipe::TSReader +input::childpipe::TSReader *-- TSReaderData TSReaderData --|> input::DeviceData diff --git a/SatPI.png b/SatPI.png index 0f9ab1fff51439575b60d7f2bdbf72f5ce49347a..e00fc05fdb72ee1e2d46e61ba2819417bf961086 100644 GIT binary patch literal 257948 zcmb5Wby$?$*ES3WsD#ogrP3jdbf_TG-7V53-JuB5C=CKLGz_J5gHqBB(%s!K!0_!E z{5{Y6ywCg3hsSXbw{Y!i@3q%D*LkkBw?PVW5;*rB-$O$~!;yR|ri6xeXBG_&Gy2XA z@Hg)9)-dqF?I^C{Xk`1r&C1xs5lzC_#@OD_(fIw7cWzJ2934OKv$B4$GPH4YvbJJz zuywLGGB&ZbH#KIlF?QrPRV773!_ab9(Qy3F@1UW%CKYIGM2x?Aa24Ks^<%zX=j)RX zbr~)>VZVRT)M41)5m3yaf3l3W?cR&!D$WukJtYjI z*v(6u?1?cvlAEm92?X9my`gNBH?fL`{amB#2aS6?66z=KQwvG>o?Bw{@k zb|0quQM0gT3i`!0%|(T7x6IXdL}_t)Ney?=@fu84?Xdc`D}GEAe#kL!w_~#Xb8-AF zZ3?C-H8VxB;s^fqG!Q1Mj!P=TUACeR_`wTnv84E9zqhO(v_LGCm3i}%#$9d1$%C>A zN#pDd(&@W%zM(xIcG6Ik`wpsdViyBZdbX8OeghaE3tn)s~iEg z9@;H0$cvGei1u$6%n#bQZhoay62$UDqiU6>xmiw;^R3Tid+l@L91;G^&`W}H$w{;H z(*(@OF70-@I|GcOa0ToegRVADZI5rzTOXe{PVY%B?%Qf+oA@NWpTuMq)-wsHPJSoM zpv+kBc!z=N@#0FTSz8Q6neQh1gnyyGCVoOj%>4-3C3bvM3E6ovWkLeX?<%BCe{mXa zX%UA!)h0-6-Ms&$HBd#-()WsWUG;5(q?tP&Zpn0@@FF^xOIrV=k>WF zRF0O3p2IHAHRawztB0!c+^?v=(yp9}KG=5F37t1;zPtVFBVK}x5^F${ccNq_d&@`9 zz)YEicg!p@C9jsh{^Gv+WTeV;+w{@?@%@EtOONtMK~+&+-|&b*Mb=HhTRZeD_pCz3 z@^}~9h5lGkxTG{BkkUI!$y zk<>H)-S{m=mbz!c@^6*n!$@V6t1 z*Jo+5H3U{WH5K$@j$N=@ZoLyct|jm{=^#B|iemM%V#jNK(jTV6g{M9*%4BA-;nk0( zm2xw&K;AFktsv`Jm=oqPz4<(DNBB0E`(>1Y_ZQ+*0=Yk(6}W@6RfzkaepeBXF*hE* zcr7qrgBQeBL?AuI#W+z>afe7Ea&Mo5v3m%6YU^PI_34&}o!v-$$DET*V9)5*y{!OB z4yh(R3`^%v5gOCZYuHRn&;0WOpNQRgH5_98J?~tlJ_e6bM)v;K(=^M|!efDlxg@fy z^-`WQYtd=q&R_&3pbeS1}zBSuQbSjBsjdX{N%@X>wYMqve~{)aX7(~*LFBWGDZPQim`>FVG%-(q236*0B zyys*|fubTG`F?JTP=!$9kE<$EC7jqo!U}DRz9;lbG>mYP7FXU$f|q70F+S=3$uGCA zN)U2R%^jS!wvtpjdZ*>WL!Oi2$?xawCpT9X?BRwbt{x|nsd7C23JPASU)L9#+zM#Q zh8nn%m{|0b7)PTw+gekJ3}O@R^Pd`>HD17L1*{yEG?c-#RoRT`ML#fHAOgP&#I>B%TJ3N zBD6yur_b&Q#-pM6qDhLqRB;{OoWjzHR-M1HD?7UPjFE_j*gDa~LM1EORTBFb{oC$R zwr)owm$j8TvwmuI?W>O!zn>Z7VB29ld>C-|&VyHkYS_O>@2!U;9(-$jpr{zX=`%hy zBjy{}I2qr2?xa_n;^xY-!soEO$L%S!vUZ3C(&P0PR3h07nKQ4yRteCF{_{QBVX!YU zzg~a2i;Lbye%HYNVYZQ}sFnkK=+(IkAx;;tNLViBzEEz@cMkh-RVg(M4A@Ur+U@P_ zxlE$o!!KBW2OT`x$jZ*nu3PQ6HuOi=v#MHIG?R#gWb{H0Ic(qDp7s-bi(H9pNiHVP6q=+aegiX5QYfkN*&V8jyJP{XXqk0~)wfR08HyDu*EeEl_LVoT_ zpKMPFIITPG&9|78w|8|N9v*tme#CS?-aMOh=*`T^LL7Imzj$5rcu{`-bUyQM-LLRc z5#*B&O(ai|pQlTEZInAhxr2$^mK~j)w&zD{C)LhdFt4|&ST|wC#T?f!JoUde&8;A@ zwC-36ufzUPeIFq~!P@fja>NVeY`LihA0H>DqXbS`fB*iA<-K}6%uehJ{_-p4< z_YP_c$SL$cBcGn-u_%L|?k#9n*pyXNASYe3Q=g|x`QX9q>}+42I;-{2P=R*EOufz& z1GMb{93tb~?yp zskySZH)5$XE-x>yq`0^>f^sHTIoq%)!2HGPL`9M7BT`b2h1M`m(;gX!aNW!DAz-~d z4hDv`6^IXFi9`VED;HMkGi4B&@r2?+_~I4ru=hs)n>gJ-m~wHq#v zCx(ZI!HOay@qdQ=73CbA@oBKbLv532)J(wtuUJ9O6|L?W^uOZESMPcx)DJ|9?&P4p zLH-A-eoN)Q{-=-W+RIRXu}bv6Lo&c+Yt#R?EdBxWDB|Q9IqLTeY*51)xcYymj+9I9 zE+MoYlSO$MT0ALgyoV{YP(~f%-G%b0W#xNu-cr|QVv|R`noUqv^a%W@;bPbCEV{VJ znE&`Sd;CQ|t|0nGr_Bm8teiMcv79uB+mD z_Uze<7tXyYLT+wuG&D4asMUymx!&F;OI=ab;!&q8e z3_L;ZeZ+I58A@-XycoO4A6<2AMPNaq%PdLGt;?%SnF@zTfI4pK>YZw7@f>@@xlPYd zZu#Z8wx$Me1V!?G3rY9rOR}n8(qRZMcrAzbMFUYVEe~gquM|Au##&czhWztrTu)W^ zD`}Yn~Z#-XS-3UeEGwH_)gxw0tc zYfL?HgY&*mrhQhtYCT7C*uR~$djG}w(duw|P!(d@bLUilQ_Coi#$q zn%NCm$5d2(^l09UmRMm+O`=DG&a01RJ<6%VD{%Cw+ajhVwO97rmCxU;MKd84D9rA{ z{O`?DVWrb7&wuIp?x3+Qv3b>@C9Wb&1EHK|{51Gw5f|_BX*R@r=V(;ErS*k|i2d$t z>Fn&r`H4OP;Q>kDByn{we}8NEFCBy{)7PRxYkiTN&$--6|NVjNiRA{(PNeV)>Gj8= zqW_YH^?xGUP?VZ=4pjXgSAd{Qte?k51rs;>GIOAWC1#%b1Qu&rtV)m zYXg~Qcq-i@u#Sf}VG;N=_hrompINtH%-|WNl$I86PM5S9QGM||J%i1Z8Agf?j1K3g zNc>x1wJ0h?n=HWsDS5fI>eG*uFTAQ4>_XK!+Zu{pijJQuMU0R6dtK~hmU21C^~jr> zk2mHztn`pSg^m}*3d5yT`dTq$7uipS<-)lB(%P?K09>+Q+~-GEX@$N#cF^? zIIoEL{1_{eD5Aj8-v6pIenqoJ8?&rn)GG5`*em8mPlB-5Qat-$%O~ERnjM=w$f4({ z;U|q;%@G!}&T{L_g|^gyrgBHzqR#fwpu<<3h3m;zRyww~3?TCBXPy3Bbc>YLV zR9xy3njEntijo&W%&Ctc!Xdw65I-YZ)^(NQjUDF4d2 zGxq6yk;$X`KCXX8j!TG`NV%xQR#c0Eg4T#=woB$ zX;pE!o$g9rC-c6KsC19Qn%oiu(ZOu=YF`1)eq`K=>!jVg>Kyrzmaurcw!XKJmaphB zbsnY68N*RDZ!i!g2xgz@>8BCGa4WH9*}a2apXpRtcRg>nF^?UubhovQJkLGx9q{t) zsprny`SnKcRIcvq)Rr6}&aeK~xLh$PBN%(8FW|a0HZsZ8f5ykl}~4j(gh#&VlA6;4%K6esA8eRFY5jH7va@%W)C}~iGdD4DsB{9Se;BiT4dbG~jGstgf=`$JR_f?F$bL!P3lthtO1 zF8cgde?JRgsMI(QU(6hOaqHF`n|ar1R8Acyvg=(t9P}TRs|6F_dNl09+7%}}*MI7! z(m=XOP^t)mM5u(A)R5nJ*4F~6UFs>}xBOVZIEfbOZrNVz?m$;RBi3XC*W&n{jo{1) zz;^RK*{=TON8V!ZmtorI+a})sS@ikc9I?AtH3M}u{x3A(%ik>%m#inGHYg1Tvu8b1X|d8aZ=^1L#hFA{hJu(e=LKO!<9L^@LchJ^;>fNh<*J7%gMAy_|eZpV*SPH z8l?F5hgV;+LMHLweeRF`b(1l-^D6L-5o13=nc=61~Qm+pt_{k+gf zcduv36!|z|`32TI*8Hh=Kf@2JuJVdlCRsjN&_W*zdk%EOwCnrmp7r{~dbq=d5vQ)* z@Tad^dy>xfcxH5P?!ixT6pMyLen-j6^$S|Ax6|paizvg|j|Q{O%posndbqvd9kiD3 zjGc;J%>3i>Q&0a9Bo-*Xc=AyZ0R)4tevzEJPj&qAOyBRbo>4l58^f9^BN5hs! zcg9s0mXGxSXoWl@E*-q&&RNm6wf^zrM`1(czhM9Pj~=f3c4UM+y$RFh$-FOPZvUy- z7@acoq0m5Dh4=}@6eTI&qU}pc?xdNW^n%D=2j3H*@*+#lQMX=*xEV0r`=9t6;VU(R z9z!qfEDhQH3XtRAK@n|7J$<_utF-zGzQX@SZ15BwJ%I*ai1Q) zUF+1wPLaD7NWQuMsIU2a)a0ldAqy58_v;==wN&AZ8;n&*A>B#|xYoXPL zcg^|rg6ts~gR8HL8uUvA8$G4AH+HTPJx>u$V34d@y0~$}RAe6H&uq5{_o6^;f=IP_sJp9#Tf%W`}~Fzld{)waKUlToqI#N>E$ zTDQjjyd%c>WD2A+)4hEw&x_C5kn+u8%X!Y;BxT03iTu6e?V0S}lBR%5?bN>f3wD~N zrM(4@lXdQQebAeRhG7vSxhZf{TYHJIY>4n)o5=C%$kv_&#aNkh0XwEj;+?Oi3T22# zD(-IIkpSQ5iJGA3N(bkGu@|kl6RF3<+2FPvp-3-gz$6Q_Iw4ut=T?kHRpa16TQp&J zXIxvv)$UeB9tVeTyuhf#yx7(YrWrShe8L8I;|tgBjxpt|&+zk^KOIu1nc>hfpt&0vocKQ3{@RdiLO7*9||74$1LH}W2`YR-d^{s&x zR^__AkAC6b@j*A5*R#B9oNwIz)$hK9wJ0y#E^R7rCtB)4E{5~{{=u>s^=6iYBIbzo z?IGS|d?u_BFE93^S#q#algt-Td=cOxa81n^YT6e**Y77>nz`4qY}}bb$+s`d!*c@& zR;2w!u~2Rgz3VhQ%1SAun>MLVNa*y}#d3tXfw1k&UYlo)GDR6TG4@6Od1EcNgc=3} zHym$5WtnK2zNmJAJx`vMm7NL)Abyd*5kyOW(_j!S{Qay%5N%4<9;S#CyJX)8F!BTT^cJ{I>_$Y#00Dh^@ z_U1n-rt-RgP@<;omdR1HTPv9Up@iD!EcTMqGfJX6tjsQGeJ+~K(Ij9a&2M@GYvfCE z6t(($$^wQ0v-3w_hS~D)yhDn%o3>{&Fl9@%a(1W^10g|*_jsCVZ&0tG10b|EC9M-R zkeFfM*XB2~rOnN4E31#oirp7~VN#72+3uSmeBeSagKD)$^a_2*G`Lg|txL&G6 z`o(pPYeqNEm7G+wb|2m4ee_U|EZKR@;H7lH>#}dv%O;m`-M3T8OCLyJpD zX=4xbPVbl<&59=}5%Sab zZXQDceQ%ct0lv$7;}0XuBHf#w{jmg*WVIYZ>Wi#1N`!=}iP5@VFb#o(6uSX&QR9o2 zw>Mxwt!!-uY)$LZc?T~6GLFI27M^@L+7Pfk?zGT!pMb*KHAADs!(}TFuP09}GhZ)R z*z=Tnub2jX_;4++{%m=DAX8Dd#+js3z(p-&36qj6t=Hlj0)10Zo*o}C-oX@yOPquw zKlENv5?2q*>YcTYQZg|`e8uwVIQhIf(U`;$n*fC6fx;s;5K81^I^^W0f=AI4Td$zB z>c`tt`T~);(s3SKOs`*gld&1(Bv1X=nqV#eP+YHDW6}IcEUmC1UkK_AdwE?xa({#T zG;myp6ICEP46{>~EuJ&G|NG zRZ92hNE#DMCAFie zUYk=$9hnX;n;e3gOm`r2Oe0AEWtNFxmNtpnB^S{i&tNN+mFTQnk4~~Dug0Kmjw5bv zt>iZufBrCR$Dcr4Zf)1>Ogz`-vMg=xq*PYYqY$ZgDbl0Dz~O&DoHb<$((b!BQ1$2e zt9PLN6Y&j`@`8o_ZAljIQ^Wn${;3+LL7Txv!=kN;(b0}|jrSQK>!@>blB#6=3R)li z_4fwjKL+{m7BT=u&np%6G*c3M_<5K6=EEKph7dY$Uk6~Z$r(}peF4_qO3%Z?0{*gu zib%7Mm6%yl{9z-pf3}T48kVdHC+egjb>X5^DA4*bYhhxt2tV?pbkErn&HTR;tR;`e z?AjRs^(~ASmq}3vm*v*4x3;)hh3MpTmY1BYXX=;lpLZv6Z!fe4`Nt(CHQOIh$E+giClU+>(O z;*Th#R4|u{ZaIw&g~Hl9@UhmDl0egetLG#9WG$V%!co2shjDQ5dskRwg$+5onL`VS=;%t94erJvNQ(;@pI87G3Hyvf0v!Y>T} zZU9x6s6W=*0i$OBdG@AHCfx=PP@l4uYC39ZlP(-=f|jxRAZHwpDYlJn^Ro8l2&>8vOck_7otsOS zE`4^WiP9!f(A3np0K|;BVQrbVBZ7h9>U^uBBwMD+NOZVC96E8et{j%}NRPdC z1@@@;S!YGgtC$!!|MkT0rApe9Fy$E=`v$YlAb*G?_nsu^xm<}{ws-t~b+E6bHBMSs z=v9zU;kNth&(X%tLj`~M`GkhHh=I|;Ud@ihCfzzFb^D7=513oc zpAo#3tK`_c^=%OMJE1Tm4eNyNBFV(lWr%0-5AO_GsInESthe+Wux^eqY z_I+I44jBM6I4mLG%+9U6We1w+#5-?#PnJ)31|uXuD``8nuqP8}vzqVMsc@VeiH&U3 z-RT+kM!p!k7b^U%Y8$UaW*E<{@PQ1gJ*M$CSCEMS4$)vIj~$O)BsO#A91AK#ojU`+z?8Vo5tVeXtP5(kJ|8Rm(2H)ejJhlRby@3K4tfI18cD`tP*j&V;dcYw-6t40M12t;8|1BmaQ-K~d`Ci$@ ziKPc+5#Zz~KHF+n%YV_B|bvqsR<-9{a6xGt1Ky#NLP z=KXw*wK5pmUs~k(xkbepp2%D=PzoVy=p~8GFA@TEEy}5Js)t0*1?d%nx%j4t0gD4vMT}@1z`;YKP{hYGLAeUD~>i~ymMH@8 zGy47MQ9=%u@yxJ*CV9n(#=cBxqLA?F@; zE9G6-_KtF{+dby--Vi5mjtSl%Qh#1pmyz*V51>67+A69c-e?PGZ1AVF^)E_b?=g~& zake&q9>!cQz_Ya}lovh9eV1Nfs;H!NB2#;eHqYTct(hEm??YIEti>ZU8A&XCyN_KVgu$Hp8 zxVS-eWPu2c95iOZ0hvOeb{#*+0BKWIpj}%h(eugavl4kPs32_lWmzy4J#@2{mXZn% z4*utK7t=-QS&xO980KtAk4rmT^mk&9$xbFx`6GfntjEYtf*}n`Q#lI0+(Kj)L=uNA*-y#Uqd%<$rsIN`ipAm!=MVbhA`RmCD-La2?|2 zX%YCoI7<_(!FKAGrIiDmv$nQ2BSS1xiRe;~U`;N&f97f_Dou^oPHC^XYeqsgJ@Z8H zq$xap`9#`tk2P%LfjN6U&5F$Tof+4e)%qR@qkr%BUTDRsWD4gRCN{n z8SiWH#6fbTrklBFO1h|Fdhl(f^U0A4aB$HcLvw3An5K*O32tnxS~)S z_cW9BCl_fst#4jjFo~uqBe<+^F-LqM>Od76s?h1k1tJhk7Yr)%kYCwktJWugH8nZ` z2-)649X!hgd!S_{yn;0dUdLHYy*qFC8~hqzq^E$ZJ4m53@_Q?;3@aK30>RdgH)+=9 z<0~AcrRChyYn29!WmJkV4({=rbnmC%yop>{7mBWvi-Dq3d*d!Z89*xsXx&Nj@7Fl~ z@HJt_1PKPnd4})S;&5=ZzcUWuEaq1_m9yHQ}G!gp_OnC z)%TRD!u-$6XBKBnZf^>l$-LFUl6Nntl(D*~3z2_c@slHuB*Vvbd-SCN)l3H6|1l5R z{PO({K1qAv#P|$tzulk`Ex*BsOS2j9YC014B{~Xfb=uo;O)_pT`@uUVIN5%Z6@miIe zbVaksCZ08St`S`b(iUi3ND<(>mitH8z01b~yd|N`0Tgr6pgCZRxk5Cn6!jS3qWNLc zSu6MYDZ5sF19z?189uIk-ya$LMIV%Z2#vPLt^!x4yzv*dgpBLx-khZTZRI0kx(|_h z$bX<^_s9#Cy$xuQB!&%#JCg{eU<_gxyl8%R?2A{0o=mslAOAFF(s&XvIIgBLE05EI=N zxIA2Hu_@o@s^8jdfC&y%KghfZLMDE3c6hrfyA;^J+;D(_hsNk?%{wowM{1iy{{Vc;d3AO~_` z0h9{)losummC66yDlU~TYa4n3*MXoVr=&eck2!tPnV)PMtzIrI%RKE8LRVcJ9h0*gHWA8CT?A)z8j1pqR8@Pa3>Z22gX2?4gvg~bK9C%INF z`$+2&D1xfesc;3h7VtX(&zWyZ+aM@ohcZg{%G&Q*w84@5bgueO(u&h{YPCY9*42>$ z{v+TGuS0lRCp_peWeKoA99;B2Is(grgCVbJ+)%Vy-;*OC&H>5D_<|f3zuB~wJbRVU zB?xRC;30$8$Ir;|ktv8@QQhk@iJEW1vJB+x7CXdVnSg5=_T#)RrY;ow0;Q%_Pn$4Z zRow@WCwt2GS1de4o!%SornZny{FDMQ0Ad|%mOJV+9drTN_<#!OGO-AdlSK)SNdOTs zSG_9pmh67qtEi3v2l4ygCaMA60e(F2L>6CG<%h702y#qSFBtDgYo=G5gdV@flW>M` z8B?TH(Hz;3i!b%-sQtZQ=|UZmNNTwNR0F8-gnf~oa|YEYfOt%pvLG-LHh(^vcR*IX zrxSCw&||)?m;RW-6imJwM6lKP9F_6e1w0Kb z0X7Ff)F7=H*xE8il?1?#_j9Vi;9PH|7vZ{H#SAuuT(+&SaFX5(Ac!zs5eI+EaJX= z+yc7eg`gtI2}FZ54iuVJDUieXh9molz5+=@wk{4$)LqfCNKv@D1*Kuz$MTfntjkEwT>$FJso-O2fXxF{C#H{vAP~~hL zuUur-aAD{E@&zN62JjTJgBh0UZXhL)QTbxfU+cu|41%F!5{s4@x!E>2O}yF#;liGbFlSKW}<$jdLFk`Ucui( z0E+0UC{2bdk*$FAmY#k`WE5-`lM z_Rv8ZA5<_Ro?wSotLYG1E~M39%^9NPtS>GSObx=3FqA%cT+JF*p7eFC>XXjB0#UBv zdH`8Wo0FZK2RN!9ow0L(`eIGilLiD61CK!|_M|Ewd?rtFCIG@@bk|Bri4MIx$c>lzK;HZyt zpsWbGi(osZ!+in*s+_3P7<4Nge~8*_nEd7280Ud9_IAlraI0q%)q5V6nw7!`7~v>s z(MX7#2|ve{iZ`eygKdb;Tp6G>BTr+P0*y*JfVoz#X@+_I_2@B`^!?h7Q>p+rLFIt` zHR^cgzsG5__FsEEO&lou-5m+&2u9JHa}1SNV7Yb&{Z3^qnqs{fB&aMTgKWb>UmG%t zl-jyH0}oiX7=z`5u*A`e0?Px@?kqS9Y8d&N-qnT9)=NbG$>)F;!%; zoMDT2Qd<-XcL7fVn{}k%W=A^IWQIB*i8hW0CfZ2N9z*HapBtEUm z_XBl&qn!< z^%ue9i3Xp*9rNT0Boo76YW(+d#4rU2@UtrdWbKk{t#D9$Rur7~MMHZdrR$(f1e2lQ z=9!*ecyCat7*^^l37DEN0X`kz>W4atPOrrMR`nGXRK~?@jq+l`Z@@s#1J(B%$+3q57Jl#Rn=_%;C0jvVkm5x3)dr(THnxh1GAqeu0+E-dlPk=Srt*1iS9uFys z0@I0`YIWqUr5$QMSHJ~^#P58J zoe*g{iNA8D%8w7f!T7SbZd)x`%kgM_m5U!m;~L|U9*@2A#%&3ZXIGE=-A3jhkj)87 z(~A!$L2CsdI)K2^0K*vi6Hv%8PlDJ@-Bv-CO*d;)A)`tlJ=kotb^#lKFC%2lmn{SA zC$h_0;!G^k!h!S2dB*@mG~ft8iDz(Q7XnHKdTIUP27^;cX=#+SxR8RC&US!&kluO} z0L|KkiEfg(~Pu=yZ8|qEQ9T*1dahxT&3o3$8W9a97TP9=#mG` zMQL!oX{qIU)g9Tn>87XsoF2(Y9F94?@=*&R5d=zt`w}BVaCH)ZG@wYJf(ex8 zX~RX|?f#IL0>6HX;4Zi?*>&7P##eOsf0VUuWX(p>d#xp#|n2r;kk3b;mAjq z_8TtB-dzunICObkI0eiEWK)Z;B7c6%1Wv~+&c@91HVAS;M%c8#U=*52KYQ)UfHON1Q9w(Is09FaU$6JMDA4;P4~i8bFfKF#SsIK zX&vL<+9mnWQulmbPud_*ASBEjR31{(3o1`C$nnVHEds?`Os$Oa{ov(25kQu-c)yBoDghFf8mQz^1uuka%bJS=ItbPYK=p!s zYB8`vzSafM`YcuJOQi9D9(=sZF-Yr9y3VJ8oFm#0@*s7kA5dpt1Auk|;JjRjnAeF- zVOrx#e1*5vwxiAeUJNK@P~lv)1vS~g`ZmlyLgVgzfntuoi?9NSFAN;$aU0UPsb^xW zmpVBTmW_e(V{GK@f)Co)+u0|k42ayevx}^#lfANmX7%TH%+H4nTrUg3rEq-++O#Ehu>aN{>;iw1>x8(B_BQbAD>DTcQL28?kt#0d)in zSc{y<>;|mZvAsb13%!XpOO~V-zQPoJQP;5+x$TZ(VstlVUxqFDylicJqET?nC^+M^ z37PYFA=vM$&N%&~DSRF^>sb=y$VNa$0l^J=`rt%J`4aCf6+&y#m{L0rH8nLoJv~r| zla!QHRaLz#w3mxy1}R6s-ru}UW(q_Z2r=2xeRr%J&~$iM8`CUXALinUvh_IfOwR82 z;LUW9)y46!tVJH96N!^5h{J8cMH7$X&Gz7XG4vZkN@CWykdQq=G_ksx*f%PM^agwy0m0Xba?2RI`5jPCf4 z)YW0T13^GNzU@vd@5M0oXhp=O*VNLdTLV;ew^e35PbE(C z(ny<>7)3FvhsY9Cd>J^80^ki4)Qk-ftkM7e+e-W3 zXhBF>vgfneD?F+-erRMNE;bGh4i;8OXsC=vow##RC)m``=~XrhDJH;+SSW?82h>x0 zePLV-0@i62hD9ebZU?}GC#;^?=?*)IUpfQM9A!P80`H=h?V1GuYtrf8(I*niEvf0NLXGy zONq11%*#BNJP`Z8Hc-3GhCD%R5Dpk`%lHNVXK|37T};_kM4e`*mVQPp|G{nFiI+2% zn*8|pbG9kjRh!72D3EQoE=p#$g$XiQuV}dUYQP;N;Q;bh0GxnoBu~p6z9xbRg2K$S zTpUPqvz(itlk`AcmJ-!SK=t3_<6s0ZfK|X7j&?UG{cfqOEHu48wkfvK#2RFf4U!KD zEKBY>$Z;f5kfb;Wbv0Y(q4au;y75GD1BUw=%n}q~wlUtVN2T0^eL6A(5+k5)5pZ5W z%^gvV5#N_c6IN9MAb#`^uuE{FCKFK}Keb@kxph z1vrA*)T_?@_sP+YC8y2|t-QsF6507t5&Ce(S?bkfsv8Cox~c@S%n8nah1)%M$ISud zDnNoB9Y+px^MLjWfSAMgNXz;n0Brke=J2OV*(E{1@i3tJrsZH)zU!~vxt2DSwys6D zO{xoU4}2(jZGVOq*LnMHH{?}~#}&d$&)r_ma35b)6i9via0{E8o|Zc82Ytt(1-J{l#< ztjEXqkGCw3jwgy#)OSWHOee}!ot;lywkOZ}CAPc~d?yW@WQZgt+!P3_b$j?N6*Iup zIa=)My_d0uCy3Vgp!}pMl|BJQhDBPne!$Qelz&i|!1fwxQ$xUcL(A;gXD4NWT{DQ~ zfZzK4ZD0QA!QJ1#63j~aMd?Ty+`%$D%>y@m7#RoD3w7As4|i!L6ohttWmQxfk2bCt z=>rplCRA&>7u$`3L!!j+u=3O!@-#)fF9vt&c=B@S3x8GJxEaSU5FzY9ix|k#6?4+Q6kKD)@hpJR_iZ-uaNp22rSS$18ylWAP&rp-~G^< z@7L_p8G!H+MN=<}P*J#wJci~d3Qm;(U;|ngq=j+c;XdRxj`BLMj~C?8LdRps-M;uT z@(J4bN@Ia@>4Lky-3?a-RvggByt|0!+S4K~EI)tMw}p#a#zs(txgRPDblaPo2Unbg zqTk%!7;M`Q6s>| zf;AqnYFARB6OHfptNpDSRn^}y7&ZRtyZ&Qm1W0Ba@2z8r*t#D4dL4fcwxw6@ve zO_-esdFy0p3Oh4v34DTi<4KhKSk2X>;Aqwpc(vi|^uYMoYE)iC_u>jMlg2asp(c;~ zZcg7lkU&9p1){;RR+{szD9v^hz*;c3H<3{&=7Z|5I6eRX0*YQH;D{*XdF@*0=u(f@IctHqsFq(;>Ry+^(SPoBE&6qP3%MVektwwNtx;WUo>mo&i7q`_%l;DV-`JQrGE!I85Yzrb z@NCgY$ivxZJvY_k*fVpAhyKsWHwlcxjnS1}AMb*!W&QEb?PG3^JJZA`(-SUm$CVOO z0_Zzav4T0A)c;vW#LP;0 z8kVk1wF-AlrfDO-Zn|avJmzRdo@f zv-g#DTpht^AMA7xqwNL+3D;a zpc8!mWf5mT`~P*Xs!Aw3&|k$EtM<^g|(^%#n6(51T|47Ri~Grh_@?nyp*0z zy%Y*t%VzzK)Xplt`_wckuBI64{nf$h3Yn~r3=QH~sJIyM{5?A&ef zOy)U_v+$)$jxXj7CMsdAirk9D#@`60Cl~5xSH>w%7lgslD5JxQw^um#{9hfGCMA*e zkAZ)0Cz>UtCU}oQc)%r&v@{y5u&Sl!~`e(ZSqF6vvviMUf6dvGT23U zP|K%yoGz5bVd1Z0yKmV37wyhpwYt8x4%QoR4_Ti8XEGmNWPww}@tW5c;@w|^fXG^e zt-p%&8wDM4Abi3a$}#R^oAh}^~UXb*8I`#>jMhx5KmkAn|Cp+sEYYoCd= z8o9%Yz`#5HuaHM?lybFDMjDP*`;(s>W>~Lga)v79tl}VkiYhLO3K?5yKT~ZpQ7sFEbiOQZKcG5GbMcgxfrD+b4u||geD~-{v z^qyxT7xeqnl3zxz{PYZyF1vlvhgq*A1Hdt;#~1Zp;1m;Rp&@>ua``Gc@~r`&w0uv% zWe^^*B}fqX4i|m6w@l={D|2+jN#s^Y?E+_ST2xbd%I@UVwmm-vy6R1!UCH!onr2V7 zK=Tz)gI2a!R80}3(|vy;qY>mWU|&$18HDkn6SaW*cS$aBopjyb$RlUili{}QvEssW z2^G%dUVgr?dT_4lW=dT>pu<4Ip0<%79R_NNq~$|ED*$-jhRkWJdrd7e%8QDx?V=B# zo&JcIn0!B0jKMGzj8jk5DrjzQJXU8K(e?)SZ1+GFr&UpWT&6m@^8nmC_NKDg2fg#q zxwB6|&4bfFdpoE$h3F_Kfj;yHiXB8)G{#bwbJgU?7AU%PTPb@~jhp>{oV|5im0i;| z3}PaJ0n(r%ASFmQ7@*Rz=~9puk?t@MX{19!q*Gd2q`L&9mF{jf@Xg-feZ_Y_@Ap0L zf7kE&$+^$9&NVZ~9COU95k<)-GGFPIwIhyGY+n+Yef7PnLTTID=R-fPMXiSI86}C5 zJioH@`=LkR@C|9!RCEg8ZTJauDIB;#@xYu5&U598>a~pMW@F&ad2z^X zr`x6sHQVCuILWtfzGH|E?>O#?|M36nivRt<#eMw4mNd*iYe&*mo4qJZtjr=Y?X!$x zj&BZM3&=2WVPH6~Kh@FDpmkZs5c0J5gCP#b=VLh;9JMHPvQaLs_&!-Ztb?!x<;9wBb*@1vemY#+i* z9%TiE?}uhJ=U9RqJRZAwP>HCH=^8a+im`Fv=bFoX_$YdwbgCOu(xH2WmDlh?L$cw_ z9Fqk`Q3E;t2N~hgM7k$8A_DHj+6rTyTBxwMSvrW};lfke;+fjB>#53ZGmk0j)zpu= z&~{MN>nx0&tVo;Qg`4oBsg;94Ui0IRQdcpjRpEtDIZz~9P&%Z$dwEsG9P($DAH+hz zu(zn#zGBmtgcOfiWi{Hp?!J`NrVDaxIwAsV)w+CJ`&EfUp)Wb#=In&?-sT6bM6Ob& z2hWk)E01)B9|`Nm^Ih=i&~P+WP#9Uu<;q2(Lv%mN2t}?n7;IYo%nK$px3KUd=d+${ z4u{D%!D2OaV%KAhVsg4(yp+)N7M-_@*>IARSy#{u`t3^3tEZzL(_vzHCfJt8a+-~h zInm?B)vLE1l~T7>W)4FuO6?|_Z~L^s{)q#M3Y6hjvQ>T4#&YcS?ymIlE&5T^J z^5V#d@z&yooRes6F(wuT*Q(D+MD1R`(D=Ov?=DOIYFU{PRDosmQ zI^iq$I8tE-uXrknkYQ_PzP-ZzXXAkM!4P4YY&6%sJLs|FmGiDVc$9;;L+8P4V3r=< z;aH)Imi2EG2k*!)mFv3Z#Rf!Kr<#9ChN|l|9}Qsa7#G zI}*>Wg%ehu)B1#J=gTK)$4{76_=GIQ$}!U`_(o~y8x~1Z`dLf`EcUyujJdn4cQg|) z=t+dJ#632>8Oy3!I&ik*GWEx*Eu3h3I>AUGS(G(nm_Ui#^~Q8bj^kd>@6Vssv?-l= ztasdZ7w>r62xCIMD{cb!^VXz90#n~WN% zW}>R=H6sb1y8ANM=A|cJwE2YP8bvSc7xYhMCfnRw8_{Z?cb$E8=HvKTvAqQ4g^5rX zT7fr4KfjFZFPJVp+F&l{z9q1qo2Ha|xW80pF?G;UmsEi`oJq=khwCKz{P*t0;F~iQ zWCHz4`dF;2JsUG)D|1>x^g`Z^^<0-_h?%!q>=M)hf?nb>YZ81Q{ObSD)s>=G=kz(L z`oLMc`JjZqQ6wlGi?8cUsoAsLJ@qZ6?K-1piVuWqgiT6TdQ>O&q7DPc*<|-D*^T5} zt>;szV(rH#8ef0aJA-)o^t!LF#zqL(?DK6HVv3{I6Fm^mi}9 zGBq7c>UY*EBtG>2wB_bUIx#c*?JX6Ob1!>rZ%bQo{@PriqM*R@xFJ2FKTdis*;}cY znhw?=#_is#k?Czl_Wj7yyK;gWT=jx7A`A9|%$XoWr(bOnp6%EVcS`di ztp-Ztz!UTyk&#Wl8|UafwOIcFWXQh;})cK_X4$CW6+R)Z9|uaUd*yX}+B#h5_CCkiZLLE1*?DvK>ndQ|{g-c=vkDWva{y4+4C}-IIHOKL~p&Ft>DW7@%bm_*d zM$CMGC+Z??vo1?T6Mo*(!;AUk&&Kobmn-F4X675|E#)v;snwN>d(zweVmP8=Kkb@* zYpPwr)_{@LiPmt=y@3kmz$~Tm_0HT+p8{`d4LdEUO4;w~gQX`EV5NpU|LB@Jf!X~d zMW;r53?;_*b~nJ5t_&EWzL28eq)VH0SnM7tL~raa|79xU(aE`*3kmXy%Ly;Q6_K{5XHOUDv_E zab|qMai!)2Y&|N-l=xG`udk)QEA)HsLn%aI*bEjw-u+;zE$q(k-|i(aQ!C|A9`WPh zP)SMZh#_rvXwXeul5wV8na|Ppgu8j$KHFQ`B7dE`<8??uUO|_5O|e*4>|=|w)L;xn z$=r&oxQ80?Wr+8W9C*L5F2!F~{ipL_&t!Z!eCUV<9^?J{m~^trQD0h@Z>p9A7A6Yr zq&k*$)+HTk9js1R2x=!u*Lk2%bsOb-t8B>Z$5qmxsVCi)`;K>@CS_**^8R zzkQ<{<|I@bz2l;|dX@EAy{Wj^S^KrG#Ba62xb;i(Fi?hDv(HH;9Sn zPUF}P)^kN@L03Kti{DC*jN0;k>tRFGcBqD*k9UrpR32^Pi{;GW&*mcsb9gBOMP{C^ zjkXW;%d-H5M9^jhZ#0Z{K)$LV0D+(aVgY?bod`Y zjKgD9=P{qqp7d~Il(UA$EpIMQyEBN;(cIuQBKkl6?-bhq5zF-PZ#B&;w_qm+1QaIP z`t+FnUab?je*IN>IaYkAJKhoz+vF)iLigb^%EwZgObY$|s!h^t(AwigGD!^@YLj7c$|^Teu5E2+BM$iu86YF0IbA6L0?N+%9%;y3=(_b7zwej9UTWfdl*R(Vh~( z?0CIze?PLidUe9HrWXc(Y`Tm!u6?+3C!*@zoq=llWhn;5;%^Pz? zXYibP?DMi(Khja@Xv7FoR2*!4Uad;@2E0k&<|;O2%W%LhG5=I*$d1?-U_altL-Vki~!wbo@48 zM!}&XUNRh@fn0sO73r?Tvg?X$r7N|yRlk2P!Lb{3saW{-O1iqvC6!IT*lF)QBqee6 zU0cLEqNt9~;MNt-A;GMNJQ#~ypBt2a^B+SPT5s$ zZRCk9pJ;msUYS+&J30v$K^P!=Hrd;fPLNN(`T0bi`!Q>j0R?9?)KymqzXEUaXbEFs zN;V}l%2;vH(Q>=8n%dwO~OgSh7FH&5E zZU4}A@N_DUx??3$8(TX;Eiq1qbJ5Y|F1+AanW&c7V55~X>H{jQ)vCE4b|>z)ecXHp}S$ZJA%Kv?`C?-p2Scp5Zmmxgx!2FI~ zq{tA=I)RtuG%dAif8*-8LL>h~*y@(8-Ad}&zbzJ;09|kRKZCs>N?za`&dY^qXSI3MWv*`e&&)p-e_Ib?mNI<|JJ1Oo{&lB?pAAdn6C=Uo< zdcCxjRRsf8h+$UE*Lwy;o|AJn~Xx-eTVV8z#!axQwlx%$+FV2 z^R`Vy+daYelL)re>f75NcbY$X^hB;xsD(RLPDt5FM2i+}!>XB<;&O|TYxv#q z0&kKurJBa@h)_wZa4y;sGhsRg-SzK=ayqYHBfC0##87X>KISU6|73%}DGIy^WH&qt zPYvT9y2eEyO6lXCG_oGJq6r&zQq=J@Xb7ILw$1TkrKHe_!wjx%kr>riR(>BD=~d#u zwR1o!yHi7W{(&TDZ_j2s{D-rwEmvAu{;>^aTMj5jlp zEGxJ+C0%6AH1!5=n3KOIrhGq@OX9^Fc%Q8DU3Wyq)2a~^;=20WBqJ?tOFS5;30uSM zwaW|0u9#YGK0X}M%@UJ=5KoOcb(7{W!h82=H7cUh_UjoosJdJIt3$RH29&j2me*&L zJ9K#6vj=%TKiq2+pwaYf2CCttKtIi7ns-XeI4M_L$-h8iSo?Ie7gLd(-#so!Hyjir`%E@%Fab zeFqEDW?o&47t5BXrQHjG&e%UI@%&yu8C4`FEBVK_iK8;tx1b2S%*7Q-&L{YTC-|dS z@Y-TYmInbDS@Fq}+fIj0skK+(L^>SoBux;Hw?>KEPlnT?Ogrk%MVb6%o$f7gQXc{U zg#a2SAvLpEDlqOv?Zrw%;~W=VENiKjkIl}`1@HIDAN(&0TF-mQNiGfh;S<)0H;IUt z*+h*><0e;IBllf!lTTnhB)K9p!!H+Qa+~fka=lBXO0!K~kOE3I4I z<2!@E_bfV%2)3i`ipE7C0{=in$WbuxKS9n{Y_*0F6Knx;wJ8A(_+EDZz(7NrFe^=L1h-lI zt%-?n!rSqUfxSgvxu5Bp$fTIV(DQ3q%#tg#^c;!XY^<@Jy)3eu3j;q3vy%Lz53Ag5 z9&y~gdoVK-)4;{!0h2|Tv)$#qN9O`8gI>{p+M|~EoiBUI%(MLziKVc&y`}Iw#0(;Mp_u}Y)jC@+M z;vdM?hw}aRV45N+*DCl@WBzB4qH87bm6RTCIHW#*?rf*rx;Qj<2G{X>Yi2HjxovZD z`lmwwJYZb(qHn8jXO@*kAj=xm|C_B-w2rB!u9tr>5&&zS>M5rXm#|0 zVjcfPYLB_2;&w_xB!2hJ<6P|6ySuv@&Hl(9)is#Dxf4yF!oMAxo7~nkP@vbMzES8+ zu>j*I7dEr$h58}iGJ^d}bjF_)kbw-3iPBW%ev+0{ll=Trqxec+UzPr?423^w7TUSA z7H!(sTee)IjvYV1ZAa~PojnU3s( z^KF@a3aV*;3=Zc%e<0}@3S*m{wlu!~%w`q@Zm6tm2*}Eodgb2PY(;HtTiBthxwmgm z(opXQzUnU?^SO6t38r9=WtM((6Ep6H&HeLG)SL)>)L55P0jyNuON=|>enDt7?ltf1 z5^`9nxtl>DbL!MiQbGntsju?g^jhHw_Itl^>BmyA#RK{4=ra^JMl`%_NGmDXP@&wF z1`XlVRSJ?_Q}4UuiiebLwcp3HoSVE%PF`Rj`z0{2%r^XEsjBLyQhtjcw_Fiqj9T&%474zij)92v+SY&v7WX>i>+^jWwG&CWW zkWarb^Ud?)7*YToTv$+@;Ud2pa}rMdiJ$}j|TQGw@4+}NCQ1d;QVGpRRiO7U_u@!lz^8^GcW@ZeB2U|iy2exfR7Ka8%XRFhQ z)!Pq9yWlCci3vyR|9){+N zB?gBPQIPOHR>g&K9c7tb2xjmReyO~CA{DAid?shSV#JJzj!|+1x*CHTTbRPEq^Ktu z#`3+Pp;=>1q_(r$$BXD0uU{A+RCS+cYPG^4hS#2IcK!l210JnjEAw>GonyzsU zHrAdCP%Q*wd9c6yyDf^psH=W|u|Gfcq2HOIL3P2Mn~43?;-6oC2L1d%rb~VEZCeDv zvu)e^_i3qV-m%Fnb=#IqU6KkUxq?3)6H=h4diDGQnMr|#aDwxfUC(l)jjkJ5*H+d1{-#R3S~yyAF3`82b=O zk3GuwyUoknJWvvvk+Cu6w*@>{c2>-f3A_AK zetCNofz}d9*xNlpOPjUWn^h>f7#5sg+0=C3=|qEZ?}5&V$5HagnSm_(s&UTkU0j&Z z?DA-XloM(4{p}^~%ATHLC{-g;$z(kGSI>RFWj*jNp z3sIK)_L5CW1%!c&($@X9yMw-|s@9+mN3`au4<8Zr=O?T(V);aDBaU67$z!zK8Q7!%+x2 z>)G*VBLS{rTC~cKgcYpPxoeC+vXcIhYEYr`!~h&fu(9%eY6mo8>=G~0frnKu4$92F z1pIu7bw+ANi&BdD_(mkY4DoPQZ3z;2TJ%Bsqeo{c`8GvT5^a_qdU}l|OvJ@~Es4;fU8faf(0l|=T>%6h`xr79aZ6=^90?2~lz+NZ>A8-u=M(K|Ts z?GQhzJ&CwN>x-XI%D?vA4Pm#+3-ob%`UQH0R&U}f;~NQd2M-cz@m)k=-X00e4|XEm z+uT@RnQ_@(#!aEQRWBs4&$dHDyVCix(2GeTd^HukggCQ6iPhZ5hUCiDY#MXv;ei_0 zi}92Z;Y6qS{_{(vYz1Gr4<=h)@9%MWl}$&EO3#vQ&>f76VaX#?jxv5m+SqvsKgEdoJXP40#NJGb+w;rq3#y1xzU)d_kw!gQ#IvKzczHaLQE-nV#09 zm2b2OoN#xk$?5-qqTiV|#VCwn5W2hjMtl4t_oak2-?EO+PQfnvnrr3pwIk8VSyy0# zi;2p(fWp)*U}~^<-kq&|P=NjwA~aKbHkpw=cDDUfRRHypz zm^Eo=vqBVaF}IO%G$t7<^w)!ucnVEHz)`_Slr|`5F z<@&T@q=Rn;j^mNI8qCio)YPO{O;`qAfI@(R-$E}mX{rj6#CJlUzkgSziXo^5q!%ZM zV7q%+}M zadLZfcQ-c9To}CD4fS>g<2RwbZIY`S%jWOAG*0@_z+P31U!kmrK}A*~du*6%O;Q zpPAYFN8|$jA^nm7gK^arY5ty{w%btt2X<2`deHEhFtwupQoDBSWfW0<^YiMo5_WmANtMHusXs&piHA$^~ppMNfOeFiZ)rGZ6{RrPJC4B~#8 zk@1>BDp^ryo9UAW)t->=W$S1K8QE_+$A9G>Ue-q-@aynh^iV88xW0)cYlo8R%FX-2 z2`|N>ANw7{CL1($9})2^ucLbkMc3UHprv`|{!S_&-A6Z$llWMSVyByf17HyK^^lu+UUzq&!+sa37Cy_~X< zqvZ)vN+BFC^ezikeZL1q{lTGy`;ts_<-AKx2wJ~IY(O?CB|G4{FSYA(x$fGrC9=~pj?)Z;!^U1h?yHqRkshWtgG z!61gqn`b8|gl2CSce-=Jc|jO4;*pRz>57zKjWQ){S=(IHH8$Sg9up`u)k++?ybD#~n!rPa&s01=Fy>(?C9GIc?yjI9I)^0Kj~Y@n^p(c#=?hIQ}aEu8nz~+wb|T zaxUL*`u>@w>q2sT)=Q|h1J|mp;z(Iz4i&@Gt)w;rJMS&tb344Zs0WC|kr?ztF#8d4 z(k?lIcVuyX{)_2|X!hhxSN7_7$SjkrQ1~=MhHb$0Sh;enthO>BAe##m#>u2tNb0n> zQ9%&H36<}>{(z|fWd~&g1McU#y3|UVWf4qSW22+j>cpdXRT|nbX9s$_`ga94P=2G6 zw5F|O_-=wl#VkX;NquAga`hEI4o-@4s0J3=WChaN7^%x&J-^C?kK#PuZ1VWjYdzi2 z-FY6nR%+H8==WJiX~xTCqEV2R)}e~_>I^Xg>omWn%$K2W17NIwage;yZvajlzkS@7 z1pv5+=W9WZZ_t9>U(x8SvBg>WgJ}FX+PM_hio%IpfZPGn$ArcYy{2-)y0#T0ORH<7 zM3=H}K){{D)^5gmrG1Jm?7GZ3%;4X;QByu8 z<>FFd)os9G^$*3ZEp*;|730i1S2Puk;_~1YIcb_*F^1@8XOn}LfY5a~Ev@i;&9_zE z&S-|_pdKCnrqKnDbq$q*BVQx<4;t{wvwzWmE!EWY`TC=*lf3!m?>ur$M`|G&IyvrA z3YOkaJ%_z2Eqy3a9wlB1Rmi8MKUQ6h=6Wh%Jh>lS5s_8h24r=?MrOYF-$;^1X?_Us zo3)Bm|)BxrzC{wIb!K91D(f3Nro`zoWz!*x$t8-GPGhTCIk( z;8ZL1&Mxkk+`0KFu4Uv7KAfwC7acpBpxYWr3oU_g3McdDPw6~0l*6-8N1rOzbD+Zl z^<>)5Kct^9C7O+w!edCy5+cGMcNu*U)Y>p8>bGf<@pwQ2?ri+up_pgxolRf9T;$>+ z1OUG(APRC*&{h;%7HRRZyfoYK`}PgQgN_?oL1AIi4}1nWvlErIO2vy!L>zigTPNi{ z9VG%*xvyUp#bzuFggy>Fs?HD}ygz?lr{zgzfdhq1xcnVGy?Tf^z-hcaHu8Tjh*K$q z&vLpwC9oS1YRgQqOPWi1T3yCUP^)f-enxq z{*tafmh2U$J>?QNZSsj7q;Dx*D4lYAPVepq|~Lb5t&M z6+9*cL$1nn_e^@hl*p>tCX_4kyAWuq8o)`hu>r2}xhfEChZ4EKg*^=?p)9aj@LW$ePM#2f@ zd`>=$|EM_paW-7YOHft2Q$v|_2}BZ4twI^#SLlk|PRWNvX_f~IS)qL~$$z-jf3QER zA8k=)cK;Jja}k%z0X_<>?4ZHQ1c$s_5C7_WHNDBH?(V&<#r=DXUL=tJ#BWT{9at`^ zqSikDk79t`?aJ6|hk*5PT&lHCWs_iSM8}B!5b7y#R$`;zrB?hh?k<(TXj^gw=mYo2 zNv3$y7tIs2Be%w)Uqf+oH3=8>vcg!X1j0X)kuU>i&&>2>P5q7HCUva;;s=hs1TXK1 z)xR>852hL<|M3a4OZ|CRTA%F2@Ajw~PCuHH2rZX3Q%f;@o*IC*Mo5BYFp;nuVqGv%mkh z_;{DglKG9cS3VnLX?VjIT2mK(dD55zqDo{w+NH|CGzZ~JFErA2w#upG8dOV|4k*(=oB0{E z*u=NAq@v3{4~P%w?GG&*>1h>Y?rArLFhTL`(W6K8EiFt;ObV@aVxUO5CrmBaMJ+z; zF#YLFv6Y2~FRohNt)C4Inxzt;-^!5DjOH;4lJ3p4cG|O_oHB(Tl0eiwuV0IbzLwYo zE-BFehg<5mnJ@Z^tRr`Lb4F+%_>SH_9-E>3<21_Q>lc*g-H~)PMHB} z^+&~c3=@>)PJ!kfZeE2f4c_u+YFm;q)kiI)d2L+A&te73py}HkhH-O^jg3KTva1Gn zJn#K4@~bsm`Xgs_%iy2Rh<{B2kt(#74ys5`PsXSyi(U;#m%VyO7M}*wKTNNElsoP^ z+ux9zBJHbWem?w2e;Mlo#L*}?v&7igYiw+6*RNj}OES?CvE68wqXYrPfwTT3zQx{8~#H*MKTP1xmOIrB#E<%->E8rMz zqg{cNib@~kj-XlziHwX)VbZagUke<2c))Yz@Zq0bM9>GD3pN&;ue%q``JTT%TxZwsN535@^EdeU$O2@HUugvE+|xA z^Q%8Egr1bn;o;2qn;qXu;`@+@)END>uCP(*)SzC8$0}WACB~2>x*R%~YG@pQDzbKo z_lP#C5@1xkn0850#a38>MYpeSBU|jnQ=Orf>D%StZFl(4eI?hRg!4p9jB`CF+)JQ5h_1UJ<} z3h*cxD0O2~Q`(HrYa0KC9w|BTH_h6wnI7>zDHRMnb{iIL0^LAUKyMG!vW9Y}EU0Xv zpo(p*=>Hq*+!5ko*ZqyDu#)F6Mq@L~sAH^jm+k^jELEnp{qvo+aEu#gdI5SsM#V_#O9v`Yb5u z@e>-h*xS^Vn}A9yRKmTXcC^b`0gXonptvRH_|B4T+=0=7vr|A6#kacd2nVTkxn>Jk zmcYp7h3GQ~8V&F8Z8H!^2S#pxa82!o++$>aegNBaJYjo2{ZrS@#934@@rUG+TwC;Pz_uQldY8_wB-Nq+8m-?vw)xJ)(Gl|o}amKJMO4D*^& zen4|BxX=H|xzq+3$H_T0a%@PV`euxcO`cRhL1%B%Bt1*WcGohU|6JrxX9yf~y%yb( z?7EFbg(1it;7?*q06LPX`;nQ{~L8Pu_?=B2=UFkX)>R!|@xs!{sw^E|zT zc#J!~JkE2(548%{7}SS)yX%>XpJfJ39@E%eunZt=3C~}+;NBeyxm|$bOEWY7rBFaH zC+PoyV6tBxWke|`VF!W^Rcz`k8i6=^CrMLo?NEk!o?-l zFI1q&%Dy+%%6SqYNn#3$SLj@L`@j!lV&qx#u|q};9!MzZYX92Hyd7C&JcAwBHLri- zh*=)~VbcJ!O${A|6F?l$x-YhN@^ADoC?%ZQN;+|qEfp_uhdYd)VW!R=Sk1IsaAP@vC{u-y|(b4O|OHA&=>;?&j2pw}<>C5X1 z(F$!qqdLC}Y_)luyOV+tl1@y58Wketl8l1V(ny(uQ-8YwoTY6Bqm!WGm#t>mauE{d5MErHq=gr@iv(d)6S&ZQd6``0_D zzCDmG8oAy7Qv1N(jVlM8+b|!$s56QNehCn?g=kyxz9f^zQ_l$U{~Z_OxYiYWcNoqV zNUP-Wd`^;*&VfuJON~o(4~` zZw3cM(w=s$IgNl8h=}ULsf#|(S~XE8@f+%v$e?*SN9)po_r*=YmTn%Sz9BThN5#l@ zy?|YmV2^a4l*--$)tm;O9Vb*HRtM~y9q744(U1haE6NIWo?}Cz>O7X##|6!uIpx@9|K~>1T_T3x&|< z@Ban(T_zfXIx4EdvI<1F$pEK`=GzvFioxV(`|1y-Dz(ZtLzzeq9)1!i(s3s`t<4e? z5<jXMLN@*8`LzN09VYZ#w5uqc-zfW!A9^^BbL*=amTqt(VccMv z>nwm5ZRTU_VkB3@Xp?%5?sK;oi1Mi(W zbxQjoG~CJ3P@Dg7_>k2i^L*`wvyjRZTMYhB#7c)3=CyaPh;RUhi29Pr<0Y4emuwD* zkOqxN9aB|E6xUz~|Jxei>?-9aOr5+J!U@s)c{gKcW4&0hQjY|T?|R`!B*b=UF@xVh z%V)M1Z0yA3q+W!-_mFJsebxdIx`J1Cq)Rhl>;JaKWCT6cLthZL6W(COEfws&84q?}lS4L=MYz7Y~3kMp|6W*p@u|wK5>2H-EVoXS2>)qx@|Rj0;K`b@+Fd2!CgMkfo3 zid!gh}dE;%ow%IffaJc0I%NO4QcpTLGf+w7>W`Kpnj z+rPDuwIA`-s|8s`WIYG(Lu0K1vs!XblwUI%i6x2}!+0%k0 zJzlvQ9g&i8ae_J7*;kt&14Ofgo!Fok7%8MVGoxzaac{r5n8#S=};(TGw+ zmRmFFw|;EUsV%*x)EXlsg79=`uT%4 z=B@SYvwZUjMzbGrlTaJj^{t1DK3#|VKsLp^+UO)g@0X&26>!HZ@(n)eJBy>g4VykM zIDY0k9A?Byg~$j2p2q2{2L)#0s+K^`JE;o%m=+s!yEfxhOafPjCHQmC-md{ZCDYh! zI{(+vlLQsC*r87o2(*lhr7i=HJV~sQ_P#LMXxn*cCCRSD6GEb-WK$C+Ya8TGe!cew zVi~OukqLj5JEtS5TbuhXqJPvybkTk~IO>p4KD_J9(^>bme3$nr@q(jU&YHjOmG7Y( z*OP1r`-3{b9OS-}5)x$in8_jpq4V$J5t^IMoN#SPk^DdFxE#XyWQmlrlm%>Ad31XMV@HpPFZ9D4}iIJ>phLeWxJM~BJ!=7JPs3@?FBEam0P z-}PItSqBZFx_kLb)wyJeAufwvPwnCbAzlmJ${^jz6_qf1VXKMu8Shu7;bO*KN+QSI z56X-XrnV%Ys&mrj5cKjh*cJ)Qv2jEyM~ZV|O?|++*(8|3j{$KJEpgscP&O)dZO(G_l6J% z{UNd;c`jSIrjfg{>fXbVqa3X`0jJq)<3qML?90~A$Qv$1SIWB#%73#%okk2s7(?pn z5W8ru`?};1Iw*?2mmWRF?AJz-es5hw5q2<6P615R1Dd*N?A(Vak$Q0&*f3Gu^~sf6<#P!_)kU~$&>(Bc`o?v3 zx;eNe?S@1`KG*FKucyaNa8F)=ZR8aWa!su~usnbF=n>Ga5Ya`K4Kj|#(m?PAP}_^r zpmexpTXc@&cyP)$R&eeHO0<(%BW$+xhqC?m9$_kUG=70rb{WQk_n5-My28Lnt4Ao| z!xF0BH<{I%1rsV9}gf5)2>@nc|(dpTVCY{%h^TsPVL+^&^kGj0}ud2>18DcuLocjFnou{jK6i`u21U#>FaOoOdvA zp&TEDFniv-W_)XR5}~!{uI|~!`RTOy;RmvG&6ZWf#HK%=Gm6=5RK6 z`=%BcY5iSy-q(56=k2$mj1qcpn-)co4LqdNonw}2b!SGTD$ACzJHL+pzQB4-s z6{B2uoz(Ag9czi(WlxUXIT`9$oZQmHnEVYG6=0A#<+C~ZHr{~Uaoh7eKOq*N(k}zn z`)g;D7unfGEw?ioTCyBqHL~0yD0krM1}cH}-PzkpH1;RK9>kO|^nU%x$}$ELM4k>X zP1&MWaWCZ!ynxXD($FJ#i!LJz&~eC@t{lzUK}mX5RREm;1MFO4fTe*M<__aU9QI!q zWqis96kW@Wo065B^YMPUS$65OvD@I?`c5K%R1czF;40GdI>_QxY(APy!3ZNrTopqI zzp}s}fpx4WQnL)H0sM6#FCND+sAj_7EX0~B>o3jjRA=ReO zR!lf*LZEG8^+%^94*J8eIH0z)a-);-^58ym(nJS=YabuPpPu%aL98D*ab2TBqG5IG zW_r!f(E`j56}wS%1*J!&xW7Ll6|z}4sj$*%>~EI`4GoYmPDN(fyf`kUF<=v=FFn76 zA|>7ghTh`&#U67>yXYR7p3Dk7$yL5km>s~Emz%Qvuys#p$bMrA&sZ;N6~@5TwI1Aq_zk*twcSg zc`{sH*y`nK0DyqRpR1Hx_|I@0y_nI*DvS#r(*mC8xo0nTX5opD6xO9@kg|dWS-Rap zHJW@Zee3M+$Yx^#a7(wK<>QG|P;j}F7`&k?KuX=$`8f9lqVP@*`lJ&>8qzKS==j&A zORjEE!BF~m2H%0fJ1$<3XZX3cUx;yfN%-`oYtDYRzL-qn%LG3k1gbFHgHto_qum2^ zP6443(*PG>jQ5y7=%~T;e@ih91>IR@T8w9(2MsA$+sqj&P%+Dw*3!Lvr)+_pd^>4E z_d?W*IG;l^=}HL2JBfe2%`<@UXnrL7Du(J1s4JiiD3KC}8=B7GAgsSRz2flTRYxMv zDKPv_)S2zK{reX&1e0EbexYjQhUF=YoxCr9IGiYwxfkY9LvO?6g{fJ10_o{-7<^A8CvE$Nj%SMOcxm3r6LW+ zNatQ0nZLF&3O%^00Frr<4&4YqSW0XOX=51}1FHwW0?PUs>^^Aug4709&`FT^y%}b8 z-N|JZUE&zpoH})Tyhj4Hdn`&|9Ny-Dz#wV@2{D6>aXRS5W3g4TCUU$SR7}IxloATN z$aX#%W!{~BX2tk1QIL^Vp)Yl4hWlt-OW^c{|5|hbCOZ@3rP4^VMv4CN4{%zRZYbAl zNvmuu4J(nYFSF6RDnpRv$<1q#FjEk79Bcr5VSe?3900;JKy2`vES;}3$9RE(vR z)eX6~p7V`W)@yNTH-mGwZ&TCO!|aAGN0GXS_3Q6tKL|LU9zjnfXAy!O!P(JU><6Qi z=sp#j5}$Gxwk`iBg?}Q=mHlr|SOV6+RH-R+Zxs;3dOR)>P4PCz<9+&+sOT76EnQB9 z+E?@ipwkL4!==WU49^*(o&Sj8QJ%jN)@mxf-!Js`Y5PrxuwLe-15flYgTHiHe@RK= z0}hYj_aZOq5yEq*R8-Bb=L6(&*mlnZFs?vQ6RI3KtgSIW&%X(*F4NBGoXH}X19)0O zceugf=jpZc$v_Q+@0zXw|022n7=4!-x>RI|aug*#x7v8`DPb6V0+|QIIMx1jbwH7I zMYv$G4HyQgV2WFu9qbjZ^v2Wc5c2>u9!FR`lo%lqRt=?m;PvAeF!DT)lArA4q`oNC z;u!#7JJXUKpMFiCz;7R6JC1Xb{)MR4BYG6QA;{xU=GTUu1P@sBm;j=bY04kEKvd_e z3MGaLy*S^0zeFe5P^(d7+N$G-KIJ@6OjxF5Toyfpu^?Q`(bcRc)s=K(>MOUhpyd@^ zXG{h7*CTSEZ|{DQJ58zWd72oYBphH-F#{iZMWI;K)x z`v7Y!uO*~Ga&-O@vE?aO>zB~(4c>+~#>xh|+<}KhP`t4zTXzSu20Hed)F)!B5#AEP zO+|$b5EMc+ah0x65f8rn6`=u(q)9@VbC<}SjVaFL=r1Gwct(id%Ee%qLv7_wfcT3~ zz~$0_JUJ|PJHi<_W)tFRAsp&H-jf^^&I~>92anGL4N^@`7Mk8wULShew4{XUlLl3* zvy#AC2Q2*bh-Exp^|$h9k?J`v*Fnn%g*1uvv)uWXSES>NiU8wjC+F$w z8A4YDQ8M%!w)_&VwxMse3QHM$c63VvT#Ek1;5gqQw8zL3f*=H+0Zx9exC?4v3Uma| zs3Wvw3C6gqZ&I+yM_WAuqOaAZ*nD~&5VsdrGlk$7u#eFZU6&yS0=O|K6l8C5r3YPZ zZaA?ta_GjplgBH=f|X71RtRu_S{J@#@riE&W;{&Hzdv-G6VT+z)l0H>f{#YCLPXo) z+=0MifF42AIoKWFe&FW{#^yNM60$d03Zb~Lt-P5vmKVQNeN0WS__*~7bxxmrqBr+N z4GKOo{?|M^q7PWykNa0ry&jz4gVLolS zH{Zkv*D5_&2wBeOSc&qqAg>KYC#KC9@MsUzX9dsB!{i5^T^b+{baC^;M+X4+)hzm~h0q?Z&y7y)!QafOQsj*bQ#EyzBf<4!?D z2aVdZbhLK>GWi5!Q`Ea!2$}$7!%#1(4m^7Y)vwH49}Uko#e)sYDvL^TTc;P$IKEvi z>8o-YWwP=yWTu?%R4pGHl+jZ&UBLno2jO*|mH32T{LcZ=9xBzVdf-mHs!3n;&lQt4AuWkQV z%7lJLPjJitqT#s4GGGj<0UriUem)lDn=OO+r*Ets0YCAEGjVLO5Ug7o3M4i5T;_+) zsUtQH4$aK49-O*#<;wZO__Xlwh+w+YpYT2GT5?!I)7*4jT9_mxS&LL|%qnzs8XKr< z>l0nPc<~1QWkQL;mxk;QsBb;Mzv#brXrDClfUWAw+2&1q!E!tbeO&#?k2@dPMu;a{ zcB1E@jcST(WQ^2En80M|#UpoJSw$&{ipQnstFMH!Al!?7+V*DbtaYn=i81ZF`Z^BB zPvQUJ>n+2oZkP69Ld76Nx7PiZpK!w`i#V_{FP94Y1xXB1N*mgnOTFV*der#%Y#I@md9F{(-{ z#(&gaHUF(@pxj4IV3Um*ZIO&xQ_LIUp!~02f0fHp70F}KA+tskh2>*|D##P6adJ)% zZO!4WdKjy*sRawJ6baI5_d!)7Zw(l=yj>w&?uxOqdSy6kg_w1D_5csODP3n9xompT zH1xir&ajCt=*H;ts`Za{^vS`?MGT3i@d$l|gwHqO7q-*e;x`>#i8+f(8%>{`9@lxF z-)pvHJuGTekBO398N1B=DdFfn9xqa8p{D-NiLN9ycF5lrj|VW&{?47f>xSH_ZDUcf)t{|DtxHp}BG|N7w8BjJhZa97dW+>Nfuzxo%0Zf@hiaAIeS27>jUZ_#=J z!z~C_EdTe?sfNjJoyYK0_mGO265%u&a_CNIBv@D0Ta?K46Fv{Jph0o-<^R6AGo9Al|Ht01D)?##*@K(CiO66N-r8BR8^|6AvMgfxi9+mr-R z2`dd7)`SBcsTs9fukdXQlyeCqY<_ci$0Cc*SD$Lyr8Nv05c*Ln!)=6?IrCS~HQw?@ zuM=4Z4#oqu$EuY4W)>aaughX0#is9F3C%1!J~&ok@Q@@2D!&-*oA}VX)pL%bw=tY&@>m6IS9DfunB9zc-t8Zox{p&a-!Bt#+UkCPxmNR_c`;TA3bu zT*}6k&mPW3eG>NDZD#KIKI3E~mL!P&xp^8amM=(Z!|L0Ot_F_JNir~$l{S1>#2K?I z56D9^%?2ZVFTx*})Eu%8YryHi7X|FjL~#qoq&*P;VG45mpsL~!sfv*;j>Qu1=fg5# zEA8gyrl~nlVLu1+PJ)7i9XIb36y(X0^VLjy*hE&}z~x1v-_!M#&%Zc>hu#!8LA5>$AGMIK2iy$qnk!e!S*BwCHf-%GG2*=>%r4BL&LGC1l$FLpeQWzc#9FPEnAIdC zA5i8TO0^}sxEIGPzFlD_6qENT7&_0ko=}jJlfzgI@6(gKygcZ=kt78u1S{t)I1l4&LqSY48y$k|0%jb>5D$f(xyCoA zb0oWK?cH1_5uTVus;BARwu-K%cIry8ee2xb;-r$s>CrwG;j!U$b>2^&Ak|qEl$2td zpH+I?Av1XgMlrxyu&hra3HG+|?SrQ)$@8 zco0Jq8E3eMna38HWxaO<$~uBgCMaAfJ%2OK5kW**>LEc=-7+{i>Akx;4wS0H-8FIN z)xcOLwiPvI-2+*A?vAYix|l6 z5)$R{e1V8XG3mv5La*!TWe&34#;Uc!R6_gn)fv-L=hWjtWTJ*DNuST~91u2m{`Pkv zpAOcarDG7|Be&3s`Bk(y)p4tG%dgUN!J@neVgs$6byAfgtsgS2Y!4v{muH@zh^Y3?BYNY4{o_V`b1k^Hr07MX!&nDkYhE zXYw?3BX&w8oTDb?CEu8PMsG-U(&!dVA=-?aoyR0WHW@ZNveIuYAc3#!K467FZ+`sO zPQfpVU)%Co)9gZmcX|fmmQ)Cpd0F8?fRx}d<@N28_T#GLn=Tx#F)ma9bcrVYYy zQ2Y`1w;1knbe|L$XbLK%OHT5!;9qN$NsO_o){3L<%o_Iav|ZF87-4a)^jXc|Qzg-f zB712y`(o(}1lnb;89i7shyocJ@yM+JAJjhi3kgSIenX2nlP`xHaPogYx4m?LbDA*p z*5nQQWI6MHJ}3Ts@G@gr0X&r`tS`rw`#y^ndJ;qLWKauHhg(`YIm!mhA0GDf&U|0c zZqL2yoM#=@Q>Y$m^@XS+Uch<;2CV2q^SBo;Dc`^Q80yo40Uu`!@U-}HxT-2aO*U(F z3pyyV*kLSt+B%*|e9Sz|nn4S^t2t~K`5b^?x6DuJJVrxXy_U{umoXGlXRuM&+@xOm6P{@FV{P40d`XwA~oMqZ1%1n@*$^IebLxtJ6YQK+crRUS6 zw4;9DHH+}eZD)FP#IPH99&9a-^l#McW=6%*MRXQs3sk?HN%W`vR9d>iLi(<= z*G*tA=Ay##42}zGj(znj9g+p@@5?mbYxMO#-j)@vT4iEl@;n?FuW{cB=OS36C9xFo z68S9V48;QP7F$@lDILh_@w1I-GC^@s>@=mzVcIz?Z)+iZ7R&QR@s+43#g`v9*QecZ z7hzaAcGw6=$uiktpV-F03^zKbe(Gv(^yJBtXV22-=ZZgl0_FRk%^ysIp+?)$ttvi@ zE+lOKNw5mMY1yJkg>ahKB{+ao80|L!@0Mzm3G!bg}V&Ko!F zh&N!?hsD;DZb72yodM^Y>Y7_tqkeaq3qF3fm1L%_Y~8 zA&L9h5T?e#QY$A8Bl!z|CNZYBj@0$HytlPm zI_?{Gc8lDaca$Izd74ucI*T3yK?BkCy#MQx-|zW2{6yIZF!H;;QK)BjzA=^J5kp2S z2T|Nf+3!HIupg_4u`{)`jkIPpzA>(iXPa~D`SzCf>35Oab>=oUBbf@8-RFpih}PBC ze+C&Hd!34w+M5O+9UZ3zUa~7rMnB7J@X5fiY#UB|#72Si7>-dqAM(@*+N=hb`(Wpw zR-*5`djI-BQJUdJS0{_TS3*M5?(9ZNCH2{9tKnC7KncKt@gS8v|0-g$0!{%eeiW8O zB&Z{nwh3POPr2(4j;u%DE%VfLV@CHpPmHn&YE(?R9IJ#7p~w{QMR}k4t9K$%!$HBl zY;0{az1SCqPLJ&6lXQ6<7x$p54c$&=(xtxio-+>&L`j{`6u6jBsIMeME&Q{esI|P` ze!q2+F<^JhWIX+QX%H3TuHg#$)d|g}OjLa4W~qNl;^{7$gO?q_6n=%`*kq4OW_%&4 z`uUqC0TFvQC%O%Ee-=<@_rPJ(*8+!a>CVizor~bG36_8fJ$3Gc{syv>wqnAog03(b z28WxNn=D@!b)aCDJ~su<1{IC6XjR_3i4kSLf9?7~W}`9&R5peRk@5Jn8d0n4iK4p=qE@Y%`;-;pD$s zBc_gxDz-#i_A*OcjK+%1+jU#cX%co?HM6kU`SBC8m9H>wU$?nd|NTIH1ueSv80IX3 zUiDGT1^3M^+1ct9T?R&%yp9-B=nzrpD_xtp)t|LHh-krPvA?p(xKxAH<104yc`VO2 z4&pbXHJuL>!}C5ZgU%_@8d)PYL4oYL)o#11=GNAN&a1i4pL^pjInOE1O4A+JcNDmX z)AAX5?Z3Za^ztQTcTS{axsCqGiF1}*tnthy=v1qblD@BBYaieg8`YmMy|+@X(r{j* zEiLy}=4t%n2`6yx0@@D_@>Q1BF(|29wF)r<-#38;8L{6)9bYu^v#Jzae5w6h<_sT{ z(1cK4q1-&Fct+Tu=K(8HAK&Xtp3DxRId9+^K*LC6 zFTQ)h@mFi3Gf(;K98hfSxC;x{X6rN-TH9l@DhBt@o6U=RPD#m|*IM_=5~nBRzlH9^ zB3RoFhCDJ7j_hI#jz=E8YXdL&E^xINdRlG|`Yg6pn!d)VOYK|t`qV2uL9grZNxOFD z_uAe1zEkY4Tr%qAMvYapUGIIe>~bw%`JlwYiwCoQ|MndDP|8p7Y?8_4?b{w2sv1TV zh%2BPK28uK2!XX3L*_&?W`L+|cFT&qE46<5N5Z-PN+O%i?ysi|7vL**c)2~F{qYGe z^EiqK^_#r|dU-L>pZOAtYhu#IO{q$!U5IkgDeaAq!Ots;`o7mnNV{J0%^TIhR&rXrzh zrk7%NXI$5L!R)TR-l1-{=Ei>Xy1u5{2hlAFOWmab-N`lN4|ONDZgi1jw<5DbEyq_ye& z+V^Za&AQmxp&*|LQVbxM9B_7I{{Rjj-YbAzs3AsUglLTaw7?i4-~G(Z=HiSx3v8)b?+3|`5J(0xjCIB#;@2!*;%{iG%Svdjm^No z&=~dua`vsQmJdr?uLOO|PYg*hZ5<|$5*+oXtzEr;%!|Cd_$P1PHrnkc+Kj4&f*Cbi z&Ha6U;QKIv${V`e%s4>;Yv&o^)-j3Jq6Z@^FW+ykeGnGy-kGyy_YN=FcwtfZ;!~W* zNqpRFSa^BO$I%U)k27Pj3M7w%54l%1Ub8iBi8!kv9?x#<9}YNqEaW(CoS(KNRFHS6 zdtShYgK{mNEg1==9;s94AxoORa?@*Kz4^qNC(rB!g0Fc=DEhnh_&e=D_QaKgxfsid zk0X4|weFThT-#6?lAEsmWU6@O8D>m*YQ9*U&B^kYvc!An0AL&lDf5Y+EZ=tTtj79Y zgXo$R*|@1CYfByCltd!ZrN8Z_?p?9kM_TvJ|2xf=p1jcWH<-~wA)ZP#q{D}epLfN_ zsx}QH%)HI-OL&Bw?w;tX&2fZ%vPU2C?o*ZTA31ki_5(Z#$;od;%l7v6KEM0;_hk;+ z7IL>T-A}n88(MTNm>Ri+sH7Li*r*!2gp6@NmT%#;1Z85S#l;>%?$V}`LQ`G2?Zf)s zZFRK9`!99}z(FA>i$N@_t_~U-9k1;#5^O*2{ z&OOZNk<0oSn?NpkhOmStF8nmMsVo+=xO?*Y~ z%1N48`O~~M1qHBwU4weFYSu$VMqxL!$`&UvY#R zYMI}@Is0+wQ;6(E|G*^TkU5eG31LT8>e@{YrOpu6e3#5S&Kt0;S9;VtSP(rVgm}Cw zc$k`ev#bE(me3UYV7jTVx4a!yFK542K%Arz+4NoYw)=%>+Ht#2=mpB}_UK^~(%$&~ z`>+oQ@g?TtvLypd`SS9s$LjjECM;>>)=DMKX`?t^&**1y=le5xzRT81w3i0pn0JvR z^w~U9N!OUe-~CQNtRNqdK&k2AVmUYGU$WBE{m_7My_%S+>oZ>NDTR8e#;39u=xMtc z7?pky!?7_bSajaY zVI%(bd3E}l#I@tJFNTK3onh{Zv^CY+UvV4TB$r}Pwd9c}+xJ?!nk~=83|EwizHF`KoZzD3`3bC7dA_Brd<{)9`COvKhSYA&N%Bt4erBv%2%RWG6NSo- zE6dyKK0H17zUi3vNPgMCVqN!*Mt?0wowQEByl)?eA;MDGvlMAC2;~tGrI7vR1$gFP z24*^aH!NMn9@Vm{d>MmXiVTYd2z5P#AGn-lhRDO+V90>C^(0qwEwiC0MC8lCLX5(0 zLGe@%<}_c5X<5ukF&Dt^p-WDLgs-(Ey~iOct3=85I3i{hY#L#cM=BtH;y zHGg*&4oJv49p85f(U^@K~QFJ_|hH6Vjh+02bAA?bFCSO#McCnS_#t2C)MN{)~ugOZDf73UE+({ATYXp8WR!MjpZt4nEoL(<&C zKi0cu@N0@z0)8e_J*_!WX=R#+m!w{7cxL>tqvd%0!NdmKTZEEO(DPNMqqtft&$ zwH*rA*i96gnhs02ENwTm*ZAmJ*)6J`T1V%xBUMqC{(=r5CS8{Re1))t{}U(rVZi*k zOtmvG>YD$h6x}2Bxv~zGuSg3yZ4-H4E7S%XJFyi&`U_um!0+3Yl@b z&4Qc;I<)}onfV|}?`x=X{BjK3LdWDUMZ0g*E%;XfA(1Re)Ba?s)q08OyIwWkrR0E5V9l(;i|WJ?e+qC_HHH7D3sExHY_)>5tfXAXC)RwZWq z8Wstw__S(^Z-S$RmL^QVwo38qAPOpVm0!xXt_rO<Yn4pXQ$xd9*f7KKJW)x|CQ_A*blIm==HO_`q_*pRR+P*CK!vn}tRY`tZl=GizG$ zCv$LQPNt{kQCA*}WM5EEZ47n9kK0nj#zH-f*vm>5KCw6@4e-!O7^C7>;(U4iZ=9nD z4nLoUmS#p6!h6V`Jp%*D?wxqA)K1?^_9{Taf>ZFh0UUWQaE{vHU}NH*(E+%l5%ogvP&E6!VP+TWaniJnl9tHnic z!$LaxsWDdxk*r^(Q@cA6wXyMFV_!om#MnHb$&==}V6ii89WkU2&nN6g0XJa4owsA*-XBI0t)Hxr{OLjW^p&$Po|q6Tj2X z^bM;gwhh{UTo?xbaldM#p{DBhg&NgS3iVDg;fGw47YQxBhiVa+dA7r$rR-Cbhg7hY75uyGiMQ!aZ15xgk4%%P7b~KlpP~Ws;R=Vs@-`b zBFf5wlC7rREQU-)no0S?8~kj70Py`@n1WYje4vn;TNpaxBb%(kC=iCfKiXO7Q??9K6!mCyCMG*RFw3^6Jq;MLZY%&2Lg)3_f5bnZ9f?|5t#NaNfu##Gt#<8|oDaW7(ujtlVgVP&v$&Eyy>irp z`Abylt=RVNzdeIp12c+WfW0vWi@(En2r2cxVH--r^%p1Y5`g#Tq^HypHBu3s*a>KM zNigUTUCihOZf}oE6WKm2CTpwUzB(G5mu;(a-_4%NjC*|8(K(@m~5B#I-B_@!}+#U4P`Y{4EjN(+!YWfT#1*3!n`hWe+J* z2(RBcB|>gY2r?jwV7LiFtDIA%p8D^NmRrh!vwd(*o!8bv06ib$#eRvl1ef<0j6;NX zSk9)=4B2PZV{2>Y*zzjpa4BiqPaqlchf_{AwS67!*=~aCfvjEuI5jmo&>@rOuYm5u zciHoob&SAmh{c+M6qi2qCP!cKlo)fLd#UR3*7E1MY0Q3Ix;EuDy%L+8c%Q{nPZx0f zA7G?^}xS2>5fsz zi2uq!e(;S+)c)uQfO)GfTV_wp7s9){6Wq2wn%8>L)3y%@2`TCp!n8{CKR6jQ)NQ5$ z2?@X(?{wf|jMInXyyV+6P{L2`CSJ)y6l!9j+Vpi_1Aag(?CO1-BZ9nJe#h|B1nYIt z`TEe-cA*bB7t|xfI7v;U_;}DL*81_T;o3w^u9@+Dt~`XcRV!)XM2)+Su5L%tp~d52 zy8ja&IQ&>!dnG?l=(Y(96KD;Wy#tt)-7q$`7067zvv!Kw$3lG!dm6HG?Su4OK6qYa zG_`$kvJ5Q0_5QGEE#Eq}Dl>E61ydu{->t9IB2Uhjgl`xvf)rX5yKZVj7f;Anv~=mr zo0dGMF3~DjYNGY+`tb0! zx6XfCzXL#R!2IoTUZK7ixXioi_VOyGMiL~dh@a1pYe;M9KPEB%{Zg18A!ZmTf=s12 zJca&?fX7Kd1*#8e1XTM{qKDfJbdXq=v}5QQzmlj zZ&rQdW|+>B2hKee1Ih#jxh3DFB4Q|g;5!4QZ&q08g!Gl(Uo?*cJazPKuaJM4hN+JSTRo; zqPmPp*iG}y#0kmmVx#8g6@p0>daK(259Z=Jy`gdUhfmPJ^x@Q0M>fE`R7TF|jMi97 zPBk(h*>K_f&}XO&KjpFX=)uZGcO*o+E~Ic`?KAKP+WxmmB>BO0(a$_w|DtPK(b#0$ zUmczGcu~h#@XTJwmh9rtHH+d;AvYP zEF2szeji`=RotE_72xJacQ0lSk!|O>eoD)-+i?LU3vS)^d2IxDwmN$7$zT012D?`% zJR_q>9(`4U6^r3v_6Ly^L#|4<%xd7xrKiN)rk!4l;@)*fv#p%rq;({%9(%t+0*RVh zOoIX?gEPk~qYGTJVMvGfW;^rq=i;m5Rjz-2o@~So48%-&*A-VEbuIJ~8e`&dx3`Tz zv7p2z|6XIGxiMD+?lE3A=+q$Ip1!hTuUd#FfW<*1-Ep^rwh(;Du@;%5^v%M3tZIah zY{x+5wlm%1><%)1TdBu2zfD+3KbG9F^Ul<_L1y$YI4nNd00hLJ&pDzq>b$ntOxHle zG$+A*;6}k6--D};*Ou&VhdU0T#g;HMgXy`aq8jo62u;nTD3g|i51e)TqqdXI3q6my z)W-7mmBE!`sWr9g%`BZlsXXu(Y6B&G|65snY=mmkV^|N{6B`>@RC*mINq)z`o5QJ? zWs8!Us%|GYbD~(i%K>TstlQ%72w%E(nT^R!ySzZ~bcsMnoq4QkpFm5^j{BfD%)fj> zx6Rc|I73>jYH8x=)sFQv|2V>&*~V-4y`)dn0$GCullR7mEL>Bt-vxEv zSQSVYX8HNFjEro62Ztj3(HPuK#mD9~8`m`Hu_=kieYop=i&;8VP(je0FM|GL>ktzC6njPZdDc&3_x0Bu!-ad@c!;n?JIw#aLrTvV;~@Cj5z=Y{_cf(P_3F z(T?vE$!aMXrweBE>^2`_ux4vJ*|WBc6ra^~mX59x)UIJ5 z4S}73@VGlTGV+gn=Hg|;_;#3>z|79pMnmJTUrEf0*l*>ud)kC=J6Mo!{OjAdD9E0z z^kmqtO^EvXipO>yE#{IyRx~cIluqEI?ZXB)JnoDhgTUCGaM8~Jzx;K$5?{(U}8%wmx2l7vCv&Hw1x}r%%^K=KPkCntu0p0W`FtapH z6+u8-RZze6FkGDH6~thH`AfF`N{|J2litM!u!Q6=wRu+(ZTF8VGJxs@sus13Z;QE2 zkZpE$))JAh=vA%Z()&3{x;EN(ArcD@z=8iy>N6)iX33e*iY4?RNJg~i0^#z%oUhNE z0Q_I7&qU}H2g4guYry8wzxY4YMJ;EKp&>BbIzCj@LeNPuvsQ<`;lI!_=(nG>V1XUY zzFPp3%)4J4Y1~!kW^h%G?Fj~1gT*hOAWc&c0D7^SA4g9^Dwe8}66gl(SaAmNtJTBlbTbc}bbs@d(-9wZ=TUFhB%riwHDQ&A$VirI9 zoRniLAaI`yQ^PmxOX7dY+Xj5DK5=WpXu1ZmN9+uYsB*|6{3AGKFdYi!uAP4P;1$_& z#@ukrhZOhTUOqZD0p36YKLM1O-hJM31p;=;?g_V61uO3)C1p0~K`||Ty`G)#SFHem zZ|LZ;diNio`+t9c9LQny`H4ZDKhU%?EnN|qB5K#sp%fQirgc*&=u({3+6OKr=%w@( z(&QO(MQ65VBQllNv&31#C)~s2|FA}B(ge|u__DpO6z&)`%6fW|jf^+}*SkP~U1mkT zbV=2XG~Xh7lOji74q6X)B!~72XB>RiABcn;5z&|` z+g_t7t(-VT3=|?CC%)+W}>A+iSjr~ph z`=qha+7svrmoAOkOo+UgdicY#u)@q`=m1CEVld-?O~|?IvkOXErR@0}- z|H?c1(C4rt4`yON7d`baw;a^uB|X@m`@r=y8JIH84%AKys(Bu>T88=aqk|o7dBXf-7z&8%McvyA0Pa^GF0pgyXY`ntRPcoUp81%*-Z9c}SOk5U5NQy_5BvAI$`Dq;fehQEyo5frkbzG8hEOUKDB;@L@Sq6rL;Ns$r;gO`Wr3$1zOjU+4>bsAv*Vp~j>SsU^bHsDio$n&Q z7xnMB!0f*hIT#P%DtnWBWJSCnx2pXf7WeA13aJXU$_es}wi1EdT5T*x{6gOa56n@Bv_F>`VRLZ*nt;s}1 zJ;l`nJ_Sq#TnoHULPj=eS_+6!V=F>TSrK?`iD@vD?q9K3FvJ8pNm~=|1zwWInqoW| zau7!fc^e3s_iT<=IxdV2e`_{>c>f#U{*h+BPU)8ss-hUp)81OoDrSVoR#%Fx?q@w- zegPr3UU&{XoOLf!q~+V{9KeLb(Dz%nezdkmHb0v~-j9+bmX3NvjH<3a63b1R5?Ryn zxZsIIV?scEzB}^Yb^zQ;B--DD_#V=P5F8ry9{Vf;qEKA}Ezx%;Kff=tos8`i7q4c- zMoCFOoSE@2v(ew#`yFn^g>+kDF9(|xA4_&6pb?gFUrvbUX=$6dpU@AIbeeFwDWj6V z2Gn621gh&Yq@)h=Bd|W9EY(k@{ zlqNblPQ zH{g=t2GXG2pZt-@BccqWbt? zd&zOfDt#6R5ODz~$8^9uxDV7*4y$k^{$&8^fi3iX|F444LeF7FE0`$YQAdwdaLwak zFr?5Ub&8C4LaET25L&;57|$*b7f#Qu#ZG$c&vZ|f8^;ldCvw?MY46K(6#hb{4~}=$x#+!g9y_YW-?lZbJ({(x^Mo16rj7D;#j_6_ zS1fV_^0O2Y27=`1@MsqA0Np0YQnsH@t>pFVs2`8&fXlbmE$!~^+OAGD-8Xip)N%~G zq$b*>K@gsJ?nVcI_>5COZ9HmUh`*A}FtoxX2Pf=s$ zilF>KWFEofB&sh8cZ-G$_te1NF7EC7iw=Sk{+^Zsmh?G{2FED}$zr zFr%-#+fLhTUI;HCoev44Lmi*b5OUcaI{6u!99wGJ3;!$HLkgWmdm)i+;PwlO z`vL+81U{)fQVH%2sk2+LhD_**gTq8+-})v{!@)oJo#Gl$H)T9Se`3MGK$oIe`~MrL zT^s*@12wVJqd%U9wQMX0zkmTIez<&!N7<(&RtJo{c(Nu`g^|VJP-*US*%thw(#^TL zZgtH5V9v0Ez2D`HPdN-v2>KZd4HT9~2Uica(?|GnOfX4yVJxK9i$8PlP_^>iq`8Vu zc=H~|lux`Q%IKw54m{srjJ_>Z2|ZvW<~&dU;R9L{MZa3X|7q!5R!+NP^6_Xlbh@xP z&vokW&&i8gbJx5U5+Um|dG@Y#)a_J{a^$3l?T3X`SJ&X$igN#?SFwKqE!-~}ggW~5 zZ6^TSyE9Ufk4pDdWzUUfJxj~hU-dWxG1$jP_RwEPNk{vGun>Ng!);BmO~|Hv52KkV z(ARDJ_V(><+v;B<8FF)g{DOpWAolyUSPynexw$RHUp$!%2-v1HVY+E$e?}gAJM>}w zH=?-%Kf2SfbTO$TiGA8qWdxr2(QJYebSebwdVOcd3gyGXEWI%u86JdpIG^V2usn3n zu{o3~Rz7)IZup|HR?5-QSHlhTk&iqV<#N}Vj z2$rV^PS9Lz(=XEujLbm(;gh~>`rXaz?J9r%XE5v2auKYH618BkP@no4uR zI-1d7_Wk?!uU@^H(xCe@n~GF?TI=cDXmh-~vQfI*lT)DRjcYOJHeF74VqdOu;8a^a zl#i)4%i2yRtiSALhY?VJos%v1?OUSFxtq8D%kzE&|-QChDl(nLLT$*cS*`b_{)#;iQBz?^CXFdB@Mm6av5U=cns z@XDTQIpyDhtS11Da7K10c7VNI8IX5fpn3B;~5Q)!y|kE5ZK3xY=Q z>(W4D!*_Iy$<)pI92j%Q zu3PYkE>1osHWq4HuH*Y|Y`m-lpyKSd$xETM4ag?Y$~gpTroc#;oiF#S1dzZ{`Gy#^ z0T6NDC>^Em;zO~FkyP0$(L#6~kak*KjaPHZ z@4Ak7B9G9D>dE=o@w5WNTETd*mkNF#IYX%Y^^rclEHL;e7U_OrD0^@C1WBolLe-G& zUuUuJp3HL@^Uu+d>qi8Udm@QE7K(mNDB!w3@C=(Pdm}Ymc@n4S=x{Sh6`hVa5lCf& z-!%g^`yHwOuHsT3yS2Z4n6?q~$uWEykx-|*-$=_zmu7u0Uy5goW3og0+OxYivfF#_ znRH$dIDXnWrIcVkT3h^5orobW^zt9=K6%TrniWfL?^6)R9QF9*WRA#YmuB*aXVRTV zQE7emG)5X20q70+6-SDA-?)|F(BtlJB;M|x@^r3fLyWu6n1?Gw2kaSxwcfK6t|;^+ zu>&1QYVIsmhb{ojz`$U9{P;1{(S-kX#I5sQ>x7!k>(?d~FL!?aF;#(7Ov9egD{-GI zV45uR(VESRg$5gXZ%O0 z7z(Bu2Kpai1wusnjZG?2(VU5ZO(}0k@ir``3oz>^dMt9XP$HAKjR*M<xdK6XaRk@KENTgH`;rKE<~L{n=*CD*I(AZE4Vnf96Ho~D>C>m4-rilRT%;xgrCaPDdNqv)Y42<}d75V5?l@== zDVI{jk+Ya*z7FucM}2MT%T<4AJ3B5;q6aUB>{lRv(swT(O1+?v#qVHwnvD7`YQ2Cp z$R^pK${)K*3^pCk{s(HWQi;)T#|FKKCNf)KEH{Z`V@X&;MG6#xKsf{iSb|SU`Yawk zSi9D}#Ms|;YgQ(FcBq<;^x#6ANJdG)Pd*0j0grL{^Mp9Q0yi68(c_1ML>e&p0ow`R zw{A~4O@E9c`d3lQb%YKS?SbH}Q^cvPbp0)2d+`LVsL_;y@8~Sbzmp;ozTiOkos7C< z@0<1eux!$`zx=kkGIsQHKq;rd=G5M{c&$qrB8@3y?oz^I2~eRL!!+3L27*++P-z*; zo^-9_-~zSo&!$&+@cZ-7K$iS1d=aSh;3C6IL_R(%(Cfc2&X~RZ!iazDOa z(uvv#1l9YOv%#Viz15LTE>gS6PU9YZcG6Tei(X^ZD0+%4aQMj`pz zRhnjR+&6zdD+Cov-49>%QKUz{rtk7FPzME{9(pDA;RTF7X$CA5d>)6%licKF4Doce z)U)#Kq%)|z4zHp)H&rJ0tJ}^1Fe*zISzd#k;NJeiJ?kJFu)yD(T~L7r4Cc>cvCP+O zyuJbOru8It&}5Lf^z#!g;>#GybfGX4Nw#Ayvy$VY`Dus<%{aU zx1$g*c>uc+>YM!wd>K_EA#k`#7Z}Qygt}Ep0eL-thqOQjW+?ki6ZL}6b$MLOM(%c4 zUs9kJWQ8I~C^pM51kML&xcWv&TW=4}`^Xkdd#s+Q*!q76>uLEOtIsNLm&{CQ$dD>_ zF?;c*m<;8Yz`zQlW>sN+hU(R**F%BES}#Q=3HB*m@M@$O;3Meb)~)0{%T35(HSg=K zGxv78E?Jz!E~QZ95-9GZKE&`jsOt2QRSe#L=Rzm4Q1ifI?)wYx>_~yWMoc9do*!ov zTj@f?eXo{oC~RV&8&^Eact>XM^Lt;6M)xQ4$p(t;HjpCVowJ-%@3Q6fHz4$8JN{XA z2TEd(#1GNB{*IN9_dQGuN~rynjZ8Fs0j0vTayR*M;mrV|J*6K(a~TizqYgy8Lg{_h zN5ULMjx(xxW-Q=&2i294KO%*nSAb`HumYa^ROih`h4rQ$uyRii6k67=5POGme<8#` zrT_@NsTMYI`Wxu=2OuEqV(+2GbXlSAc6R^8Amn365s2cs0Hy*p#s!a5hXc)6rV8_Y zBWv!8pqVxp7(8Hi=J`tvDH111X~#^aE4= z_MYXOp#NBvMT~jQ3fGt*wV5EFh_!4}{3`k^U>J1QQ=psyhSPVls53>so(q4Z!iXW^ z%cCK&J$Z`v*1=<)N%pcnlNjgtspKH8Zu9=wh}et8Pg{erbn!*;|vm1m}z?Q9s@Vi4+{T7xi2&f>-A~C-i$}4ok z8A>zPxjxwI!B1h#3&7@z{(?9>Y*2~_aQfmNJ*^%iEmYYmkSkw;7^yvRC5=I81@g8~ z(SD@|nF+b>tt~7$_5~={a&zFDF5Sb;Nur81Mhgt`5MFTM<(@F8UCpsCT5Lgq@d6+M zL@4M2Mz&h-1$9u=04iRyl@i)mMrYltnQ4>C!_-*2sBx-OSXx>F7x-m3`L-eBmL4i+ zB*o{huwE_!-q7ONikV==xnNuts~gnsjjVsZrv@M-ryxSE5yay?pIx94;;Fid12;gp z0N?@+J~Vz6r#{0+U{N_sNNH^F{Dya%&=S>`6V<(yKjz)zD*h&p42M{f@Z%D{uPWc; z3>2>eAB@sC3+ndUhQ+{@ZM}CX>I%3G|0Ly)daFN*-mi`{2=06mZvTa<9@G02&95_V zbfTI3QCy1&rAU?bEtwo3C=S3*b2Jl!aAL}~;H;HXSl(D$!0sAGl`EQ0cvl}QPP_9l>5h4Ti+GnuoL$_)&OH1Mag z6GyMLV3=*IBd#DVuB`j$Kn|+W5T`HY`H2LumB3AsKU)!0=5&dJNxa>$Y0*(Z9d*6b zzBO^BURe^u=ddpiGkP_=wsHRRcPZ+XsSjEB+wVbRdIk97+YE&+Uja7}_hY8)QRq89 zyGxE{6lboM)(JHjFbQ9{sZ&V*WC$prpkNyiaM( zK?KiGj9NxJ(BM>n`3V#k%fZD!%24mk*7nK+)WcAWBz z@%>5;<=hHRTj}`Q>Z8w=2hKn}7T~PVk#SMNOFe@rZ5roj(0b<+ef`{iZ zzIZ}=gS7p-H`mKZ;LFgwAeL2G#X+sQ{yV|?XLu98zy2h7J_BtFWN8)`+*D1V)TOdm z6g+vjRRHUUdC@Wgb?+KP@F<}9L)3tW^<-o(LtavvTdl)vu&twq8mmpzpCAm3nqD~n z7w~9nK2L|Yi8Fz4+tuSv{Kd}~m6d=S1$oTMO#;GnE4xm9=(qf59Q`kX_b1}lAU5a?Ywm6u}WaU4zO$Iy;j>a%mvq(=09py~I!iF>jZtj-j^3BW zqoEfoQGRn!bwftME;;Lp?ndO`06fhhv{l2{f_xlNB#!$2?R)+GO=eP~P}mOa2cKjM zs7I>&1VwjD8Gd0G%U@3UoVNV?Ps4)}!|x;}sL zp+tYf#cZ>n|Epnu>njYORVa13+;tla)-*L<#NXoZ6`Kc8^A84Oh^({%7D^+I5Hjlq zm=>}(Y3PABT_Lb(K*WhLHO|U}DxrkGt*y;|u7iY__zxB)#<;XZ#xO`DI3(G=^fKgp z`kWj=nZn>>n>$C**!0Emq{gzbk2W*Cr9s(b2K7O;^rgI84Gt9rc!9 z0GWn96Ecv#1v_Fv?gz-h`lT45KEuDk(q2wJ-VZ!EQqBiXZ!UnYh15ZguM;5Qc4s+R zSPEG1_@U!->d>O$nshB`KeQOwH&{QNxJFYfeD`FOJjZ*gj(^SDUFAP529DA=G5aBE z`d>j1`miJSoBq6wH-UEvekhbyH{;1=QeKdt{xkJ43m-3n&#oD?ymh`P6n#M1=gxg= z@bkV2g%OI9WOQ*Trb09%k%WG|zp+qNB+_A=1{^?F3R#=`B`(un7QiOclO^`PtiyD` zQxPj2-qIfyLs-Okm9zhwH_MZCrx2)AOJGRs0=+Jyar4e<6J*N4$Pt$I^se}S0~ZS1 zwhVl{mykXLPHcW&B~+q8c)5&)2Yp1$EY~D1fvW&(;Ko8R4Fvcs+BCkW8=DMs+PWxy zRaI9Ah_cPEij?HVgluoq14|48N;jdFT}%-AhII9wZWXfKK5n+OgyshRp$5MzEki*s za6>VFetI!bQm)>zZ~{{k+tQn)71S^gU499Uzt0a|8t)CH(8h#nPOt8-rkjqLYTk*m z+fVlW*?nZ&n`;synRGPcJh^a)sA2Xqoig74tpxa{bQH*-Ds8A9s>xW(maG6^B@0J5MH}1uPoRrc|^w}Hr zH$oLb5`oLM#Z-wo=kSQr%D=NZG_GMlNO*!#a!t9put(*?duxpIY>$MKm*-spsCX)4 z7?1=_f)r^e=^I@q0M!Z3Uj>9QM%?tQXG=T*=qyWRiD!_7EGbW@u1tRP_}|r) z|Eg3CBRLEw04Dv@H<)M8+x#2XJlEdlUe`4-DCg?A-c4x(@U)De>A4@a6NE_M@B|%4TN2x0dGve-i<% z41nb@7fvg>1%zU8XAao~OxY^=Kk$3Na1_bCJVyN{1OM*!njGr8;>t)lSjp4oi#ZHP*^BSC98^4q z3~DNEM@qIfW4(?#O_xND@8ox$bT6;nbt;fgFln0Y6CPD&3 z2tgux1a$vj|K;xv@e3ng=4@F%ZZ`2|aq$C^QMQ5A1;GlyquJPnYuEjjqFE1h_WrdC zB4yr`Zy{FS4|+Y}y+T@B*1~YfvzB#vgwQ;BXel{0~*+f zGSOdoA+b7;cQJYR8=IxMU|!ll({qSH8jD$x8ZwU0fyuBkUiDb4w=K`pe1Y!41hffI zbM$KelL;jQkcC4D_KuB}K-www5;VG)GWGqIP-Z=P>-&5p!O|eW_@$$o&|;yg-FsGI zFcO$PYPC_{`EoJ`@r>3pV`EhWGb`=N-ujcq_Pji#G_9+)-G%-fwO>Kp85S4R zgZ7PolZ@&WlaOUS*8Z^c!ya8{UGKumjC@@r2q8SrVwV8gM)!pAFR=hL_Ht1s39ywj z=(chhLTGeG3msnGy82fW1QvGSZ5!nOOB4L3X8;q@&2)WzW&%a9^uL()?>qHskLZGy zxJ4mLM8ay)I#>AEe(gY>jN@Uh0Ro6Pp3oNIaIY=0bL^v0k;@yktZ%mCvf>W&qfoE( zW6l}ffPlfAd|)k7X;y4^jA(c`#kjsfiHlt`AG!s6wo_s);MIV;X>+!7)v;5!U37f7 z?)1TabfytLPPRDGBUuCymR}@iiE;Gp!RWMxsF}V4=)n=Xloc1; z7pc|0k}<#rVPfLN?BCO-72v;~`A{`5fD&8x;vyqK~XxSJ2tJPvKz)gR`9|b6=}9Xy*@~mnmYUQCJPX}Oy`=~!y!pY5d{UzaAoPsQ|HC4hNt_h zU6eQTDjf`P!HCfQAFAnp`V{E?=N4KBr65r#Xa*MDZnK2?! zKIZ&U=Iqj(*?NHn9rN8I<>cB11FNnt4(@}5?sK%`X5ceZ>H&3;8m+eQ;pr znuhx+=FhQiAS48Kck5rFR|Swo(9J2oAMiXFdixD8kx8LLfs8=#cRDlK`3qk(@>FM* zi^gHdf?-8@=}Qdc!`&PvhM}k*`FWVMpRcs#XjG-7EgC;=e$bcNjTENna0neh|GUQa z*Ax~%=-$Fl`Uu0DxX*!9mU!>EMD{<$2>i=I;utlU0#NUCbiO){@kGJx9NqR~rdniM zE|;YSU@rAzcYP?L>y62%+XP!!nr6@+_j_e z9@y`#e2_~ci;9fKBYnEzu|N%go)M{kQ*L(9u*LTib_V6qGh81mdA2+*j64-6K6AHJ=(VBHf+3xs&+59(Tff zcxXjlyxEL$51v*I=Yj__Mxs2=$URqG4MniWOQ}D2(+LW_T4u+^BfVEO5W(}(xbf>! zWmv%NbI@g=_za}0q4pb`w<12Nr(k8U?*1Ak^X2E%Rc$L%$8(4j))l-E9YHjT312UR z;>Ut=_S2(o1EpU_{27x*Nk0OL#DlG8zAI!mb)K{E99`oF)EW8REOS&`i>S$V@!KOk z9g66>>1em|BpgNH0Za0kOt~**28bOL(ebcO zTb$JKew?T$2YsiJO$lj{76>UK*SOFm)3sOprGKz}zuZ=mOL%70`rcNE2Pt?@?>*(atkHH}jf08{%`Q+-%KUxgoMth8Njt0-Ax{A%`G1N zKH&QLP9A4pzck^9=Cx!x3xDOiJ$HXFi$9w~T#l{G9ghmnd%-Lc-D|ROSHYaFG{eb4CT#XQk09Rjsz{)TkqjC@l ze-S4~w&vM2BMFepY23*&e50Z1ImL3(K+y;0{|A$SQ_v5&RXO&e{VH1C#;f7g9^#+l zhmLn^`_tY?Sm0~#hf-mX2)f#ei#MF#Z1VRP^Sk;Wi!%65CZ8Mq9A*Jy(T#rMY-edz zU6uztYz$3yScY=!ruE?b@)O_+boRVN;teM8-*gUHN$;poUIM8nP={y|KXT2|YInNhA1&!$pl zEjX?G2}RDfxV7NLFJY1VMy~ebo8D>+u;PCgJ9vLUglKtL(+$gEPr6Z;MQt<6(u$g3 z7;dm^sq?cxdQ0$n2|O{DlbOk7+LbcX9CE&!yfRqIGdVBd$m{y&en7+0&}T}w!{z?G z0^N$Zn3$c_VTaA>CU}{w&uDmfxWuG$U~q7-zdw=B!B|!G_UWGI@g5cleK&&i=5 zo(aM$FD(4k+goB#?0$m8T-v;K6CNa#EOn~ac%=wozrxLM1N(LVHLe0jW9 zVN|IWqMHe(QX#j%nRX|KU44Cz0=gx%*@PWe3bvV%8~wbVZgy5fLnFU5Hm4w!&+x~G zv9TvxJ)@(eZEb-`tNnReu#EUDPwulugon4V5r`LkNH`SW=fCmhA$vndJWsFI#0$lZ zsi_Aq+9FTRKb4fEFR)rvH*yyvG zjh!|oNN5R>$L_1aHALjif5yov8(#P7YWXFXRKsrly0=7L8*{X@&hvPExMZO_ zUE2Hjh{bOF7itsTM~{9?*)CRyxNXgw*4IoqNe8}q zb!qvvPfO8g7xv9WchC~j<0x?=XXwLYz@>U=F6~n8s-Cd&-AdDZE0>d($SOz# z>t&5)nR`@U%GPc*a4)w-F$M<*U%h%2_A6T{(S3VYZ@S7&TpaCGOdeACob+MdY_G*JxxDQ2u*7B`wo2O&BN4L z1qDULR+n&-&ZPdqK@sn>C#$b`GrN5PhhRT-ZE7XQe=0iGTntj1M8L@EW7`i>`d|yv z%gyCRH(#dH_g`sh(;-v)lb_FHHwdSch&jKqva*j<R zVfP3jG|q=5t(?*-rNSe06HZuE-n}YSgvSy zy<;(3%k;sHrt|274OhweqLv*ZZp#$1AP%!0D)*ZFHMQZD`HUEtkq$fh)(f?FD>F+= zvdgj}gt^_{-90>Xb#)_ZDfciLHlt?kTU$U9(ygb!+Vbm{^~{eTFfQE5rrz|oR6egs ziGH1nyn3>bl(h!@p%1Ok$wogB@=z$1UnkMwfc}u8#c(4OE zww|I_OH0dpw_i)hV-KLw`s8G?SkW`*97|Ej;9544Jmbl^ke8Rkuqmhul`pLA`?|U_ zA5=82!#Vsa>*5fB(4ncrf+v)~CTH7azA2N3$9z?dRVS zu+~khJId67$(G$udA|HE8b3Nl(2e@60~rcECBLj82Z7KB{&jVtxdG&aowK1>+rC#)0vO`EU)2Bl&zfX zHQo5G{?u*wC~T^%zq;hKlJ{AxW16b3wYZ*;^F{OR(fcWCXJmWV5M39y6B#%5vGm9! zR!@bu-&_@tC z{`?#2@;^6y3)a8_*Pk7&bft>7ew{q4v7GbCO)X5a;mkbICslgvpJ=)n{XS5w@L4_b zihaVm#4vaMEacy`b>vH($-H_a8+YgnMo6nn9~>N=oW{) zq1RiCkhxU~NsgiD?x45z4x}Xk!B>iL8Z%*#5Z6i3&%O-N%+Wo0Ao~5wi;%hUqW zmgI^4e%bp&An`*%83~KKs^NXQ;OuNinPAH*pe^$v7b8#=oo~|6&i8R;@o6P^tN6_y z?| zK*GaC)%=3Bdssn*&l78JU~~qP3PrlJ5+n(GKHOg)Y4DFd-E3BEWoGAC@mNsGI5Az= zTf644?e%Z3oJ8N8dqFOTdFP4a#4CO}E!dilw{c3^Kj}MuitRRzjT7l4M8CTTzERlV zaY|}+s+6srCy(^Ke4CHoDLu!jX-e+%F+bY5PD%iyYm-4!8nV4h7HcU0d z=jEN>H}uEm`S`>{v7?YxKj9IW8lsC270Y%cFM#Kd%5I#Wv&a52{xm89wF z=>b|F1!e6TDsG-&b)*x-`Cxv!o>7k`dpJdr-Ml^rxp^~BTu+}%m`ykx63&D-BcO37 zatXsZ)VxFi&C9N;YBx$LW>=&~#dQk!s#pEU`(WyLdqEi&1JR;b30 z@$7L3S#tE<+}Qa2_FwbuAiCA4jwWYgTJp=;S%S+LDdW)9kC}Rcws#7vH3Ws=H%7K!NKPh2aJpn z_U}c^GZJ)9Ja_x^S1qAvYiXgA41)8h1ai;!^|2hZg?iNp7`5eG>(S1}WPr}X;dXZT zqsOj$Qw@)g{C(4OOKnq6mwJz9r3H*Gu|p04Jf$=gu;*kUs62CcCQaK6z1Rg9ZChVR z|2n%yd|l4PVl*|&SrM7fApb0psg%w=s21`ZPY)>1_tH>RJ@Y)Ou`)9Hy|N;u91%~% zVcvJk({sEd{^R>!p*2*Ltwpm``t@ha&&=Dp`&Rjl-kM3gX64#C^Yo4CM;{r{fx=^K z(u6cAVRsw>yJ-ZA-bDD51xo4iJs5vY-WT4b_pDivk@(fjZhD1}r7bRw=V`GC_)teyA;w~$}Fod93=vr{ogA~UX6>qwUk7;V5BIjZn zpHN}DBXCv9>>|ALzV4at?tUa8&WCnPhW@y*n8^QBN=b7?qm$*uW>D7eCApMqf}RDt z*M1tqrx|$d^xQOKf^h?{GHH;%w71%|z5w2QgaB0dZ&voK;=tn;F(X?%WTUTyFt(av zcr~sir`#-<@^AL)!AXc&y#igYICYlCu<~m+X-4lSB3Jk+5%O~6`{epv){G~=h~2WD zPjDc>lPQ-vn<4U=e_17EUtbDz@m4jcsW^M*mk||dWQ6h4n4TA&_)?8>djolk)0`&V z75RkX7(e|BPqpd`yQYzW{ufs;<(|KQc!@HUB!R>vIlYuY(J6Ts|m)mRQF=t0NBcRIRDibPJgR7 zHkr`***AJ)?%>Xwf^5}n+rUVuJfPrV3rw&>pydJXLaVI**T8zva*~254f1Y$WxIwDt%HrhuH3{NMXao&g8%&f%Ssd0RgxbqOoZ-E zfu0Hrh4Z4IeO2nsd^J54V(`O%!IO*6m!jhm{MoeQVrTzt>)xAagP3%_Mb0QZTs#-= zGO^TOT_N^3rZY>C1wy_1tjb9z+K=$4xs_Wx@xQUK0Pz`KC#oVfB*C6(M084dXbbWPl4}a zHDpLT;tzs)CdVoDeYk{ushWD)pVh-~fI!a#Uo;^u@aKb4c? zH+{Bg{OjnbYT?(Ffxag{+X7>FZ0sY}b?Nv8J&!J9hd|CvzcR>rTaVzMzoT;^X~Ar* zZt)l_aG)8but;yAAQk>V!q@Za=5`D5O|pq6dZ*|F9526A&hlHBJ5$d^k*P%eAFsv+ z#S~9dhf=rY*o##I9_@0H>xH3vA~6HxUo;Y~3cP%Uf4mm*M-*8JF%1n(P47@&a3GKb znwyJC)@wO_aad65xQW==sS@#UR&u1zR^A}u{+Vwv$O1{xufjs5^MinuRKl*8mU3R4d`$UEfbE6*SGliRzo1uY|B0WV)f-h*di)w6dsCqxzgu&=|JVy+kFs&A<8x^YJ}!^v-V%QEt!q1P*)E zvhKuZ`B$RM*fchZkK5xrDth+AVQ>@23z)zcJ`eaMU#yoJd>Y!q9}(58WQhh5BE;H>HhP-2S;&Sv~Y_f}Vc-*2Y<#Eu!lY3O6I>X#aG#L@wN@tw7-)RBR zMErG47mkLRxJqVzuPZ|I9m&lz@Vxz+pjnt|lNqvf{Q`5zw$xg-n>T(;-u(ip|{ z!^38^?C-GVtk|B{eQjGtv$A3at{)v+sda?T{dY@P!Rhfn`33`v($VyL`U{%_%S%;3 z$M3$s+>bG*HPK-urtlNw^C&2olowIzcYo#rdIr8153;+@h`XrDs96iE(Ip5+kl?xA zz~M4OJ%DOME>1T;i7zFW*-eZv`0mC1 zFz4*`+(N-jF-9dUz2g-opk^g`P2G`My}wU7ESV0(UFn3)A;ZS5y*W%}o7Hg-g^7 ztu4YY9-up!a_siAHtbrO2g=PVh}X#$m+;Q|y~RN%lMbE!GXFq?;4kP85An+RlWIV3 z5l{+|04ZTg1c-{6l0G;;4f6u~J?Y;*HiiIC%tAI_hT0Fq%9y%_DtHfB=jucKzd;8J zE7K+toJXV6^W1IM9lZ(2v!32uHovC?3%^Y(p!K!A(SX|k84|`J789(g=Y~7l_G(>S zw0&YQ=>iF;rt6ma zYL^=z&O@wLIfXS0PdcTPF5?0`1-jtE-^CjK2bd~58ze^6 zggAisdO_~PgW0t0XxNxzV-2IFXZ(+bNUT_!>^l5@Kh~~)0UfFJRDSZrA%_b|&^r=- z?Eeh6?ToU%^rX{43lWWD8+ks{S?_kXf~e*}8~MB;=)JsVZ;pUWWc)_mPL@w&C<2PI3}-aSNnXoWyOxkXJ~mxg(Ia2H0wAWjmRG zhf3M;5(>j^r^=TktYzeMzPesR=%`9b{Q#I8T45_E@Y+e7Ug>lZc;MB2+w?~9N-L`9 zO*DJ9*@cCf3}8nwt|8t6Hw0mUV0zLfOXX_I-a^_;kzs-uXOIt)MwhGZA$TGhfR*Rvoj`(@ zq}TS4YeXS%hR}DI=~-w>nPKjYsk?REI5;)6NV~}ACVScs1k-E<-No~#C~QQRavy0t zdh|#`BQiOe73aoAZl%OR&_dneCJX27;oVu3`vItY_sq@BZPh?J^XA4>#J#)deZG4! z$uA*~TkeWRSiihfq76`w(fF0Zxz}Q^`YMT3*7nq5weDpZQahbbj5&sKMqWf5C@}y{ zaTcZ)3ioss0+=HQOAEQo4Gjq(9dVku0LFyKt>D2qCv8!}>1~9AfZV-`RkMdxvj;#D zu~x2%dLnll#b+1<&ogkITgf^R5CkJbLlt^B`{2BQxLo$WuQ`vK_I-_RG&#PmPuKoL z-1_8=@;E{LA=m=g6d(wH%UpcvDJ`gvdAAlGSigdc41w*9p%k_yxv^`seW{-C5h=nE zSz*f$Rn3$$Jm-)x7AJlGPYQN}P!%YyLKAi11YvDZ;nqj4oJ#)bKSH>(>#pdS^gJ0qFDKEF$_O%2)X1eR(?_8lvYq$N@z|7#sAZng{3n zGwe?cT*lX<&q`l018ZG(L>(xFbigkjEWiaF3CBlBjphNcRjl`oC(gdX(0iL@vpI%0 z68Puvwe^8=ao|kf1yN;d!YwJ`IRTUORz~dR7OLb~l-Pw4xY!K};K0S65F)RULX@D} zoVaz(kW6dWoR}>W5$W|_Dp)b#JqbEKcj6~VbB#z2Tagc6fusQPmhjpX*MM9|PJXy_ zsp5m7Y>}nnO9CQHw?|y5Nk~zKR{B1LcW63$k;-z;1=phhtx{&`tC^|1aoG-R3}GiB zOqH~zh~#(iW0Uc*mt|0>qF{@6>UNV?RK1?t&9aPQyYQ6_Xi9#=0;}@l z-sbt9LpK*U)B@QN9PljC&)H1#zt6vlrGFujO20U4KLH7ytz0J+y_g&30C*IhI5lTo zI`23(62{AH#eG`!R0j8E2XAS}f#nQ;cdhgzFi+GQTP^@rOqVKTc`c`nQq#RUX@74* zj!d=St}uk|XB%=hlj6rCZ34K~mJP)%PI94VW9&FL`nnChiidC~fOLgBq9NrZQ#(W9 zG%AIIKJ?++>9q?x0t;Zo@K#;`qA28&f6yX-dB@C@cEOD9FT;K9&80H&;AOZBQ|{ce z3t)5^a;nPR_aSzt3zoYb(*b@BkHq0clTy>h@U^cpfax{F(y?0sTzB(kba1~Vm zo_*>!+sa60Kl9@B(Npd`P7ZWUbB3`vStsX4_$Yr)AZMvKzMG~)gJJz+^Oy^&kCp*B zO9&-kMqDE{c+j_o-1iy5uQ&X-4&AR23LYw zr#gY4`toU~Ml%>FH5=l9b?Y^jI74M6f+K1^3jp23v@eF|^X-<3uOk?~Z-%j`C_b97 z3r}=wb?sjQItL`YYO--V)(4ng_0(sBU+Q%!R-t;g;FjvCFdgQ>y23#T9p711!@JSX z(wO8V?Toik;LUEl(qe#@YCg_y%Z&#o$Ni(o568)x#hNQTa(_*eEF{5!roloix;}78gMyrCcV@oQlP}-&@+pzS22OBAQQ(z-jCxUA`C+@+)J# zuXkMAB`-{@3ZVXzrgCuoPuam5Wg#xZr@jOfc z;B*U2(BL>)pZoik1=>RuW~KJVUvG?Cus%?b@ghHog5n3UpdG|mF8lszpv?TL1pj^U zcq~wl>1rn6@Rc)nKOoYv;GTZqEVVd93j*94(h%5ra);`wwj#PYLi0R{*(bNg6=AWK zz20{NhTSJ*=;us@c_&o-+TXy0?Xt!n9>8MYJ{=TI!>{N-qz?uR3|s3T2;-0tyP}Tr z3;k!X=pejE^^>%?d-b|kg^T7iX3l~}VsQ*5Tl_8@7>0Z%80?PTnas2P(;rtMwhk2) zmlytm%=G?Rhl6-nO2HeXa9&v4w%P*5T-omf_5{24s+3#J3ZyOaECR6iDTD=7*00sY zp6FQoj7^|)tqHvY0wUVs!W92jg4>1156my+UkHIN0*`N#R3CJsS$RW{Kt=rA8){&0 zBFFKh99C6>%2jo@rh#pNbIL$?c@FHSecN*-B37JJ zlfxWCA^+!j~j9DVx$6|ACS!T~q;;p7|CVt2%$a(74 zv_w6_?5T$f@8e?hmQ#>P+;-<~LHH#8TXMjQ50W8NH8Z{m)-+}PMns{lzy~RD^_;zh zN=9Cu(I(hnI8-AROQ5C#Bi0(B1uh+2Q}eot#07xZUu*DPyy~S)qOf_SDtLV1d0Io- z3sk`eI`4iX0*e9>Ln<6kOi_r&oeyzn?7HK|3kx~~|)mo=`~nZb$eqjXEjX{iv{BEfc25#Zq=nROL;Nr9Y6WNA(?%_w~K(=HcO;P-`etMnCoR+=vj5G1u{d6j(HstEjvNW zA>nY6SyYj?$}cic3(>}J>>C%qrb2v)!Ik;19tXDKD<+VFfCt_fo+Tn7@!VS--r3oK z@EH#mmuqH4E+cgu{P;>+o^2fC^!kJf?)fV%gHyG8RBtPu;22Jamd(6n7zFu z!k%)Yw_I&l_aqFLGJ63e4nr;%znB7T$N%Vn&3BD^fP!L(cqpowKM5cE3t)WjGDg5PU&39>)B&4L0Ac%)dK}4jUpxIebwG~_rI5^%8 zA`m69!j(;k&cU-dUR8Spc($!jJjApR&woA!*;zxC;w{B&*F@k@a~8u4Kp!CBNV?vD zEHU|8gM0Q@bvOvF5yCT7ndd-4)^gjX>10`Ykrr_KhDBMf_x=B zdC0TzwBbQb@VN)3=If-Owh4@|6B6I^733p&C@3AU<7ZV* zz0ed8aTssi7Y4l=e%j`30^`wn#?P9;O~1wTN?+=W2h}Fu%lU$}(XdHKtSTYY6s(rPIdpE$&@GHIG6H1T&1;^&+k`ze zm40G<{S1o?W0~%+u<}1P^0QuCgjTr-G!#d98eWc#AZ;do$DK&%^gylKak>5!@qMEF z+cvy;TlNHUeFz^9rPNz02n8Q)KM>)Yu)n=s&ge1deUr+>x+RN|$y_9(?yQm_Nl&++ z=7;VMgp<3}|F}iujABM2>5tL&p;z%M~h+YqD6Wj_Wz zhhp}f+!swv&FXkw{ys_;YNEMz`fNs9V1fH_>rE1VHm)<(Q$>ps-4l>t0*-fEz)@ed zjcXw33``(oYO~@#Zt(yt6sZS<)^~N`SPB+F1MNO|4hA`fAL61-=9RvxV7HJ#q`%pW z&$6uLpH|gm*(~*&?~R>9?+XuWdc}0p!kyA!Xi_zrzS+ZB>8SjR=`kB5ttryjRz&gL zo168B?^!v=90=IcbiTd8M;pcqORSi8*mlF1!88DlnRwzX4{0S3zK64|7nZ0&>x$E% zC=$pA17dj%@t7IHY8s(r_$Qqeu}UVZlTfYQ`^Q_Qd|mNvmZjAeHbd2$6+54t&WJdx z&E)1ElPfV6+Dv3QqeiJwBr6LOtjw3Er2JMeGiw8~P58_e`Y>c77>gK`+Kr|vJAbdM zdxJ>OLQE8Qx`u_HKknsLMs{`tc5+%8#Y;^jMu1!pKuT~uU?q`$(t!}RBpbFQ0*`}& z@>0|D>=2ru>`S><@)DN9tOW+;u4<%uoK9QfwHY+VavTF`3q0sOPK3AZCmycis-uu7 z#(GfxERK)*V1|C|I~W;}PfBV(+U20AAE_SHV~PQh!GXZW4pcL75fm2H*Su)wp`qCT z-pz1xnqY1Yzp+Y+i*hTh%#mI2sVEs5+PF=9qPn_67-3OC!R~aETdP}cOID7JXp;`+ zy6~=6Ji12Bns$w{_f+sf+@K51peaM=toj6cyW957E$8cDM+iMprD=Ps_P)A|5*Z2*`f(zDdddM=j$1?82e}l{kGj z9v*2+MGU$3Z2&)0Qw0E;ZnG3YZWDhg?aVKkdbM@`2o(qGbz!*J`NOrR9p^sJn0G6-Uh+Mi*w!F z>@vboS&NEtHt*7$%v5j8Pt+1ob9Zu&f)Z0f&EPcLhI4K>lPSykY5WxpINUY9@4qCN zk+%=LJ}qVhO*GTqy~B(f<16^nJ0u%c0?>sjCstr8WuVdou5zjbE>Si;IKJ09Fu5Z-zu1q%>?#N(ZM2uEY zBBoxw;@GIO7~ArZ8|Ycm?D&b9sTIZ4*EH8F>^U*e-+u@gFp%8VGm3_q;OnA6IMej| z?m0x+khie8qK$&Sz95Om5P#5AZZTwnU8JmVOMJj)mT+h*!SB{NLSD4VLI1ta#be;2 zSIASI=Kxa%QX1qvmolI6VUXBv__OnN9$n)^{C3vf7QWr#)^+LTcfeK6&z~wKox~F6 z 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 literal 310359 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

q1PRE+e)q@kSi>l zV2Oz2I=Y=#*;SmZ#9im&t%F>bu8`PO_@QIBc;fW(ghm$+>5bkWzMPPmF3ylCCuF2v zC9UHvBv#1nf?p^G3}ySS2_rw^cFn|DOY+aT&vSz0(JI@ccwxLj-(>Z=fNEo+JKT^&HOlU<$ zW3L%>-Nx_)&+HMCol|TYh+Vq%%j;LsHZQ@kVaKP&tFl#`Wu#GYS&2jHF?JquB~2ux ziAR69%!_KmxwG32*Ts8jd$j0VAekbZ_z;hFVU>Ah^{b5T_-$~Keb?Mk?|im4CdZdEISA2<1H8gX73-My9&~bk___y9y}8kk(8Hi=!yI#cE=d&9LGS-wH$e7Iht} z000qg(;mMyd=?xK;*6z)=IuUy7m>C{b>*!Y-`F^{)rmpa9D$-@=>r&bS{G~mE1~+% zM3N8|9`UJzKP1tA?)rWxSjHh3pFtFHJLL85BjY=OC44KGw2pMk-B~1c#gAkX&@QW0R#jSvHET$~%@z(*6$GrDaDboFxGrY`YpN)sUOTWy z7hXJvi}&8sKxmO(}qVZu(8XXaS+ zn6JOtdkZmHncvi7s;3GNL$3iKAWulM+~R7yOtb>3(KjnFd@YqYUyDSdeHM(`ihSE@ z3#L`Gjli3$L+6ToMGDF7*f9+G(dJ&^zmOk_PfDbly8 ze;!m(wh#mKqz$$s=b;6ds8jv6@!T?gza8imoXb^BvjqKX|A(O-pczs{HVH%z2HC*+hC!^(fkpavy%I;ABqU-rB%h1%|btat$drK{Wj@?GqK{G z=F#|H_$l%$2k}mh_+*e`Lcl!mOG)7B&>e3a(?;CJSXv+-)c40LK2f=pKv0wOkUO-v z!Uvqyw~O2VMQyL|tt|Y3*D6`m014DTw6>L@JA}hG*uJ9a8zzlgbazOmbXgK}erfXS zDcfDybZCd!YEOOCWRC@Rz_Q~%H?5}19uPw=aoSrr{R$gqjWVf;KYuwJO zXuxw7hwRy3H};I51z55mYPb7 z{RNsEz&ei1nYAMG3sqJUxH&IaentE5seEU+Tqm1!&Ay_=R~`BB0VdU59=$FxZZK-w;B70lbd^=^0VebI44p0ABhkG0w z_}F6yMqkmU9s8Ny!8H}uMuf>_}Cy1SQZfxOuK`&Fs1|0X-i0{fkA7*!& ztCStc3*Cd2_X91manCF-_g!(wU;Eqq)`+_*IVckt`Up-n2E5c*N!YUjrmlp7>15vTsysBbK8-e-3TGkmYptcc-DaK;~m~uJLRev-!XU z4wlF`G}I8lBIBCkWrlSdsWSaYT3xiZL-#np59h8Dp~WT1gLKi@ja3G1K{UCJ^1;*6f11aVBw9-E06d)SUF4qPpc_$Z{5Mg-|E%el|L{Z5B?aB z7+DdKV3cn9LbU0r@A8Q6hY4B@Z?%G8xlUMZ$Y!Bosjig*BBpT@Rky?b%G$j6Df>15 zQSRL%An$WP67Djr0OmX>G7p|OoqYE1gO+uPNgh#8883+P96m_G+$i1Z|EgL;%rmyO zW7R`6iBn1W^H^je~ z{=NBlV;?d`khc)%7>JlD8dH=3`yP)LVz#yv+09R5#ud-8G5!fBBZfk@R0O!up* zjcJ{>B9A`b5>A`Zz6~z@zuIpYv#f%AWOw+f7KjLbP ze>rgG6x`Mh+!5Qm_S*GC_inet`R*W5Cm+^ChX?mu>hiy6-`>=T_C7MV;7~=VN1Wjm zokmqjvU@0N%Ec>q7XQwF?BHW+Zt;`q0*eILcy-YmyYMob$K8XkjGG_9OHIbZ zlVNj(WyjryZ2TiJ{VOnuT>6>O{7mdCPY57OWM-g?`_7m7NoZ^s2`s0t@GpjqJf~oS zmvlV-W%8-FF)y-`)Dch&@ZYDe+Q^7z6=2tea58i-fv11ox3{?!7XifHX>*`Jl?JAo z9D&wAhH^>bSonFr%22_(F+1A$r(ENCdhk=ebsPG_@aj9Nu^?tn@1T7Mbf}Q*#>2%7 z``6qUxyczG=VlOx>}OXa(M=7n9Km@gfrGQx@9qX~*Bw8d;kAd{p?A-C8?r+{Y<9$~ zjOM(I&8-rOJa$POq&JR#6v>XWc#dGqxnSY~kMF0kg09vW^5}Y$%RnCe2g8Rfwp(AH zSn7^bgUG^3HQGj3rJ~4>_PsYV7P|}7i7?BS}gpVt26W~1rnyx%l5f1|TD2b_u<4822 z*q&y6Xmo8bB>s&*E@3(Hp&jo|U$E{GiO2UJju~*z5)i-Wf{g^oG?nQWIf0GStwj~J zl@>bu6_r3E+mJ`Q#bo)|e{R3evjC^X29KRrsCDk%tOK4V#pIuROEkoTK}ESF^ToD~e+kQ+M~Hw>APx zTW#7?Aj|@)+J5yJ>4d7huQTv+>f}HXiC_C4m8J!E24H4W>J0@#ojdsk+nk6om zU(_kv+XA&VAQ$OwaR%8yfh9mxvNPESE_EA;WJawl&yo>@%shr4q9Ogl|D#{Mg7`;G zxcCOuU9#*`!6UBzAm$9x!g&tM`2f`21S1^Sa&o)kfWL!eTlyc_o@^vxlI^`%NnnEboS?njbg6Y# z-um1|;K3t$?Y-jjFB3}sKvAohuSlT0XwWC)SVM#FX?erwV5G)f;KfqRQsv{H9$@{? zQ^8%*J2(uWBQ72`D?s{< zP&NqbUL5snqvwn%1HZ@|bmMB@7#c;PAlCL=DS*B(z22s{Gm3B-vuLPJAsVmT1WB75 zBCn%xHNu0w!o~U^t2%|mNX2R=|4sCTsO~Lt5I3#`GIxtDG#Mkk5&9$IhK?_&%w6+S zA#Ish+L3HMQfMv8(^M^UF!KAMtD=VH?)8XnI2e_I+ z*dGfW3!m|H1M&$T6U5#yVg-WLVWQ`OXnD3Sv7XoNPDxx+>K?dUX39$&0S%B@%ud83jae9QVKxF5!F|?TP=1ros=_J?PO7!u@Cv*J&=liy9OVTXnfpa6%eV0FwU=)F zOsasS<$*UOrCn{+NlHRqm#5B)sUiB6{Yev~+?p!sJ(HtPTaj@Bh*s?F^U5ZaQsE6A zf%uov6QgN%NzEX~fI|aHve7MC z0dff$q`Dh!ee+sGrK3rm%+D^Uw+}SJOkINKwlzMTb&@+HAG{A;PPnDGx_hS^59%ks}&^|}2&#@;)w$)#HZMcr0ZLH%U=~Y2QK#KGZg7n^N z2o`!%=^dm=7wLo$mEJo@ARxUHY61kvomlpV-#O>r%YS?S%)B$R)~q(qvxfY62Zx*O z@UVRd;b;QT62WF_Tmr~EnXv9bfkRsG2c8ZCx1^Mmu5+C<>k^VCv%u|u^@6;Sj8esN zWbQTRX*4M;x2$8e$*51aq3|&wA{~HCW+~Kq+U-_Xo{ClV(%8y61^H{@0o^Jp4sWv1 zB8)d~+_-h?7U(z5$OsC~di#pjdKTXfoCkzbHqTH{_FEYxC2Q@i*Lj*wdV%aq1oBL$ zyO1Fw=Cq2XC)?tiN}|{<_;*=LeQPFQ4v;^uD2a$Dwsy|2D`o57)1JHAT%x9}>r0_Y zDIakdSx$3G`XFC*3Z@v%A|S54a`zhwg&G>-12X`PcsMxZ37@Y#cmqP=`oh+ewPO#B zUiJaMGg5n%-i2r76_x_T?v#)U5DLa+Fx~bfw~i$EV$dY!Cq5tGi08qj>9=du*R6#u zOM6K6T1KqjxqeDeaPk>?%x7ESTm6th*wTx=Kn53p{cuOw;mzzIq!PS*41;+-c<=zc z7iVRazmtY62Vui72=m#6KC?D)>J@RGuZldrN+qprfKtwT(QlRq zH&>Jo9rDJ9mt=&i>YPZ9-&(1L%tsQG=*n*;QtTwvdLuvdU2mv)jA^uupO>sv=xMg) zPH3qZOMGVVnT}E@$IIEA9FT~I2_985tPe^v|rPy8}CtyD`}S72K9 zEX)L734+_nR~Pt&&CP!-(OeEoA*b|VA_rmiuf(C7`InLWbc0JgxPQT-yk&jQG~Fb$ zKo@`TK2w&0MXhwtlc%vGg?TwOMWCZ(cBq%(s;O9{X3!aSzKVN ze!_asRAPOhb%3+x90(2w#m19A0uy7Gs%)E|5)9Fi?`hxDR!^xtaB2GcoGmm4(kUZM-`*U!AZEjX2@*jU63vk*~^g2Y~_I4qIKf zyM?*k&T_xr)VujSsVPYJg1g;}A1JJjoK^@VE}v+fJ+rW)zcs?aL4;45#aDsX%YFyD z6t@7X#g+z6Ep_(mciXnC<`%_3rQ401I}HrqJlhl3C4(t>!n(I!KVGChbjq6qlcj@gkD9P1bV#6?wm^KB}<#3AN3ZW_Axh9*Oup851r>zUAAaj z$n;JS-Q{2q(bf5Mfe%ZAE$Y|WOKmv$Lo8_A-C#3&oKUIxSH6LyS_Lj+Hc;ZP8WONZ zhc|;p8nzOS(;+>Lr13+!zSUaR7v6>6q<+tP3NKpOx}+L(g?&S9rNU(4&|NTR-1X^r z3@bt<_bCgk&}9`i>MLY|U_qSH#HdbPc9|Eg^h9Mj&sgieDI6g|wW_n~e{c$%wN8Mo z+9gehPGz!kE*u^lNSjM|h};)8xk_7a6fTvG7J~0=1b4-F>Uoq^iF6vJc&x@(ZHwjU ze|Bn_yd6Absb{-8JF{{4Euq!E0-79orla|n)$d*eRzFP6RphQk^7nyQkh*7`Fq&Oz zsO_lqTonI7MMHwGeX2ur7@W`9yF>$$wg>5d{7C(of_>Am1eCAAazoI}Oo*xX7y7C1 z%kR!uMRVR}DRNQQgRpMo5}U}Yn;R{(5cc89M`JFi1+B^_&n2Mc zhbflX9lc#1IjyqaXhP|jnrZ{Bb4I_7o+D?yWvlL8wn3dDuz~6QkvYQ_9mBg9wmR}- z^OQr$!?sf!IVOIm-K!Sc{Q73kM@>z=K*Z<_rwDphS-G;Pr|E>bwpjCtkRsDT7+09r zGn0sWZ2vGAb1~k#w?%f@qGv){*45=IyNk6n@QwxS)Sy-vk({ya$o5=7Pm(J0HX|YJ zq4?Km&D<%ikun=gP@i+5(89c6_Jlg`Sh#B=-zLu&<4n)hXDXSq*0y1F80QER)c~S?hwiRl>p}4)h$1p^N5uS#WJE>T;%R zb6w@;9bmXcz}|Ke%n%HQ2?Q=!?;r znA34RbaXDhO%-z$!>O^BlF{mPR>2f)reEYP;tuO&i%LA67=rHYE_@!ICQ^H_4(KV@ z&ypw=Ye`Ol$CW*)$rRY(LQUh;>Q)3MZTCrCbaA7kml-;8{+ZMFmq zIPb26xiIBD&IMsp$yEdvjZ+Z%dY1;GOrRhdxR_Pk0CW)$hRbB3ko<${;88 zb+POp> zdk~JIrKw#~EEE@5=-CThGTpO(D!g4;HN^^7%IPlg)$`hwT&S&r=Zw0vc_`7BwzvOE zK}D9X-{LSs?jbRRDi{nI<#qon!f=Vo^I|Y@`P@$a0JwdDVy92qA8ST|O#OGT@b9?; z&Ll$*>!MvW+~;eRFBk6Oz#p0PDSRk@A(>}n9v_;zp>&cqbdb3Zv~?IpIrb)_8H05T zO1`pDC2gJ=TdS1-)vihd&(1p}YeoA5Aa$EO{x{ckvOdc&d$))l*m3{L8NPgJc1CkR9K9Z#rYxzASgAv9dxk!v*}@5)t`S!jx?Vn?A6 zGK70|&WPpiN9yd-Z0w5^r49^9l6B3Cvdk~}ZxcY+Pspl{9t5Xv{NfRpezWmZ;h-NcGPWs5a$@_}nAYg>`0 zM|YTc?u=Y+K)z#-aNh7WeM)vu>AYmsmCv1G3}Pi-EYxYnG#AEU>Y16^%W3Toy~?^| ziXR&1dZ`6nkQq>Z|8r12`mleXqq2VuI&?;^5Mc^pzJUR=JXh)&xX178U@NWWF%hYo#4S|#FogZr7`m&&m2j$H=9btD4`Xnalyry_D(IH zT4Likdhs^TmecFo@TPzM`R9ppP(Z-jQ{;4XoV5elSr|3DN>wIH&i~E2f1`QblXLn9$%9^^q9o9Vy5~bnXsi(q*^AV-jfA<%&TIx zE>p7#20Q)FKX3f~n;IK~z{h5+)o8X}dw0eUG!AHr`BvMPf$h)muKg*-S!Xr1J@}Dn z?5KY71oabw(fi4H`<)}R;u%TXv zJ7n+GaB*@@G!Og_5y&@qs6T^RWkso}cLza1Vn&*h_oc0hMJ!gs{u;kE#Hyf(cFG3hx7a-__Pu*`bvQO*5lx&Al&9 z7f-KKR(q&f&yZnu?i+lL!OH7{&7EnBin}5dkkXewDx6n-SXA;J6SJDR|MPpDB}yGf zzxN3?m!T2kOfVV(e~gBD#j2-UWi%j;ryf>OAdBv^LkzTp1L&^hcZq)l$4WV3hv_pd|0 zFOxyt2{qZ-U)58elcZ@mA2-;=wI@MX*SK@W8>UBd?kX3OT~Qq_fl;=YMuFH-rQB=x zR0>oSh0?Xa;C4;TM|L#4UPrT^4xzJkTl>%ujL@!F)z{PWqiO6&!pUqec9C=FY=`ps zDI}Q8v$Vp(=0cOPnMw9^>OIHUC;^1J16-%fqQPR| zJYR#9`;$e^;mTs^rNOQkHud~RfynJeIi1RGJIW>8<2Xl|4I2f#b8kXo8bK@lq53Xn zlZJ#;@+a|A1lgRFyFl3GuugorRgjkf{87&3Da!px(g_ih&K)rA>ooNw z-6VUGb9X!K+~8m8&es`XSKVuCF=1i1Wuo@#2ArMU+=eOjoz9(U_Wnn|TC?2C-CVjh zScPMx0(#%9d&w5TKAt$SsyFLP`M4vIW!rSYY1oJesCaOR!_~PN{=Goc+bBL<{+0=i zI_5NYq~YsU?&K&Pse0bi$Q3eObMaV-61xi(?`?5~sy04bj?Hhxog?Kf5Oay@ zD&bqVaJo9;5-<{4oz2%I(+M+ds#;gBL>}~<&;0(->$zI;jJ9Y;eg;k^{Ov(#ti6ta zXevPn@loyw^}M<|aH!ZJbQ!FwSs_k+^)PQ-dU);fpmlPQEhcM>6|5oY=o&J&Cjdf) zfIaE>$tD3=K`WQIxmjpysq^E5~NE=Y7> z6ZG*Vdzo#~9BLmlRy@j>I1-tc4XW;Wb0I(O2XzY*Ll;Yi)cLvbAdQ%Qy_4s<5K1yC zrsR1bLd?fatw(ur66Wg*&f=4?!y4smTj>6?F_)cnDHsPnQG`M4UB21+B(%D!AeyAz30lzM4jRfk}HUgq_s>3Ea#qgc*f<;o%Y4s!o~iQc>LdllpySS(79Hf)cxkJnp94Sf z3ZlJL7h4J5C~^BO-}dKfv-^6G@1G{#wnWUV+(h6HpQS%$94kwUK6M(p^1}c%&g>}P zvaHVp?>WDHuJat@sHm66fzbG0rg7$Kn)J5+5*??C+eFs@R0b+D;!yJ7-osEUJMW~{?6HOuy6L+W%A<6-|yp4unWs-xleQWEa1gA3|{Mi)Vxhs;R~zq)RGR3cV9+xa`sg$%lJ=fwIDb1H@VuJ>W{Tn|}%X>Oj-f9~;oRz^BU)Kjs znr;=9fWHDp70an};p0Zx(U?Nf21IM1VsdB8>gIxiL^jw6LRPooK^`tb+ne%dD_qe$ zAJkiVZ;M&&OblJrH^q}TEqj_EJhN+)bjo2)^L-OjjC2WRgXT(7)hs+C+ZO5-n!0t# z?8pj@a`U)#WwV?OHt{~})zuk(8Gi2Z?!scPONhC(F~8a7Yw4jRlS`)$@*S_5^4D9yCktK;XFioO8y$69CfM^FNnUYl#To0I zlETMS6W#k6w@6P__HCjC4mijh!EN^|x zb699Y_m*$)m7MiM-2GA11zDrHcK1w=ZD3UjF|!H7oKS*YwO5lBb{ZHFZOBKOq(n`? z6D)N$EHDWmLhf@@o5ktDHwLvMqVIqm%Sh;@WTBvO zS*(3FoA6%P|G3GXU|cN0owHoKR&7f4A|pE(LgZ8aCrFv0NRxAp+na3T?CkAg#VS>S zDo;y?zkk~HeGyX%kMiz2x`VpYVB@GQL1m~xmLjHtSX8Gj~PqnqZ?WdJv*sU9`zN2MSt(=j}i4Jyxy4I}F75k;$UWOv%mA6%3+Q7wpa(x1W__7GHEpi@R< z{686+f!2R&VAlWT?flV#S8d9dhUFLML*M5v)6|(?x|eg`exe?^Z9&PVm;YknJ)PIy z*ExCJ?j+H{g2`p$VB z=9=?W)mvz#{6}1AIWJqg&RE-Kj7>;E(pN>F9e%Ul*I{ebADY(&Sb2jA|lmb>g*yVsaVOyPc4<%nGtOdmYJ=%t4JRc-$Vqm5EA!QalOWdq7qg)dkEaspr;3F%Pwp z`?dF!G4Itx^2%EUPcWv0{a7Lw4oJb}(>tT2rp?s`mNP^)EeQ!{Uw^*J+L2^03lsvD zd#mpfqTQeURtV89XnFjxM&(e-Op`nZ?-^HUBBUEy?$PvYERWLtG;H_L=_kN*DM>9Z zS-2=3#_Nd_lzKWJvq&kpWKqs1kca6NorGVx1LA|-SWQjbQN5cA#9+tR^N3DNJ#iNNdC|9jtzB}wB4Vt}9r2<3#RoDGog|0~rGet2iE zau~r){gEo+dKg?qp$TT{f7U&|mcAxC6a_fJqd$2|o%W2CmAYC>4FzT8 z{Uz-l>(ayQYpm?L6+N0I*M&kg<2e4u-gGYU`8ywI{x4%-&=ukb>PCiY;s0|-IRLD0 z%;RST_5bgVT8?0RxoMa|mX7?5$fkJoChG&CXanT04>ki>7uJ+0!`DjNk<&_6YIj%u zTuFjAf&Vov?BZ;Ssb4Wh-Z?le7JQj+BD9tXLNMmu>`}St+|-)WY=PLef1I zByWcDuo0^}>;Z3YhjBvmfVon(#=7CaSU&H7ac=+ahfPWeMv`}EdXac1WjDd8_q4f$ zo3&_8?OES@4B6q!f~l5)y|*(Gre;I$FTaJD?kbcZ&gZfEGH|1suT?kDS`@syAFG-y zlLN|i5THvkC{V7;(fnEp5Io@Sh>$-0YUI_LTnhGe$=#8Nn` zQ&g$$LX?aj&1baLD0f@ir(7j|@xBLKdBV}h|E_<&G6#51xGWC=LiDc;?~$fSL%r7) zPN$UaOxG!haXWpsogTcSnx!%rXh0&e*?!-_5%}jQ{Q?~z9og40*D>7BdLdw{(Y(S8 z!X>s;w2E;t&s7O$18@F#u&5=c$fsR#zRB#|vN2^A zPqNP)2?4lZteVx+liR_*rxPc*(%XrRGveoj6f|0k9iBFSwq@JAm!BIM)*Wrflhve* zBl!5NR)U>U5xHG;C4rn)7C)MOEytYT;K9361pi_1FpHs-T8L8};=V&y2QEik7RDR8 z@2GwF{>ta%hRYNum28<+-)G4s3Z7C+X6KBgyjnfy{r&a2tc#unjg}iM##wAl-|yhc z?{U`U{@)gBqPRwuM;4wyIA7QQoUg5aNRhF_MtUFDzHQDVgNQpOZ8#GeV|Y8Lg%8{v z^?X!K2Nz%}A61@%sb$Ld6~%k=?FqSe(Mou7+m7hC*-f=_@wU|#v;ztM-{;ir4uIPd zFv6f-%nd5G!rY(Q4`dS=PflwI@LRTkw**x2 z!XI<;8N8FxY6L3b=Bcr&w6ZTB8e15uojWgc0-UFpniIvm187I1uIB{(`Pum&_|eo+ z`qFG+^5sDEVZEzYd}|C7gQ%9aweK(lD(O&KHuHlm z0YgYx|CJ7D+QR07bV};RZSmlsp!dlQLqkIVLnP^&5yK95TVQ`;dkesbygW@Z7d2S~ zK0f8?l4*GuXD?GYmE}QksB#!68E#6IA7AlgwC;FhBKQV;`;+X$=YK5#q%SrnU{S2f zi=kS!cg|?s;7b}59N7D))-x$Np0nBc?TasCy!-h~ij(ZQx(7pXTmc7?XK=_s=ubwei;Y z`MF%6VG=03s4rqOR;fPbA!#GSIpU_kR^%1f4W10i$PNe!I!8i6^6VyI*?Jzty;R`k z`mq0AMqA`(fc?#it9?W!;T^5o<@LFxPik~vlpviegYL`jMVJ0-Ey&gaw#*9)U6(Uu zn*Yrb6D(%AB3rA`(fK&=WWdzo+CZpb85yZO@fhw6jv0Hk z_4xh!_w^N~YPkdvw5n|8M^g9qDJ<0Y7>#k3Zh68{47n7@Aho(J8>3U>UHsg% zE*aQkZgh8%?D1SLYjBxM%-8-zffDOi4!~O4`HrascmA{27Kr)Z2A*MGa=j?gKs?<|t-O=BKZQ0L`}OeJ|asTv~2xEhvurG~u6wbB@L=@90WNl&r^u zW@?q24}WkDzK-OHOc>U8q1Csp1?WT{JnPEg3BbdH2XTAd67yW`lZc28go!)S*QPjl z*nmY4QX%5w6wPwkMA=$&1FTB<%|gy&npZ2kAAza$e@K-?d+p1onG(lc zY@}uqi1w&e8K!J=q3IsjN_HG-ha9X7WyYW;U>5;ADJp@jJm0K8_Zf&WSi#ZS51(*Q z_E7HCj=)5Ynf#e1lieT>b84$Po(??!g8&e5{*xUP00VuH5%CiP{b#QT1)tnDNQ`Ir za}f(~#XdLb0RUk9A^qaTKSL`k+K0pf;+w2v)2l7SlcL=p0L3UNc8cYwm&$;jDF9WX zF5%5~5Qc2bEsBMztLg%2CAWiOVlAhMq?u@DJWa|B2Zu!Z#gKScE5C%lHp!4w>li~L zPB9C>U%!xz0N7^yXZBZ1m|1{CZ~B@-Nt?7tpo;$M7Be*7JQjffl!==mxH4XctP=x( zbQU#es@FU{^Op?+eH&Q;&P{=XK|+0=Y(b%zWCf6Pa#a4;e{=`ba9ndt3@PJXcCg0& zj2r}9$iJTEJp;FlWM;x$l=1AoY6-N zF4dz=PGlkhP_nG3JVHjlG7aF#St`&$`p1cQZ>&%9;9KNUZn zb@9(NS+syF(6hQ3HD{@hs~NY}J0U7-p~eK zEf?@8>IB2d5yyzE>XM9#!ChVu_zWPD_82Ao4`01OBH$r9K3dR0!qM4@-}a{lQ1Xcn zXx?JtFTA4x{Fil#!oT}w(Il*T7;Jg{Wqv?%I3PA8PQ}vzH}S-hz!r2zL6311!p>Q) zs;e*JeZxtj@(GzI(}NUYg#GjyT>SXXk#JM{SFC`4WQOQ;(yRRjH`ecJEqJBAuz58N zeD3-%H23>SgZmtNHX}XWkzfu0a%}|2S^q7!Tzq(UVv??oj?)QnO>0~0T2--=Hv0l# zzK6=ulrSQz$IH2?KbatATJ6Fpz}zGNl#aO3oR4qL$Q2FQ#==JDZo>%B;jZmxU@wV3 z4)PK(^+X2u0o!H8F_FV1&D?9AC>1z$vcM8&fNmT0uC#h zh5+8t`pqMtxFuy483f+#G&D2>1Got6U*5Mb0)(C*x=*(l7*b^t(v{WxyhXlcx0?zH zg$c}&im_Bl0WvF*^rMF=i3Fwv6_H%dS-%+r633U5$qp+UeeR=?$OqmRAKz+pPaRf*63kkuF++DZQ%@i*b9!4Pm zlJUno68`&}Aou}*@3$41;X;D~cDR^2uU0RLLE};PgW1te-4m%?xKmvLaYd9c@Juo{ zQMd3f?5W}t6%~~yPXdaHiooz~ee2BqUrNjvCbn3@)e)Dmb!6{EZ!8$S7rnE<0Il-bB?as(jn zfI~(gdzjJwss=IN0swCS^9E4s8#f-{okF1Acb6#7EP=RTBJc^_+bu3>y6CNU;K4Oh z{3SBO&eL#|bIR0KNI&<2iHFigyhF;|{)ups+xiHIiTf8oC@b-vD(;H~?2U}E84q)x zQ!C4N_rAp!0Hr4gGyXT`^jsiV0Khf>3I*H+8+YSWj$zX457r)KkUZIo%^;E8YhE3# zV(K^H1NsRd*N+l}jtmO{EESQkN;0AWB=Xxj zK)V(b|0Ird{AQ2%j#fD`fz~PD?NeS}-r0q#bEZlw@wMWkBnprAd@{nN_daEW-(g|# z4~{d=$fl!4m;nkMFW<7OM;xNkN(sRG0K!`c8NR`?IgC-0$b>QJ!dO=Sd0-9faxJO- zqh;|vaFPCC^Vef7jy%sC~9F`4G?P-oT%V^{;l(2?%TgzPElxPc-8R zL-muHjH8sUuaGY?GWAi_w&Opp9aF80oqr6KB7J3JfOF^ z^tKS_9HqZ$GX2wl_zxHYF;3fll|-S{o_mw)aRheNPNWU(;PxEY?iN0>`Xr+1Jg{?s z-pA;Y<_y@tzbU+b{LsJ?c*0ec63hHHLHlF8H&_k_hCIt?;vp4RnYl6M+~@Ps2%Ps>9_(Z>=PGYIdPu!1>}!t=a$mNBmkmvwH~Pr zDRr_JBa*2CTs6RmG^EsW^(y!54-hzFfm1I6%Vp~}eskp*W&JlitO~sY@S(58R?B96 zqhZwE0!!thyNxtpV<=o8Luqm;UQA#~V1_hTc@#jsiu-qu0F@u0P6WsttI0JtIEYAY zH#Vf`&2r+~rvRBd?5U>v(t{A7=WUfW_E>Pr19Z($fO-X*A`r+@f40Rk#)0kmised| zr*8nU&%3RRX^=84(+RQxAUqH=K};XUG5xT>NpGU|xmVa|z|?BsC|w0i_}5~bM^nnB z=y%2GE6sp>ei`>=>Q;TCnCJ)u5KJI4eB-_Q{^`)lQBgOU(X(Hag@D;f7DWVu3B7A+ z`^m!o&!X~?z(gi2Vx<-2Nhy7VWnuUqN{Zh_n-*T$3JdcTpz)w?mpxj=w0fF=k_Yl( z#!H<}aCGbKl|XP1Xu^M1wnUDY@&UMZ+#E+R@t25d&kgZ*uLBIHzk3WoY4xE=4ytd7 z-VtPA*BvE!kW6z38BPlfCM>O+GdMFGu=fAm=lp)qmEuIM7Y$`4Xo1jvb1B#S<~tA; z@Opo*%XZpKN@`5hTJ}UgO{}EzX%blL8#TH=S`P*S)W)Ce&Hv2FGV)z=?aJm?LQHY; z%W*(ka38cj00wuTt^A@_y3q@K4rnA0VLM8SJ@J-op{N}|!wD*6u(fXlExdeWb(T(G z#Q-6`>n_5K1_y*`){WrU0FfC0TWJB!*6B$2#R-cOchl>j0?khcmgvA|p>;R70 zk>hVbPGB<6e(yRPPN#ntxtb#OZtHrg+w19$=XdAR&LKS{MK#brB@9U|hDq1t8BM zBSrpnPZeY+u&4SNR~~)_QMDl@uYuIaJNsj4M<(|ck0D8br=t`MDZ4+^%dS%nT7_Qc zG6l2?T;#4*AJe$>I35HFfXztZdb0lq=zakVP(6ng!KHKBe!qQW%XXK6KL>!@uI zuX`huZI%VRCON}F!w%5VXC3r<0o4AmgQ`WDCofu)JSWF|R0(JFM*yKLHnJyZ_PuyYGeXpwSPZ+rWQ9=^NvK19loZ%4Sllr_-$K=C-443s+73!hpAw zuRLq^@Npw(Q9?km+BUcUsD^`P31e$|SP_VK%wg^5sAov<$FCkbz#+<(yfoyq-5Jsz z00v=d_HgRwcJ90WyhYpS0H*7?ZeyTs#C0BvQt(Wy`-t6g)ay^(H6i__3Apf-Jx@7s z?5RX|1_2KqG(HHR-f5C%Dgu~g$FS=gJwT^utfhibH4`cJs>HbiE1f+WKM(NXCgC-9 zqTQ()n?4XB9}E$TMses0vam>-Ib5PB2SVNm74ZiQ5{5lFlty+okT~eg;Ol(N)v9_a z)A>1}aOp~PXExumyU-R&4s)*)L*`QKc=*GzIe*q0*2c{VA80-e$ioM$-%&w=H#vmm z!s*j;WQeaS@Vr|Dl10|xCt0j|JhWJC;s_Am`L zV{75%xuE|EE6Cw~&0pwen-m#Y&$l%b5P#)hNP}+^%iB<|zHUCfsEq7vg=FE~0d;+L z@Q7-PC}b6dn+xGH_s^7#QOi-v1kezN)7`Q4!9$aW;c%g2!MR>I{?7Nr909mO%^`O81K$T6FvFlyJABxY;Nl`AMohRJ`&`@nJpW>q$w{E94I`#$I&P z30bCBFKH%Tt4&#|t+|NZOuTP;YVzskRN~Y%r@bb`#q;sCQw?7`$%S^{yc<6P+)ZP? zH@U4SR9$B)A`;HIAIwXeQmnPQ`1aj9F7N#vAZ=m%{w8RM{LVX+80L!hUMU;8bLWnp z_wG!Ac13P{wRhYSQcF#35CohF+~!I}dhmffI@fVU4Vy9#lhIlx(7y5UZ%;3yJs+EL z@giP+Rg`v{DI>lONzCfv;)1GnhI#F7pkS_2Ay>KFH(qR)9vg&zqPlaf>$RJS+ zrkwa0axVAb+A%VbMXY_<^5?vj?B`S7qKHv08&@+AuU9n}*WBdWwH!Sr#vRoC-8W~Q z(PIaD;7Qg(-KE~lV2mvq{0FSEG9xoHNyKxovGMUh|8|?s(4hDJdQ)eTkbaFD7cVcS zjT525^K4lswH0x)9u!a>g@Cz*Z)m(f_ zxz2E{0}iE$gqVo871zdJP`W_J~)?=}$a+V`Uaq z>GO#=FDcyHx}s=^FFAC~wXolO4j+1E*AA0|=6fWxBG2!AQ;1zc?}G7ITKJrlHS(sb z^GA(hLoKa%3(Y%bc+5o-61uwv4?5y`^u5+4>FDTGm4`STb+!AJ)89$={m0o zi8^k-{My$5Maa*Lc=AzIf@w~WMJMX7x*18?_3q}8oXKb_KRA)4=Smz26C|jlX=may z_7p*98Qf51kW$VT22-eBl)NbWYr`5S^{4NYzK?cC*XF76RS^^2<=EFJBN&3n_jTzM z0q0kw&kJ;6+!d2eBVfJ*397pLp_lus}8 zi)?FB=rZm?J*75pK13^s3fh}bv(9NCBwAvsdJL|8u2|Zs^toG=R|k$lK|w*0*e!1{ zOZ;{8I0E03F4foDTLXtL4HXqxEbbW>T3QlQax9NlZ30VBNvYK$4JSoELxhi>B)Up@ zSag;!Q<=IMM2#2TG$Kikl>epV>L9+zBm z?|ceAAtk`JaC884_=SvC+VfcSn+@gm3{i;2F^WZc{u&|e5e|!dZOHzN}(Rwv>Js!LHdK$E0sa%7~5f-30xtdfnuQnpM{xnjU=*yFt7cUr- zL#x3FaLDZI36#ZR6DDzDRC6*(I(g2hT`0rF^NAE(#_rRsrd$u7wn@)XSe~+KlBJv0 z>ry6Jn>znYJH$?Y}g7mH?6O z)O9tRuJH*o5}|^l&3YTtCp=+7A*4wWn}a~TNfCIB#cl14)^6F=ZIA4Rv1pjW2~sWd zYR8>OXoA8FVHI{S2z@Gj-aFfUAMNH6YeBt=ot8}g=L<7)$>#|AbfW_jeJ!+$*X-h@ z1OeFCVLM#UHhW{mm7DJJcO&undEad4&V7r%FzuHUEzkI-x7Sq!)E6@#@AP(uuoAtA zhU(`?j`6J1O(l0u{oJ(QpS$d2pES~`?r)lHAH_@L%joTVD>*a><-XSIQ9)KRL`%)Z znc7FGCx;V=FI~6l$u4BZi7n7x%8*n81Iu{Tn4ILH*)q8oXP&+8R-JDK_D z(UcLdcgG42dN_nr6E)rvSZpkSNTu`Q5)UW3z$#B-_AP*ZcT&)xEVOa(_4Stz`xqDx zTn;O&K}`)#<;@`?`cRLq;ntK*FJ=)n&C%*(Hs|w$#H1P6B>Ues>GHd{*c#wv)M*Z8 zjuA0)ne(B?&Wb=fjJpJ21yYFe5ix_@aZ84Zq4`y%UEP!z|J9{!x$oao|otrRKR zxG+Zjz^Eaqn}I{!dFEnO!S{Y_jO+PJvA+dD@zn3@(cAQH&Fu_Rl)xCeUH`nAJtpM5 z;HR+GP*&JvS}4lD4@1#3y79Ka88g)Tyn!KZhBHntmr)K?q1G-)3zJ1fC9>Kccdv4t z{9wyQ1wL`ZAyXNc?4R28tE`c_BU$Kx@tm4Ubh3GQ>H&f!s%q%X`San(QVEFMlN1UG z$D*^EdD-Jj3?%0hqdn!CXTpX=UR@58G#P_&+NN0ri`iMZ;W3RX#Hvq5+a|8CkSWteO_fv(v_ zO*vyBRXtkb?`yn=?dq7^^wEKY(E|k#DTfmZKh4~)0;OW&J+k*T2^VT+tEE6Q-SoHi zOzSo~0_)oH8Fq@1@8Z#gzS6fInTHc^oUK@4TFIn ztak0%j{MZlUl+p<>{~_dPf-bhFEw)TX$g6(A~Eo}XhG@&B**+gOD(&YLt%dl@J59d zV#LL9j)oYdES2!&@o!2WrlzAV3}$ZIq#1d?hcTZJm*TA1@`wGjcfZPk%)DTror+y< zCI)3%aF$uwF_@LNWa`Th1^n9FgaYM1PJ7?LDFz+_S9uZm{z#Jk?A56mxd|K*N9bT&)Yz=z;iJ8sEFiuZhH7VH5fX z)kR(PG#&o@QJzgDJvdL8!Wk;;W|jU*5eyA;U3{NBXTdaAAjX3yA*jkcT$*d_^wEvs zYOai!A1KuiF?}lx-u1QuN8a$@qOQgYHP=E#YOS)D9_^yaD$V)`&!;(csYXuGivF98 zxCg+sZCEITe^)40CrtZ6HmA*s5bIGjd75+H!?w3LhizJvD7AT2zs9AG?-s#++Ad?Z zljl)ZsmfKZUfSNJ&@cT)eQJ8hANE4ij~Z7zH!L#gw>Ie-E;a)@AcVJl1kU|Y4N)=m z9xH_%Ts2lJ2Qy|qCa`b~E3X3-X0H81sK0130)$v2d9EXR>9|6d6n{wZ6X(xb8#7nk z%PwCMeqmDDX9ITP3vBocE~bzWko-CP^nv40U<=WamVDswKVXpwSEwvQ&-?OlGAvV!_fnzh zR4t#E#Pl(uFMZL@V%w|lN`QKRg9S18Q93G=7iEhm+5Yq+t;9j1Y{iqT>yd~e>&(D8 zBXwApt$*TMpmz0LO7f4hj%b~mcxz%JaE(c^a5ZpH<};T|L*4{zs#omNrPNwL@wTot z{NJk#{gd!~^wa6XrqE&PscVrAJZgGO`nC8H!rVuFi`%5T>~gywt{x`}`AyCePE#i4 zU0x6_{LV>yiinwKn8h4~I+E5H0nExqDwff`A3dd2u(XOX`ese3ud(6s;G_92p%tfc_C|9U2?SDN_P;|lHrtl1Kf+AE{IbdLcgd@46=L(n2L?5k+y1jK{ zTwLVE2ehl5UMjJWfF9}@OExcoAfsTuY3(i2 z{1omBB-l^(VmLT&ZTcScu_1ktZ46qfE$-iI0@2T8>XgNRHE>42L?R~0+K)Xc3b5@~ zJuP-r3_jont7@pY)^j?auxWMl>H_{F9MP}_CK1tzYN_t^xIC;&iE|Ee7^GQXt%y&^ z-PIn))@5pUUYTd9+e5`dBu6)IA538xcrVJq%4V>6p9xY6@6us+m3{hcoj7I?<{PG0 zS+ac>gqIj6S|(bNMoTfKk5QudipQw4A_Q0bXO$adg0tCR89>B}votAHd%yrXRH(eT zoeA_xP{0;q5Pr6b=_7pOInaX`{Kn)(i_ALQ?n5l6UIg$k>Az@_sYER5Hi`I-VynTg z6Pu$;TY|Vvij_3OqR4sv-OSTO^Tl=}4e#<2XKWUfS;^=-gGB`R_l1h)PFWT8K!Bm? z+OJtqQ+(uNQ7v3`!+19pzcZtg(--GURfaRJabr61W#^XRGLAFBsC@J?O>DYvT2#4Hu`Jqy0eoj zj}GUv*jM_sExzo6mEvG-U8f(i!?1|N+p_Vr0+E3oh9uSl#jd!z7_l5#N>zK4G$LmA zu*<}A+vc=C)D;8@OWwJ{3a=Maq28?_+Dj|Ui(E_l(+f2b#|$EW*@Y_)w#~IhzMLAM zQ^}V3fLyh1{xz^mN$3a-tLwJvV(5-6v=Y4}(gP0QdXa{FFpNQAZ!Q&T2}iwVkiW7W z>+G0BgMLAD_4cno;p7c*wgn|gGa)NV(E0um_;!{cIiKhNY?~&PU-P|)B=KW3z z3SB-vKHc5j&CSg_J8ru|$B4R_MA`j7^70<$$H2sJe-Nz*N*Th}x7NL%D^{*d60*d@ z&%S3uS*>#DxyM?F?u!00KIaq--l$1v!aHhD88ITZ+O&%f$L5{6H22w}C8f3+K4MrS zO>*c<3+kAJ`1vcVs!sm%4_HrqeSPzj8rRj za&Rw`w5|z<=1$~N?S)*p zgJ`yDXZy4Ey@!|NSh=LyuWU;9Y}^5w$4ozvCc|YM*tci>STm?4IK}Wy)_K+C6|)lf z>rl&p63jC_R=hz&GKTJ?bLmYX~JWZAO$sy2Y&JDRmyl?9P7j)@ zdEX3r8rJ>o3N8Dd;G8qQ&?KbzMy>8YdQviqfck6tv zq?HX1{RodnTRwMw%Cof{}hjWU#&Bk2Fp?cG%3b7sGi3k*(bz&Y@ZZw_c? zUc>4SGX|0<+A4%|1A<*l@q9`gEc)tzo@9y)d73qi=`W|Kx>IQq=LQQ zc<=KtIh$(#VYgg9TX`xCLzH-&@Uz;?-2EZd@L4fAbuiKcQu0e_1;hDfTn~C`QX*DV zVhSvE_g5O$p8!jeWR)$zODXX>Y4CfS<$^M>K)B}-_3yrc1@`sb|JhbfhOqlV-I&l% z&gDsa^`{ShtSi&|g%8Q=1m)3+P4(n^4Yryxcd;(-H|0#CvOFwvecL5QI4TQvS_T_) zEoK+$r zq#FbzhcXbQyBSKlo1sRf8|g;6ht2`!+k@{pzxSN){HK?f^XzBu757@teXl(c$i+#- z6ek!^u3VFu8mH>$tg<`YDa-PzOOL0pw!CDK)jZlQUogI!N@SSI??&W#meEjaXCs$0 zEm$#eX!ms%u2<|W7;Pg(<}bL=dh4$Rl)WmhLS<&> z>`VUQjuvroaei$5FDpC^`!jWAbE~;?zFyrhemql(2Q-vB+}hc%EDRq8w}7(>zR#ZFW?Tt)5VorB<pjmotmv@8UEwUz+_%gXGSXNZtPgv0FKP<-UlXEH4yQPW@vM9PdZ% z0wTBYl-`{*W;Z+?{>yY@E>!zrx8DH`38nCG5AlY%n3-I8&E19M&6G$&HWUV~J^ zrQ6G=su4@8^JiN17y~o3T6`{ga=fe>wOd19{M2jxFLSYtjrq~&sHH&4)UkE$q;j1p ztL*!3bxjU6!<{O!BjqM2ayDM2e3jq$%bG)02VRHyWYdm0Y)e5@%sfx1H20UM1CO6W zWrzKf5!^LW)XtXut0hZ0HL!E4Uzv0BGn-3DH@Lhitdw+8ZKxzCN7LrapdX6tk-@7# zl2+OM?A1-feb?bYqSH?Wpxaa3zoRw?ty&$Gj?h_J4{_B3cN@hgR?y{dXE(;YR=>oL zd@$*LJXBJ>yS10MhhbGa;*AEke`ae|2pXFo)W%wj*7_h85E5q=c7vU9LaXuIoTY;3 zp40v)+Gjf~rOhUhs>(Tc&*)qF;500jVYFs!S<=8A%m)ij(N!0**;U-kPe0sYxAZ!} zvE;YhM}ou~!rf3(S*9OutNUe-xLS5LiNQYGHFjm63alnKiPCg`-PbDAl;baIN)>T+ z#FX`?!7>x=OJMb{b^f)(O-=*x(Ci{5y!^O><6f!_<*tX5k=jWP3-)wZZ zHS^*9c{5&AIu7yGx>xqAQ#A$0w-VMk2JI6t)Us>C-Cp~GNqGlg`twE-JMZv%7NgyC z25^o=gkOO<0kB^(aJ4+Pt$a1)QCZ;rm^tRf$=u&jrZe`{yG+&9tGQ(o(a(u*Wsu0K zbY$Gkpk1Uz7@HUv#GyCS>SIFA&1ekj7o7&kNsaH>XxKdG?~ltcVT)7Q&Q9h3rqfrg zs04eVQho5$Ic{efI~Q3&6wv)F&z-CcHtsVgdGQR|i04)msut%d{z#pb$&c^R=06lB z`jALTe)y{aoeIsrE*mr0#*Wd`j>7R7X?PxKr++Gz>CwzU5*Gt1Ql1G_5dgS}+wiVLuoWfZ1n zm4RTs%iMDcQyoQ`rf~BX-rY}fXjM+%WiIpOr3#nPsPl6sDRm33$j;?*epQpb_VC?C zN*VVBNZ}W`bxWysLJxgzdM11?>zSr`*dpIJi=!30y44GT7B@ev0Y%rMe6YABiN(@! z@|G-T{IB&SyK~uc_c8PAlTZ0zBho2c-Vqe3BllO2bK(O@)C~kyyWsXGhmFkSYX>s* z_Yg;Ggbi+v3XbnKybHqMlJG9~ZjlZLmK7;(+p!1jyVDM1WlJ)8t8OKIr%6`UAlRkp z8uuSoI3JuwQm(o<_e@tGhz^(Gf+Gz0Gf&q0G6?P83iX^T5*agLvd^rxT_fR4oLiQsh(Ikc_o!>8tE=GUYZmD7s~~5s z0%0i{7#JH@|5(N$JPFp91~gp_DHRAb57^3`(2LQ=GP2^_2ijEcJJ}0(Bpa_x2MH#Qy1cE zzIxZlALp^=RG4EUHnh8;Hdu*giLuz-M3TkTdUY80sGL2k%ZBUKRHr{<4dcm02s-b* z**B@FG*71*D>t#(&A`*OP}K8K;?faFw(RI5YAfYOm%dnqr8s)5c{vDCCoFO4$Xkp? zyf$$BCB$y0T1_dYKu%R(12m z_HTzP{@3Yf#(UsZR4lW2i1T=z5zrE7C|AT-@HPlFz8+o*Gteo%+68G7l~7FAy?ZNC zRgDAI-C6e8+=q=Ri>*%`n(3BK64|L06R*m_?bToF*OKPX4o*XbOzTHkb+&qwLAH++ zLSnqQsPt($hl*`Q`vK!(VO+dsOdQfg*HM1Z-3i1fn;g<_zP;tXeM1*G^4oP;c6(`| zA3d#KuU-+Bn_Hs)+@sv0MoZvOXzh!i|JI?jxIACGe6>fbLXuEzt-=}|M7HgV#AJA& z7xQ$_kd;$?+Lg<|AZ#$5=2a{OpoU;;b2~*`b;|<`i+w(L!DIc;_R0 z1*09Z_3bBWLzPW6M}1~t>AsEb(-+Wbo4yuR6^BBmtU8S@nF4)^K~|%F{1W;kmEBiA522Zms4rueuR_ql+ZUQD@)pzuUt@ zERX3@gCD9tW5EnMLN&sDJG(kphjXylb#6Q=Yk0EQ-2_-bJJfLMn=Z??`u{vFJmY=G zd;xPk%G}M?^Bj3oE-8mbO@qn%_bV^K5;)qJ>fJg^1Z~U@v@emGyRTyLq8MN`7v5%W zU%=I=uu`by5T(?MJ>|Vd&ZGZRYqOpSPo=16go5}RKTD6};KJLjtv!!qJGG+A9ghn| z{rWKfg?mIDcf5vDqzH!Jn65OG0Ek*?(O(TfI0>VwOSa>#Ms7X2=hGY0;wW`BftT&b zS2w9sRASUqG_A@l)N-Kx8?k=jR60kmZLzFQKgpn83unjCjR%z9+9P}F$_k72lf$_l zM|Rlw7;aFl9<|RS*+-n$FASAnU=5u1z5!OAmL= z`dFB;hzcfcdrqr<`?JfJeNRuQ@X>Q927sQ_pTn$XN!}d#K|6shTf@9!|4O-M^3RGW#PpLYXH9bnT*qEm;Z`Vy85(@k?k;DOdvTPL zx9CO4gm!C~`Ba4%zA#PEP%VTnh4eQtgPTSg^jyyzb%>Nz3fzzLA3n@6E>4DLj1K2z zlBIl=zNJ#-bpIS=pJDul%K~HcFK^l1kZ4c-=XQAu(v+j~7NpTe%wD+U1M_ieN zN(t7P(ktDk`@&g|xcuAiDs7mI`0~l=@zfZk`;GC3^dIs2&2SEGM>0;2IUQ|DJ3EtW zjWb3?A+08J_#dx&+17EJ?yn-jBol{2)TK1>I_+K!vyT$Np5;0<(;n`kP_4Z{mielCQ_XjRx-pL)Bt0Db3FZQ6mYW;C&JHu)U$w4r(wW=HM-!VzQgMoz?fg9L6qNA0&)!>U(#D{~ zVbaEi1-(hFPhRP{^6{yh5R?CZv}xWG-dAb-v)wdhMNgYL&US0(e@8s&2T4~4VX<(N zgsFC*`Z!NzT8b!P!_(mc`B3Ubie%Gp>7)x2-WM~+B94Do$k?Xhg{#?rqP6G}Z=oG3 z_|ZMapb6-P>myac{r6!Tf8~n$Uk~J1{%5%IzMlW>BF@kUU*BjYY$|G#qx_5zcWLF1 zE%4h?D8q>AbLt5EU<6Yv({5M))20+W;ttZScYh$c)1*@yEjvK7Re=~_ez_EVzo4Y~ z46}#9cC4CTN>k5Tz~4cPAj-?sO{YllAvm5rjkpK8txr7PNG~lBL8R|pXePWbX9>xs zNmm~MYAalQif}B{mtm~PmXcg+$yJZbk$;@U&T4}0@RYNzvnN3sDw38(m!)`ge8pSw z4-YmO0=|?|$c_b|SJQuVB!N{m%epWee$2e*fANz6-PdJREZ0d`t}(_PI+P@?mN@47 zBkR`eQM<^prh^j9ur~4$hyR(At4=8AU3Y5T|qgQz-QK zl}`HIlx+NyiCck;%HaS0$B$wg&KE|($S17h1m4m!ACfGu-ES$> z;<3~&c1K{K)9S@$VL8V}@g5)Aci$@)ejG_3V&ggU7$V!aan9lughy1&BTI_}0oPqNK*K z^n5yK9X%OC(D-3GXEbnaXipEinYORp}cTH+Vg(UcN()l8*0_DBopm*n*xfZ0WxJti?b49GEnp zXsI|ASSilT?3_&)?=BMXs%zG~{uAo3X4`ZprHc~E=Zd+TnM7AN^6h*spniB}pFfE} zZlcnBF%xHyGuZ0*INghOpeWBClvt}RifV8zB^9}>M{mzg0j}&cHG#{50*-uX96@cKl1&N7^Mpj$y@={^%PGe1vUC5)%@FYY(EX zv#=QDs<+}ha&dBcB>b{aVVt}*ar9gNuXH%S;efYB5}q>45>bk|ZI{=6f+`yqgB~h& z0;eWcLx^+NYA7!XefXR)E;pB2Stm}m3tUTqpGCLC|KmTw!(|$-4x%X9g;&h-nmK?6 zV?sMv>Oh*On160f9t9f}A*eegRlQ8b2Uhy-zx5-!iOwp#4mzF7@CpS2X!xHUn*@kCp7ru?WoE z;%J_}#*=2}#OgvQXHUkW55=vC_kwi)xu@W(Q1toV$mj6qi6 zo9XQYY;5hTQ7Yxj7Qll1gJP_v`fA&|86znjY;zBmBTC$59B_BESraGe4K8pPVG2pK zh?p50SHaTW?l;hFTMVWQGgbXI+38Rwj~=ck-+ckRb~Fi3kvo{5*?g#|z-_TRvNV3E zu+Fk;0{tRho^f4h{a8*&D_0}m;`hn1f#vkbUK_@4*9w1g^7TNz4tc6`UU{)iAyi3I zY`qV~?T}=v>^zxQoZ|@>c%v~o3z}~3|7A5>MueIqJ&Y!Jpm>SZU_RrmDT%Sww}^$! zh!$Hpw&a`^?PLtfcELMj5u%x=EelNfd3$Dycl>WAsf6$p=)?(xEZMKDixd7q^Nv}H zuQXECE4%nC+r#?!6^R)|cD0|?=_lUbx6ousJpKBwLu%dVn07&E;B_#T3X!X)D~kP! z-97$oPJO7>LtJkBLyb*%xJcyKK3~^t7VMRKMTK3xHA`;JzNHH0+&|@5*aqGu06V`w zl=~7GHV7EuOE~5QkG|+wfX?BxY2fR_-HG?dhQ8{m-5yM-mLFdHXA}@MQ!d8l7UIxV z1>-%Hn-YGfG-Y@413uy-DM5i2Kd(PnR|wOi!%)G>X>|A$Y0|M-eP3aG6o zCnkN}u{zRSUJ|xA%r;;Xa=GkHC;mxQTe0o~p&_7K9=y z{eF2zn&;+69tY*547l)0-ohGL?%{2ZiB@!E5pA$w#I%MWmj~t%a z_csUnKovy`?D30ZX`FX|*7X927C&(d&pQ-A5ztU=56PP!$i?@>y(a6NKg11)e1Je( z5~e81+0045?k@(&rhx5IzKaoeK|XB-yZnbT>$%mF3EHGj)GiJs_7F9F`?^47qfpWC z@J;`qpso{s&36+gDEjT(^2hDPNNbzq!D&@kmcqhFUSV2O15%IOYy4MUewqqti<&Rv zXIa(G6ET>*O}_S0uYq@iCG|7w61IWRpPT!kb~X4NleK@Pyp~r0&k7*90H$wFOO*Oj zNoqa_$IJjGRlN`qAP1QO=B2zF{kGKrpzZ-W$)wHT1|X5-&=P7&VSR~M4A6sTD*Pwc z)Hf{-UFUB$dD;qB@;e3L!K^2?mYTz6dhJ7Aj?c{Mxh98HxO4qVks~-(<_zZ~_EF~`*y-bn)8)NjuO||d3j4uS zg6rBnV~#&KaB+QQpXfJfwzO07=4&LOH~q?Y%=E2v%U)SM4!+)%)3MmZG(Sr4m2P2i zvBI#uhn2fJacuQ$I{L9K;5NDeK9{{3?teL2fUJ{dvt#A=j}42}s%zDi=ud#F$zd}c zPDgU>@9h$-pU)x(9HWlP1qrY=EH`HAtAF38?`)oXDCmpRNBetw?-(!n$(!=kqqEij z!uT1xR)tXHIt~T(67T0Hnw&q9_mC81*d73%foUk}CRY!IYFzyH_MQN?ArOdQX}-Ac z9{ksqNdiGZv&)7sm%Xly{gC5nlcUW_C8|9f{smA~05xUE$@XQ=W9ixo_pK|CV;TP% zB7{gWpiu!fZG$yw3pF2Yj|=_wtAPVesGRR7F;P)K6S)!r8CDb8I&;nc*D5F6+*2r1 z_<7eijBB35PeNQ2XS2Uzzmj)$l}4XVpU(f@+ALA(Um%^O20Z3Nr^?8hYEU37(E({% zH`YZP32y%%E9HC9f|1GO)(s&+iywfqdwGh|SwB!lbAr;fFB~u+-{y?`$~U2^G*9uX zBUU2a`9TDc1Xzv;^_+0l7U-T^8LaO)Yk`%Gg( zZsUei{vgfHI%0yY8%_kOYI(+h-tr(n`%OuSE7A8SFN=3ZWePopN4Qwb-T)%^jLb~a z%nWLZ^F+Y!|E68TfV@kvv0<}jF=`Bi46OOifGEU9VEJ0ijClVFwgmp0U35(kg_{EO;9<2+c0#FbAv*5yqzt3x%Ti0wcsW1jIwy=CVd+~$V^MbDe32! z*JlB-2JE(IY&Z=8aZ>*+41T3f-nk;Pe>bwhC)!bXFxwrLiODd#*g2S2 zH~90Wc~We&`;(!3)t-RyLl6e=gJPBd3GGlItqGrw0{Ngzxuez@qxz;Q$BFfQ36pgG8^bFXh8(?=BqRH(9>$c zf}HaDq&%g>RIJ$Gik(k4mO6YkeA4FC>3xN>uz9Z+|}ff``6 z-&NbqU1Xx5!Lu+p!qluyuHy@!&%r+c@2*mI-lryY9V%`M>1O$Bj zD)s7B1d<7&pbAKL`_{%ph;|Js7s=T0Im{v*aPj%~v*~l6N(JR)nS=m^dtzZ`3Qo@K?~|K9NKqnGih}X1ECH6R(zLDQGcOhRYeo>fabO-anF0jzFUB#y@{W#< zVq#*lva(vkisv@u%c(UZ1PiNv@26;>0R?f_bJf^TUHU zCV^WRKc*C5aDISu~k z0dl3o>bfvC%+fU(b35mWHFY{5AF_)21Zb+6q~|Qo)OS4C8J+!mxTB#|cqc%G6o$JK z2}t-8j2{3h_~oY~LB~3|e_+b0GDTvmd2kqS542D~3`BV?V9Y;V~9vlA5XslLo)C&D?63j%p72y`idufimSz2mlpD(p_f>xY|VD98vdaEqE3A=o}rm z&8G}|haSS|C~6?LVqBRZalH*`zrBqX2Fk7%o3ib-&U%A4$kF}p-}ftLLci)o0(99U zCxz~L_T+)n(hnV5FIs2rFMzU%x|`eK<@%K_-u;OxRWHu0)?2#uP8D3F(k|wDaqJvs zC~IS|#=7v=B(f{>A$6A!kF_x{Ub3EK;PGOJipLO0dceip75XQDaSlK6{Ak+|EEvBh z07MD`zVdCH@Xry;RUaFWyH zHzVB9ndB)@mnu$>LKjuXPeukvfD7zAg^<;ZKcoX{;C9$2fKzf>1NmGl<Gu-*&0b)Cr9 zR{c@zZD$+dj|r`#>4U%NIdeNz^<9`YZDo67`#J+zwOxBtVXkuf?Wv}Q2AB&Dlxy1si>eBr;1q@6E&e1cdO3z)c0k68azk@gjt%MS zF;^pawE;+!cgq0~30--tygsw>k#2z<`arh~2%p*~GwBZDtkm5=$?31?dd$Xl=vD`G zF%dxKDtHqj{t&DitJK5C6ny9W)^A|jksoIFrgyKy3)ZH?f+ZR|%QOQaoxd6bXG*}7 z8Z$So(9Dq!koN+~U}8+U_-WZX>S=SSot{L01=b(yMCa+I{b^jv4Ag!WwlC+wAESi zqf~ZoVJ>QX#jZCc+V&-;)@pb>31r|%-1eu&a&kKhG4ZedLN*cHrPxka82r4j5bB__YNsPRbtM zpS@;S{a7^N(5#n^NrM^_C-i&LZdQQRdH;EtgEx?ZKICywESQXFfqZ{!L`%C#{nQcE z3`&Nx3+x{01cY&X?bIL$JzpzCsOqOoAm2g9%$<+akSHr?XS&6bM;#sf*tH)>H+KX9 zeEoaV3Ib}RfG*_b`f;RXc>#Dpf%SBJV#aWidef%xA^<=@Lglfv#o+o1v%bd3ZXa1X zF-QQ^Ou#*ddbGNYGBc7+Z4yCW2jty+ZRUJT63mFUxhm!Y<$azcEQp6Tcn!28^956XO>cvP za78|)Z?;5&Wb5{dLIo5X{&RVP$%lK7MTmgN7>$-CZ1J!O(GUed5@?gIue1LcERg|P z9pLz-VT$uoK$r8!pIfz5?N>=)(`RQ$$NV8jjCZzL1&Zs7uvE9SG>|WM0mLMS*~)|` zJ~yI(ubdF2+yH%r_d|NvBgBf=cf`* z7H+_Mw{SUu{v6NERuM>OKJVbR0!3hlmzx{cvV+UOhXL|y4s7=xf=vK2;bP2=H=G~Y z$qtMak!xztQQAFf?U*~bd$gybaftU|@2Ub%`gC;-7zN-_SKkICX~Fld*ZK8Q3A*DD zZK0}w_NoJi{zK=dZ=lrzG-vj(Koqto3T#~v2l8g%56;jAVHb$4@s7+t@5ulD7C9__4P?&4Rt?uzJq(codX!Xi_Z}ba11vPY6iI+*pw>T&qM$0rVnjDj z8*1;8mF^iOxa>({%x=v&W?NKfk41zC=%uld)uVpBXhu5lt1xKF0P+6m)X~vS68ywV z))w--_yUOn`CWMEJuo}OY+exbuRu$!4(Q>q^3um=PME%ZoR1kWDDQ(Y^GZRJ>jgHu z(*O|KtLZhJP#<{eha44$;_mfOsM|93;GE*2mm3)X z3@$?vAUMl+9_vs&FIHf*J-V{F$=d{qd!T2t8#RJFb-T#j^!{MWZH_*J_j?1v6ObF$ z6g5BDSk!S1o9cM=3gDY`;62qKH#1Ofa9ul%>+p3_OgQU7Z9((NR+XWZwTg-l)KPU03o0>&@Ynlx8 z#q)K!3naxMH76VA>1&|zmC;PrCog9r(g$R`0C@ueD6^-_ygr29l|jw$Z2I&u5MXPx ziQC7E*9G=o**<7S`@9HcBHn@csmQrCH%(V!hhzXOP<-yYpbymJ7gI{Sx0U``#sf_1 z)@@@c{VqYU?QP=*KB&q{0ipnzc_-!tC?K~$3Ie9F<2@z74%_%axC^`PS z$0KYKx($&IsHHOP0Y_yGX_n8}-d*D`0@I{J)sN+Fz-sBpaRJP1O9QUr7=z`ycAgL^*# zO`$8OBCui1J1kilj0f5CvWx&n2k^=KYlyf0MTgs)u-aqG2*foYKgKGA`-M+kF|*vR zpHteZ;vd69wXD}lW!ACDL?0&tw4CZ}3PBOmhI4He{4l7n=^bwGq<$IAUZF#3Eve=% zt@wD6w*(VG&LScs?12Im0P>4|k;&1Xun5r|c|E7XVRSWG$QANr@w06!nC9Tmd!yLX zcb*;MopPah^4_k3&94`mGu6c%?7F%xXCHfE3oKKz2ga&SppXGc{%7-90#(uj0`fdi zxKZ5amq*=?03!{^_O6zIU8Er6>jE|ba^M0xgr38W_^z*^-4@4C))crFZw9oyXLUr^ zyFczgq=OXim5;W7BLmto(n2J_LQg3!oaw2{jTW|qm^wf%eE~|SXZ+5S*da3auC0Bx z{nFF%613Z%PL!7KU=bAXDr~O+_qH_3H*Ei+%}ziTQKjSSp?Q097-pboR0eW{{A%19 z6=)zuV-CV_1HPny>qDsEiEQ`<~8`5k0XFr~T#FBZ}YU?a15D3jdOM!ga_XVf{ea2ax3JpCx5r%RmQG!-S zeFnC+g`+gww7OJJpRa7+m=%b0IVll*ENRt899smob(L1+idU^_!#qu0C!JG@H+Pxp(qf2)PMnGDJpW_TCi^3s|ko8_x*dfi%tbT_XTSGCX;C;nJM(7qBD7{=s0w z#gLTQU!^WlGv4J(v1*s<;R91mfHgFd3xhb6?8O%YLdtXM^yWsODX#);y$x>IryyN2 z(!Vk~dB%jzk7a2=KrH_LMr^?iT1*Hq zf5N1u$t?$vbv=RK50E#%)v<&;HIP5@2hwr~{SDAaVa;>GcX6Ho9|7>aszJH_Vy=GE zZLF&X48E{09ABH&94-k_e4L0}1;}Q1%ER^h)>VQ;M~ffV5SB+EbWDwRIf0@ULFawh zI|@jLF+54v2x4O$g;l7~UI!?g+Uy*>-+b1iX&>=e8{gkj7P?BJ%$%lR^fmc9eb((u zB=<^)2}wwd80lX=H^EK6b(46kL{t2I32%hTfkjG<6jDi1gwI@B!p$N4)T;-*hk!0k zj4#$!$~sIiR^ZKqy0rq3PIDsW>%vm=`(7>+^f9rC@3g$ zRB{hye5v737*9*+)nqA|XXAnRgPz7SfF2Rcm@Q)9n|tpbBkJ0;J| zddb#r%?;6$J3ZPFXvj#h%#6TgOBbrRB1u#cfvS!O(Lr!xY4w!E)%wF#oLq^FYh=;A zx~>b6$;l5q{Ed`P31HB!;aRs;E3ybNtd z47@Fy5?oFzePR?E77;v+q=EkaG@`_-(+bnhf`7VKNZZ8fDR*fe)qCXgo?DR3XEQ`# z{d0MA@2AP>^Lr;2!F!)X5nx8m+N)c4nO#tbrFL-l=a^;T#(1Utw2;Ti9vJqdmZO~Q zg*ng89_^uQe!@jfog^N3e?_bDg}a9bo^QT-ajNIpiNPEg2Bm|rPp?1gO?f$(t0wF& z5qO`wQNkm-n4&``b-Ou`TweHW@5e`6Jo0qB#CTrYC ztuqM8TlAq|B`%< zdA_SGFA*=I_fz6oi$7p=ZxOJ5cFZ`~7zZ~nPt|*%Td2JTNE<|9V3bw& zSs3NCUxNDsN}-{lv;CkEUd*C-+qc|e&;kr-HZYv3bp>03E!U`Ru?V_j|S z?eV|`byOd>AKOVgQ{lICW8~Ejb~j|*g-Kbp$#|?r#%+=LmZ8^(qf}vLKU2LeSX|w% zLdx0u+1$Ve{C?4AOP8ow>!yTG@nl8CkKqxHr;1S-)r8F!Sgo=16n$R$%Kv_>X7h!S zaDmMzsdjE+7gBg>bb&B;)v5S+d`#!IKfWvK<35$%6AGaxhnI>RXL0pTuYEy5yBEFE zg+r_(dO6B9w-4J+?&>Wb-ZX4@*6(v`G+O=%E$wPy|D6q7e2QLc?3l8zbnxEFHJ;nT ziTn;G;}zCTpTT9-c^aj+eG~cYQl%pq!Qe45q3zdJNrJ9BQ|Ga<81yveK97~zNLU&; z|C8p2FF%73ej*mkPQtvryxY&;>GVmKR#iJ9j||O+ze}CIz2xl{vr7sEZ~cauhG8L~ zr@B>+=2Uxv*9AY|%+^@*)Y>&fw!;m#w%8#`&7$6UKHx*0S{U9JvoXv(^3cY?pkauY z`pr1$_=;ISXV5F%RlO#|!;owzm@1CbasuYWJBP|?2Yve9>f0w;&va9>M*_hU12&TN zHZ8{LrW}I>xiI4?1`jY{QuF?sBXenKX<)vLh{+?#STxzv-S zhY1q%r+O2rZ2xmoCIRAvRcU%nFOQ*xO$ICEb(!>2O+=K-31UKjlDkEGu7G26cv+*nf@yQ@4 z+u>*+2vn*=D-nf0{A(m$PkEAaB!JJ@`?5$Q+&#uKg|80n1)Ob8C7MG<9$SAl>G`tq zBe=Y-elBFfw9qQ!6RlZaA8)+?eNKn7D^fwI;3y0^}%pQ2F)O9VOAb|%Jz-<&f*EQ&8v<(TBF~W^FIEc7iKD~y>sWzBgd;(uhyNc<|euCv?agz zczYZP{z3(HBdZ`|G!Y#(;}g#v1XBW+$? z4kS7G(dk7{j?Wx4WA)h_nX*jqTDZG5b#&S~pDwk;+VOE+>SW`a$8?XjZuW6KwTba# zlW9ytfq8kZ-l`Mp+q4OrHMwp)-Qlcg9TI$>vZHbKj~Pd5+k6~@9dc8ZL`AOPeV?lY zmv+$1fE3O)0p8Re1to_yK zYRV(ysf}>Eo$EF4Tn#(pFdnr9uM5HDc^w{3ui{f~xMu7&m5 zR01LduJDvlN&ofLHE(WdL72I913Yw-Kwkc-t0}{X#SK}>`nQe?N|cVa53>qM?u9uk z5FNwnUQ!vUG*T-IAWvVOZX~*|RAbj=Fmy(YosDR$J?{Ai#KsrF6*~K;zG$z6@VE12 zfEGsV17Lsy-bxQs@fT(t^qcggC6Ji#q z73u~nRURDO)noHd_?*m19W_M5LSqvCga(8v7#AUrcbSvhO5ou2hDBd~(~P z95)&3lEPaeMG}K2<0!~8x*9q zz&M0K&`ImBJP>n_dWGaP=YQv)Nx^q&sxrIHN4B*sUm1s+8B^+e3foRTH|A zHDzIn*#`G{gh~7^7+AZ(KK<&TaMsT3=ObB*xQRe?I^E-Iz{S0us-lVvv*etX@(tX1e0A(< z9?_5v+k^{1ASPlrz^LZ$^^f6oVCsAr$kmH_O*GX#h0#Bq&A9Ko{)K9HTSFk-adOH7 zP-rb|>gBaB!L;ye2~*Kjj#ZA+%>jFreCDiyDzYucADKFf#f_Y(Qe-6V;VB0s`Q@%1J?5mbBEA#XE z8El$N5Cn)ZPItF=NqP&aMkXeYX>o;zqR89k>1SG3@K})et`)mYj^o(<_&s0y8$84` z+NXoEl|Xkq=bXFtkwu2o{JU6Q<4L8xXNSJAo%%ch}26?hVNC003)MpS=Z{ zg!YLF)u)7Sx^;-O=_Bx45*coGvadX!=v7tMDmqLR^hR(_S*jri0xRXX#ZEIcw;N&c z0{AtQFkKYR8``*mvgLZDk6?eSfa+biM^x`8@Pc};YhKQd%79IHY}2%ucQ_Kj{|KDN z&A^NE*uds#r*l8>CI=37!6$D9MvZ6gwJCS+NQXyxy7b+_FjCdj$Hlm@=%U1_)=zhW zV_qoDtCC%}?K?c0_Oxe0^?mzBb>xcLk?uM?d&)$^Acnf8zz4Esp~psl*Cw8fykrDA z#LG!bga}_=yS7A*4rP=L_DJH&(AIoi%cbw@7a>c%Zcj@p^X_LWE6$OgCXZcM1BlaI zlCPq0AF3@~<}Gl~nQI=JehUk}EF_U(1&MYp z2E~0oz{SyqS(&Odw@Ll|b@9D_FiaZR7may>& zO~j#HUl-N|f9hCsE+{w*J=zWseyfPW36TevF94Tcoz;Y|bhdTNnEiz7d->Fl(O@&_ zrCa>$bZ^Br@Y?__11#c0>ct|AK|Jhcy%oGJ*a!CDW$ydpUA1qMwND5{s2=N8*VheK zfhsB(vys{L`#{+z?Ct!!=PCqpO|_DB@CV)1wC?N%Ghi*a^MJ|HHGc!fSo~u?P zeU4>G{xASZ=`eV+i4Hekg~vHW^U!p#Cpab5_U0x zpt!hz%B&Mvz>fh}ugo|Gx`ExETOB&Hr}j>0ylQG@Q@aQKCtxqsv8zuiAE~MFY~Z_H%xMA~fIz;Kju9)m9(Xw9&(} zSKBg+V?5H`VqfmW!H*goLG>G&D8AJ_!WbHwz<9nKcx+NKaS75&cM+o)Q@eV#Z~IUE z|9~{a3s6_A*7*OflQr@D1s30NTi60r?OK|Ad1U9;A-X<^p>p;`AJLt|+vpCYU(3u_ zf5hyir%`TD{g)ku4b#UTI)?o3KjC^g%XZ0b*80rlwwGD9=vd$<075CSjU&*ez`e+# zB)t|OiX-Oyr-8HGw(eD`9g-FFctQ2?a+{808TZrq(Qa&FLPG?cXci^6<~E!O5}TWz-%S2Q+a@V}!?uqX zq$UulL{HNRL6unA@pAzm@*Msrmwsc4ciKF$FnA-|!_DR_%x80c0Xd0(uB4}cWEi;4 z_2DbaBk=oL8kt15%C9>8j&_ZoCa0}@)HC~mr@&TD=+Z+_ssJ#~DYQ0^PmCvR z*4$_NBp=jhz+c)Zi$ciRB~Ei)w5RPZ-XHJc{clxO8|!r@GrR~c(@?4GI4^dvp%h>W zem;Xmn>uN_mgk4tSPVejNmuqle#qk1%kZ%3R3~5mwF;04IAtxy-X|@cfEM1Suf{zo z27BH&)LiB(0_b2pjZCG}_u=-`ez%{LQKSP`KZlHS8dPHg1ZmNW+U4I}GnbOzTtrCv zrIVnS0H|^T#28}wY?GQ(;9Mb3@UlT1C_4f4*<1tVXP(e~aQKUfxq(P(`1!)+iJBAo~ zJg6WoQqrP?NOyzM-CaXB3|+&(vu8M=_kI8F_kFI1KhEJghxvZ@UVE*zSA0HeXlB;F zzYGSYmJEwN3zhP_W}C%x!kG9q1#|U$w~jn7f@X&OcuIh-dZ~b3C--dz;oYPtb{)i} zl;y$eRJ;3rBUEaFhZ9vulZi1m9qM!TP13T%AX~;L1A09H_;V;vn{0Y_hU-b~_T3OD z?v@Rx{RPYKe$)+5-OLb9dlaaeUGQ z5eCRJh_=RXffkMnIgDW9up1B4)3x_9!5!FjNhn)!Oy9O_)Ybg`Qpl3i`Is zViQEI$i6Qxz?uBu!a9n1yOo1saAxJ8!V6LZN>FG>f95uK<6&_fCuy+*N>tu?)$6)i zbGX9}I|5{Mb85s-fuRFGZC!UeL_qm6aA&PMRfS=j3>2C`pc;Q9y1O-=KJ=lj74$cs>tU zu3B|*e%5NGf*gCgpcS*cp0}mFy9)$TKKB(#gsF@x?+_e6Vh7bCDDzbXpqehFC~{;W z6!$9YFEQn2Pl`#?`0K(h^Zno`svT*{EC=-~U>Puj&Rig}j*He|0xz$C3U{#S<0mnR zAt26{#4ckN6KH{ZUlVm?auTj>iR50_*Wh9o4hOCoIpQrOk>hI0m^MfR9LyNMliK=g zKAj0NqGOHGfF$D5^Yb5U5Bfm0G7H!XCW{b$vfE>Q-_jDTFr@AA5sY0$y}TRNwKWIa zz`1^{c*rd}*b_UgK;z0r^>QEi@V{5_*~vGxgC=TK;uFVJ+ok8v$HGA(RXed-S)reA zm2l#4*Fk%IkmCb)ej})4WFI2vTXn~aov5tFv?m#UG=G3Rc6#)-d>^te$v)#$Uo)># z1pEl4mZ#O2^;+VS=||fU zq_v@jmha+AIgBhnJ4vlq2-CNbNdaK3$?)4*|G^-IeSEiaB(ykX)HOipuV8)dZHA`Y zEZUIaq2i_OON{wF%6IIdX0tAXC53PoUX&@Wy|Z+LeOK$OhMC6wR2<7I828bqxF7v} zCTs+MaPapLT;$+0#>i}%ge97j4pPr7gz4B7g`B-QGm_snA6Wc3 z_WZ(>kg1?dadD1(&n>=$ZAw3dcN}sj;@=*T&R@lwCw|SE2;#rjBTITJ+&Yk6*4{t{ zL#_a42C$?wb({E4L}c9s)d~J6P-_E$Syxh0%bP9lj5HCb2zlH4(4RV@Eg4+Iayk!6 zIV~6>cy$NzA_QQocUUMVI3qtgxZ!=wBCJoT`E*3zC|m3GuYg%DM{_vfc`>7c1O5E` ze0}*`cT9D3#`=5h=ocDcQXCR$1xlft{O_3Vtqv4Ccwz;_pWy1^nZ?7E) z>L)6jGyZ6;F50u3IHXFZa*C1o!+#_mbWxPk+gh|MwK3=O=g*F!%(dXVB4*e0T4NEu z?(hR(hv1&sS|ugcRDqMlUwifH)o8H|X?A+HPATm|UKcNU+pVNFSs-1bj{^DL`o0Eh z8bXQM)(@7PZr#_V!H9HMDJb0gqW#q$5tu^6lQrs+I~vbc240G_>%ECTLHCoMx|CFr zv4FaFH|>Z-_9mMXW!c4_bT$s!M_aghMu;8wc5h&H2fzL5TfwDwl3>4Op|9))Mdcz` zHuv|zQVjIX1;-zbW+!(==mL^QA7`&m^>A00O^7LBA z5kpaVP}7Lq4h8ZlF@r;E`~C4OucQ^R+_Z-&C(XG%IWHB@4c){z&~LiycwX7rnS4vh zN2e8C&PO~6ZM!EPnv1m6LZbGxCr1W{T}W@9gdKhK74~X|1~Q~+LbvH|t^T7(;W6l| zgb=xTG$}DLG2l&6QZg&KCJH^Ypk;>-SR9}}1aW$J>Q$^mLbyQ_!=I#Eae(;p`0~b= z;HoGQc$Kqmd-LZLfWV;eqhsSFES(|eL?&uXQ|CAd8ic^&g7h5u4|XU^ExR*}EJ*w_ ze1rA13*I|*GdDE3-MDyl9LgzEoQ^RuOQwK1E9eMnhccd<4;EkHKFFe5vYpEw{d9~f69`BvhH$JX)uo-ze}t$Rk#7mc(LU{b=-;j*4zX{gsy>-{ll>KBFTkH zH+N<|DfB)94!+zIsD)H8bvS)x7qmILsa~XzQa(X=h!=8ny;A?0CUeiEVNTiKyBQqY z42VL2!+9_mR4nBNBcI=WpNg#WZ8+@lS-fRXC(WTJ{6`32)bNBllwUnF6OF9U?aaY@ zneOy~Jn^CBH&#)NT-j1uq)WdmGg~8e2k;$tm!I0mLy1F*%Ak)kopCDgt#2aB;|rQZ zs?MTaycV>0z0p<^3eVqj=-=05F8gJLy$uGTr8hdaEjhyvM2M% z8L!E~^UJI*`S}p}&zsEOZW~NYyb}R{CiJdKgN32ft*h*pWi^SmMaC;#Ch{Lh`fVC! zzV{0Kx%{_A69FyAe+jezsw1$s{-~||*?xtILICkhK3mO0t*3Nb)P5L|?Ou=>^wC#& z1pt@VcFo4PMMCpyP=VAETzqO2ByEg1+Sq)ukW=rvJ9ELnm&WKL3E=~poA?GJL5y(W z!@M}eoW#^c(b^2(sDu}&-D6{g08+PMmjOQpUh)h!>8NmE`wydp6Rp+OR1ob!Rv#F${ z+(df2VfvzZ5B6@N{O*ylC*5?pQXdf`Q|4Mj5XyEU&Skyx%obP;7vCD*-t63VV}jnh zPq!_usa)C3HT}mi#1-5bx_>N_&5xw0{%pQ4JTN_)-ysjM=ECN4nQa89$ZCe;pg1;!HW2 zB0J3phiFbLNznWB5Gb$zsW@}8(7S3qORVG-g=VbU^N6FfFr%*1< z&d#bOx2&{-`O0~9Ida7SFB@GfD5T5$f=MMyXZ#X=RRTw?Ekw*)s>7hkr^M}g?q(kz zyYxN#F$s|$0{ms;jWm(=P9)t`QiL{NUu>DI4D#F-VW*v58^~-G5Ky;uT#;*!LtP`sG76L_)lA?LoLg}%**A;(zhpgb92n|j~aftZhO2YKY6ZKp?zf8 zBRpfb{nuY8lwO^aM02|??HSdk1Tg6q6?9vC{~U5JW{+a0VDpRiGpXFCESDop^}g&( z_OOxa>dff2`b4m=>*)-}d$e)!L>jOeHH6#QI@(Tz=t`8^ycT7sxbv+u`qTDB2tI@D zz}e9%+JD;bLaw;h7w+Wr)Ki+!cc@B3n1dlBeGgUEjwTJ8Yy@p(?R|9=y|0GcijB9s z`Rwj@ue3@B(UvVriI7L#>pOm-+6|Q<^$12bkGpboY`qLHr-J}9CcBREII8dbVf*at z@iKAye37d<&#B@4g**Gn{?(pH6P4UL8H>gVU8#e;)1n`mL>ME;&SC@Lf#_;@i>xU(oe~5E@?V*iC7b@*N7k ztxc2oLuLl)w?m8D<1p_^bYno8N_PBImBL7YS>Km;&N{SuHWSDG-Cyl#vWLL!#6xXn zPO2i4Q0DHEY~EjWyp-xPHN~lxVLCe%f^x1U6ZCYCSs!;CeH^h<@ir|46Gpf|%kWv- zLL-%`yS+mVHfeBGa69E@=O~+u0)7cDfHQG%jA7T_3Eq)S3u%lg8&n;~-Rt5Zh`&?K zc8jCqGzI}lGbtHRn@@cNOpq#FAcBx3;l=y!i<1ZM4c_4oTMX+z8D27?vJl``g);P4 zhiNa5JMsr=4+It7rW(5~yT`KRI?7!xRG+Dec&>??w#MMZ;$&i_xL>)n=>0-N{pXSq zz0V^8#ZLZk?O1g6MoLX$?30>$ z)CcP5BcfD<+*^x^^ro+4@ylx85pnECZw-dYhap^z;}X0yc5K7BNo1>&)5>4Ot_(5{ zBTCbxTy0=Pgi)bC``Q>>9=&JiFAqDIx`l8`6HbN>w+4n8eWx}0QVA4wj>H(L=PBW` znT(GshbsHm3wW{@qlnb=RGRbP2-x9Ef*B&6di8GjcdYp@Ot8xXg`K`!nvvzn_3}r$ zO*N}yIFpL;&xSznTIiTMja-rC=3-x3MZSHZ56y}Dfh{^Gd9=v!_;|aeKfPS-`_6FA zt5O>A0;Qe3tj)!*)22N@V+3`xC*GU&I*jUn?eJ$`E}wtrYFZYd@JB3DrKsgVytdX-LeIzHm&Y&qqfb>3JG7Nqq&eUER) z1ioLOO{Y-SQfY7ZmI#$FtU7Cbb9oketpDKVnn8E$A31bkfODrTU?yrS)Bm7#fHg#q z@kQ1%iT&m2&d=3>5GnEo5z5rI3{8aXT83)%^Q_G*qlGX>h6QEwCwoP`r?ETdWx1HA zpdAu#hZs0h0K@g{kihtsrd`Ji4U0b}!f>G80WsXshBb zs+>?*+7DqqJGUM&75Mbd=rE}mSJ~;7=%xgmAr7q&@8~l5jzw`dmg%j!tpe1sa*2uB zCap8Sl{JMr%@d~bk3y9sm++}NT&I71*+-UOTBVl#u7||)6z?!!r%im`%E?)$g$J+d zDTzs?LaRO`-;6X16A*B3;0ot$)C!tTZ7b^e)`Ww@)h8n^s=AT0bzqS-jk$JLdW!L7HSEWBA`^Rhsz_BwVAoA4p6&9mDdXZ0DYm zV7GnKb$~8&Tr+A3N5RJV$M<3jEr5^vETXl&Ke2MMJLrwOS*r4ssMcW=C>{;39ww~Q zJ4h;5%^2EkWgll!XG5+YJFN_C)6zm|vV(2t6kFX0V4{+1-C(^1?9 zRe-Xp2^Jga@YIuD*wxh5$$Ryy$8vM<5(B+6WP~jr8@-~t`hHcj2cgD0o@;~7>Wx16 z)%GgEs@3IbK5fk}&5gqZ$y;0^nY#s1)7>}QWy7{hkyj~~m_I(^PLk(I5g)xd7ZJ`( zqgo~2nz17Tkv>udX(h#62SEadBVpzzyXiU}7r3t$1v~G6t%Gmjab?%lDDK>BUazT- z7P%<(m!uMs{Cs>ey5JyVV5=Ir=KXndtvuGl&tXDutzU}|>a9)r(EE~?<_mR?Y9sW} zAyU`aUpJxel;LkCr}uqJOouO)JLK{*Ee~GATdp|JUkMiODdgql2e;#kV%EpEsi+)B ztJ@MFsd_?40SVIDHx+YBhsNn@Wjs*gV7b#D3W4gF(3ezrNqvAQjX(b2>}qlBO-h2~eD-Z9!;ErUnuZ!L3G@7iU5@g~ zoyryII_KJ%MMAb3msES-J-XXWe7wSQ8p25xuhiM5T$>AbKKIlkBG`?4BnDoXzEE|& zHFCV1P5Qt>A7Xbwg^;z;iu-3a#EPBeV0PC^W~#ge8N3$ zkor2YdBca?oU-xP=mh1$w8L~CGZ*LR_zsj-k}@-@h_yJZ%?(DtT!)*}s#Fg9H5)@N zX*1bHNtWialGZ$sLo<183~!SwUPxn)81~!?ns!(`9EUE z$DpfQrTKj*>%pwf{%jlb*KD$3ETz0mvfvzdYOjs%f+*%_j}W!nJN}8OF$9DjT@Y!* zFYUKR(cCZc8?`KMKfwXec?0Ejb1#S`? zH6bDgb87a`w&bO$*caK_KS`|$3Y|LrzEV4T+9xnu@GZ5yEI7zuchz8?E^ob0-(4!?fwQJaBFEr78mvZ`GUu2Sri=$)=K9|Ra zYO=Mj^h9Xc2L-E&{OCJ7KfkzZAo%q&s)VQhIbARQHLX%Qs$Ru-XniLm^z!&9pX?jf z@V_&Sv^t}4JgfQh>+j~FBNDeEf}P94FIeohMmFuK@Ing(VA9K`=6o;2LHJ2ov8@=S zTXtYG)9~D=W%kjJg^pWfM=Q<`jt&-m`ki;WZ)bmaDD3qL^`%KVcV=gD^0w3o)lGek zqn6Fb>SfIwhVHSQ-uM<{c}D9qw=iX>cS=W`?3G-jlajEbFYnVfk0ugM(1SVkYN6I+ zUrtpm7ghLV!qpR9L+v(23UnilU;ZuKZRxKs#Cf0y!}S=KknHG99>S99oxYzmyA(SPK^7)_ z*8YJvsbR>~o-g7{-NP_jMuB8YUt_vhLjLjxWokouiQ=QHBQKVoU4l7nHXWJB=$4D! z!bR77d4F?FmKOWb%M0r4%WCF zG>2|2PcA8qwPhU6ojp&J=K1&c+MAwi9cs8tu96Ph18ss4sYQ(1|on#hcU0RzdPsMTWy4W7BXL zrP|qo0wPr+tw;Avo;<;%9s&ZVRnEBuJx4X^*`7QeM-}hi!v`}h5MLYf3CsTYImLQI`W$VQN(#&x9l7D zsNwTb)m~oW?*oMq9+9Y52+Mx+=<3sojg9Qaz;xBj5n_?*u}0>iG5H>kt8qK*lEDMj zawcC%Sa*tfIJx!e_BoCF(!hxHG&W0?rP6{$kz15Us#PE#MeZ*rTd0E=Qzmq#7aaql zOr`1&kXuO;j(Ld?q!3KlH+=wC5R8Ub*%EeoWRW{=zo@*l!e3rWUWGIbYUBwwrSbo_ z(kz4LC8Sock<}~dn#^T9pahZ^5Vnx>+Z}vi$bO|F8P29Xa=_gmKssTXa~GxDGol#; zLg>|vk{{K(R5&j(cEq<>c~HaRn|#)8}U)j*O@#EcWiEzD&ww?|z3+(XV6 z*_B&lFkIa#JCm%`n$3b#ZIp302nseHCt3V6cxPh$0reyLHy}V-HMIS{p!&*VFR1K# zf}cV3h<})-pi#<5vgAK0Zj^ynUU2?&hn=hdZ@*&?0;Ws>@l)_6WS?~ zZA1RptcR#mNd3FRk~yKs@kDCEGNMHOngwdJagIs#diQ#$QeEoNy~Wy%97qrqbCsA~ ztSdg{GHJU#IW`U6=aA|_Ap6t3(k=K*7C;@v5vJDaaSS40!Z_Y%r)GQ3qq1f3SrQbV z5eJq-Ip4wkU|HmRigr`U>{BHRr8n6-t`T%`5gDHVWezvZjmDpSKU3KtY)*Y1B191^ zH%5Dp(aAQeGd5K>OrYzHgZmV4^Pj(FG&#nu?a7^$D*|Q}JNjt~`%ag#t@C6INEFFY zjjil2Dz>Y%T>|t|NN1?YI^1HZXy8Az6&Y{;edNZK#aAP^b0dd%Ae#31rFFL?Y#+_i zsX9LTkXP~c`|}jMdTdS*&w)pTJ(-}OJl(X6TlQxAjF=^t6U-k4&KuFzi{ z3eM=*wTaFm*2!7<*vVaaseC2H^=I;#A_TuwFGEQ#NL4 zn|jvM(&x!?Lb}-=v>cTQOAMbbzWHjsg_qZRf> zHPY@A>s{w+8_`ZIj1U~Dz|kaf^YsX%kz0Rd;LGd>N-=bOE?`GGPvaPS-~C$qjID5D z(Qg37O>L4p7W(YD*_%w}&wR`ygF!3l*GeplPxGOh;?MYs3Tm@CPJ@umugpElYr$`R zDO&`9h|M&;ZN0lcbyLcdKC*kF}S# z7B>)PeiJMF?I=JYnRwG#HuIgrM5n9fExJ>CeS#Zv<%^m7a8tB?a)94&#qH#J0hi8b zGRB6`LfWgp6loP^gG}1IFyb{^bN1=nGez=JqSoI1t|T0M+8z_j z5edyp%jo&k|61K{wG&kq&kWPbcXilx?W;Wq+`<>zVRLWu_z~HePqCPC;Pu&VK%Asu z$7*`l)E^hrxNqER*6O}U|EB*Urd zk%%c`sVjYO@L+g+t3h6=<8eY3WX=pqZ5HK-)(lbjy}~WedfD$=M&?*2ay+@SYDG6S zQ|UCZmE^RN#UaF*iVoBH%A1WEIPJ3<l&#sDmQ^qxiTkr`Y&HS zjM=x=h3im<1QY$yMjq2F=tUZeK%US;G@qRV(vsfqW;*D(#tG>|S{3^ho8Rr;?>AGctt2}u00 z!jNao`p+>)gC;by7wEwoDp-m3tUbhZWJAO z3W^gy;#bVdZ2OPLGVzAqxl>10gZGlsoh2tyuo+p9iZXu!s@ppEE3)B+@wJP3QX$+H zSN=8~fF^0yz47)B-+LD3cpt5OFsJZCl`KC3(=3+$rvs+DciN}qQ89HCEq?dwOjzUp zqPZqbZ!>r}?y*q#>E??5XVE%jr%^ynNbSYNjF78O|0e;rg5a)R;WZ1*gzPxa`+r-E z|C33Y7973eh|=qH&=`XC!Sm;d$Fagvc6R&}nz->hHsk-F(hTEyt>Lm{?Vt2K3IroN zsJCkSYTfo*L-kAz70`(r%MawzE{JTAOMYb}#4CRVx z0GO!{;7Rf!%KvYVhU#1wEOBhygh%-BER~OCE)`K5uxCtsQRw{8`#}jjJ7lI=nV9`M z-~Wi>_+M4Iw=%^Q4qfxUL3rccHIBg2iXd6QA!t&~1`uBiFB-t20bHtpq8&Zl#0;EA z6WZ|MJ;h7*e_yX>2Iru;P0cmoHvhb)h697eDaW+a%>f4KC#JE__HP|@Kico1f#8Ot zDh5*4z<$kRE);;ioCrSIx)=m-P5#*wU08P>V1Q-}AKGBd>LSLh{O%A--_}&o{@@^R z4fy_xpd?#}X+BFp{{f@)SWlEyc&4(cDMhbw8c)~Um?61#Dp5gp=PKDY$?T?MUnbE4 z!LcCh#W)+lnfj6o?v50pw=NSkMfZ!xD|!Es9}y~AT=(+gD<*P9ul47x4|3FlK6Ci}%B#qwvn3eh${D%>9dli1gfSb5|eSNRs;ca7Z zH0Msl?!Lc5+{^GlMczzDCswdKW&Ax~p2@)u;AcIJU#ft&tpX0w>$xxYs-X!UDv#` z_ovY?xUrltZIzq{05>vT*+ z&$Q8>cH1@pyDT*(F`$~YK`%Cu_O}d}xl`N92N~EG9!x;c46rA|bw=|du!j=O0C5%$ zeBk?}6-K^W4XVO?YAt!7X0wLDv%ORRz@a(>8VsEW^Rr(uT;TXqpQ7H-k1;SfIFg

9lq*y$^to77)}9m`4CO6mnuf08wj(P3Qj=Ku1_69>J!~)?ps~s1I9HS?{F) z#;B6E<5_}IAP7SRI_WYh+9g+6#djRxAb`oUR6M7F1!-y!ZIYgbGppAnoaE-_N-`iZ?Ii=KXPk5C|sgwN83_mg8c z@%`Q5B>)Q7@c4}qt5&$DfDHKLCAxw?q$^3P)7B;d+Sb05k{0v1AF^27I0K-tg(|XM z8$MXS16~QJ*MMTtDXkcedoDuq3Tt(iK7Rl#EkJ(o zGaW%-C_=%Fu@Lg+7JYRpj%n8 zhb&PhB9LqT1Lj;?cb;eh{3gR;O+O&l)x_*5_?6S{1G*j#j^$;naQtNi-Ig|J{GUSB zZUBy6$2lUfIM!gCu%}m8*#Q@ULZjFI^waRjwU!CYr(VurQKuRcSkJM8{7zbCIId;3 zSg;~M(0uPTE!Z6l@aTkUQ*niQ=C_XG0Q(dC{2;-~ML7hZcvn%L^M3Rb+MBa(D9KI? zb%pvI1{7af;;~#aGAJ@SbQA-KaIvfq12W3F2Mf; z1Tw`of)4;V3x1s5V5uiBTBK$90K)k2#1<%vf)#FpRt5h(4o&I{v*dJKaexrZsw8_6U+e-RFWJ2jOFfJ&a3aO~{)A`HWbyYT7Bm9@XD!F>SmgfKtl;@A%j z+=rC7Iz;aS$}}M4fT;%{?(G2Bf9eZko$+#}05)oE$>|ITwZ#UVt!J-uJL3Wx)5TZW zF798nScVa1ES0XT_^N;1Yq|Hje6{GUlS^&ZXQ`3ZlRc%ZkqemDk)1J8ji$I;tM=kV#k*NT9R%Zrl zD}sGxiB#xESGJd8s*y;{Jcj}bG8Cc(3?2cW#871cg>4rwJTb#NunyvNELK&X5d1|p z>+}2uT-p4-cig64Oh_0lp%;Gc)Xiw#sABj@YYTrI2AqE;n1_F2v=av!>a;xoGP6R2`tVymhxO zYup8teLz>aHEdQF9a&C)n~(MEZ69zkS1pe66QFi9w|U^Za^qfLI)HIk7={gg@1>As z+S><;_28O!@;vkbY{#<`ykmp4_Rl#t2@*#3Ycs+f`7izwhdkK@qb*YUsVS--0(8Iq zIm%f!?D=hBZ5F3(9>cf>UT)Bw6!1sUA{{cku9DQ}3iJNFskN270?_M~S$5fg3UTJ% zakhN1(riPT_f23(?7$3CJom+_*@4#sdd6h1MppnrO0aSm@>_KwImMYzdVP$&7GBeS z?bq`gA|GE+2Lz{q%FV-&G(AAaYBKmtFrbY!hroF91LYMA{pZZ|h>5XIkeJWPwc%aA zcF`^w2$9VW1R#Koo#48gB6yj^D4DJx$v(0cOn#}VkHqi-|N7_|k(uGYXxcG9AZ-Gl zw{=Iui#wugTFsIGkPRnG4z=)YCN5*7^NSlZO5@Q71R~DwL($HOC7=?tt z;AM$BYxAs#p1?{!?k2hSA^H{Wmv40?B{yD+z6lr!7*0CY>EpDWsU8cX&|Qwb>TpUe z{2dHY)V7cBbT>Lo)#ZAdIfkv-ffu122oSDGW8eQMR%!s;I|D#00%V83AA<#_;;7yQ zq+z1`^R#D^j*gmx7sP0}&6c+Ae5xf!J7c8OL*LR#`@M>m~)sy5d<#{mj{@ z2F$+lu^tJ>QKrgv7Z8b8DE76$R0c3vqLhrJJua(_8Qdnoi~(U_mf-vsbx>}b3!)9R zJqUx}3I@!j7Alz8^XIS~%Iay~{Vb#)%U@<6t9VX&cku%Y+3?X z?2{WnlSnVkg@iHj!+Hp z23zlsIG@)_~SJ&cj5)RLx?sKvmKdx;c8Ou#ihC&ezmtCxW=fysm#S813EI&M8MIV3vW+l|X2D6|5UK^y=sXA3`U~VZ{ zjALo|pTMC4Cb|C z9qWdM9x2E!m;ML@qMHPvO1I^YX84=u+4PHLAZ)umzF&;;F-g($M@;fPTy39_u`AWB zGUiMgjh}Bi^M<1IP;(EqYf>=RcqhQR)9cq);TEDda{bL~maAJTcSXpFMJ!Zljq_{l+ zoS?oKSSz$xGY&#du9L1i(yk3{9LMXRjo#b0_mn!@2R0si{rpVvs4s%c4$$JPxxoam z2F#>@)2(m;%cooQ7OmsaDSArRY3hr{tc05*vv3D?Dk?Z65j7W0u&e4n^B(0yVB8Xr za4EMs2;a3;s@?ik#1k2NjzQIr*O)C&Yf@(mNjxA<*Fiy^;vkk${6osd> zzo1TKAy|HoU+`6T*`NsCw-M-m&eF7sw%<24gxf8PJHiyOC}vuLz#YbZhJvY7kXaJt zt_OBv0vs?@g(8@x2V)5xXZJZDh6V*fTq2;7;4&D^U69a0xEz3r?hP<|A|S4M8l+Xg z1^Ewc)*}H4Z2V~R6VOFrRuK%RloiXQ9?>4-g5>s(jB?YL+ZR*<=EG zVucLk2AFP<52%fRCz!>YNENeADFBxM)7aQ0R>y`<3A6R_g{jf1_SsSh4ek6XSIPh- zNg=Z_)2t1R9n+b9Lh@o}3}Z|I>mYGHz_2oTjm!IJxHVnljrWR0nNisdH46ND)Mt|Z znelQ@`#(!GQg{ zcQ*3crA`AxG*QJf(-)_vHxL`Vf<*Cza4i>KzD^Z+Q#Yi>=)i!}Y*R=_N5}g5dR0}` zqA}RTUrz~$?-D+0H;WM|c-i=3P`G%WlbyFQ;lgXAy zW1VuF)`mSIs(T$(NNT;)X&akr_Y>WH-5Xii@&fb6@*Ig&8k;{l;sju8BaR!BKfyZV z>6PC{v?{ly-V2E91fJnzn-;>Z$`&_SBM?0WqH+U_Mj#P2O~{`msl+5l>My z`RU1Um&<%+<|umt(yeo%5x-=XHyb*r0m+?YZNwi|7aabSZSp zHtC&CCd`AXde2>;b-yoeE!T~dMyrsmr=jYgCerWRx3pxl+Wg>E0ndYr>bI@v+}lGb+LL^P@y7!Mu52!cNxIxQ&l(Gf{N~;`-)a z4o&Uh{O0&KBkyZXm@=}Px@U24aNdw7=t=K+cj`fphpy;?Pwj{+UtWe+3!jP{_8fA) z+ZkUviD{F6OGzwMU{`=bKY173LPmjamjt=uxoYqq*HF+>51m z9Oancc{@1$)Xp1QOiI+H@cGuLzPvt$gcpZ$fh8HdzvzYJ{lr3D=h`WoLW!E8i=+yS zMX_sCkhC^qF_Xpw8}xF)#km3^y^mEqaU$V1?ui_xS9{Xs8k-?<5u{1hvU4Zgq>9cT zTv${D6Nba09A=WnMCP_c+6GUpJ!(h1rw_e-D4)|P%^g9flB^ZOx1S$==JoZzso)c{ zmAXAlW4HoOt%52Tddx-5jv2PDupTDNZi}?|1jn6NmQ`5R;j%&W)|&6_ccR7EO76Tz zXCy|dYO8&~>R-rT`ey}4_pjMd`M%9n^?+wwT|>9N2_LpxEbuTnUEh&vF{7`ze+oIz zE*D4c8A~k>8AgVm#J}3J$@7KCgh9K*n^zGL9SbKyktG=p!W^6-=$`^B)sdOeU2HO3 z!o8nRkz-w<+;jzrp(5c*Iy$be%?Wj?Dn>%3))P);s;ql1Cy*Uxv|J2ty?Q3oj~H8% zkIB-5uwe1qP`DF0EKs?3s?oa87W#+0LiT%WXP&B|mwDe*slxxj=8E&<1dH1yT z6(Hy1vax^Ln+-vkJT`t_99D&wxom=en*5!WSsIW=ar&fz4|z=%@^)|4#73aNT=#x} zZvJeU{!>&XH**U;62AOr%iE&0lTr1oxEG27_l)xs8>d9gn*|`OPWIoYLV9?7xUH?^ z$HQ7YMPg3vs^*;KmV1*&`f^@1!4g@?kJ$=d$||#IPbEbp=OLQsl@?G$BNE*$xA>?x zxLd;`TTHPk*&kf{ zreT4Ci1VhX#fK_--IIHP?-EEU63pcFqOMWAne_>6my&}AaKQN!s+g&Wy?_Ilm)HI7 zkkFPQ{{eZ5=Tm=bdE#mh)qB)*q4}^mVo+Ps<+Zs<^l1Sfp8)xUh@IK#;P-mrjmfze z@f8OmIc%DdB@EBt+8%p#FDcXaG`k_+TmI`o_j*3ILS(ZE6&yB8Q=i z*FIfbI;1fd;vxH@pPEH$6zGvhpXW<%aC9$_$n$q^hG()nWrSka?KzoGl)hVjnufc; z5BH z%WX7r9rdHZGTyCQdTZ0O%8!PUGZ((Bv>(!7l`k5zz3cZL zCq_Yzf4#Hr7hHMxi+lEd`}o|i7c;|y0ynjGy(*&=@>C-01dOr&7{coD*H2w-7s#;B z<~Z|0h;(>vwe{3^LQJ9i=rvBoh4udYBchQbb~%i#2E4;M(36>=QIrSi2ya3UEK%sF z0Q*D@?Bc|p#^C%aCTUZmm%p6swJTPC{Cb7oO;mXO>rOyGbT~lnA5@75=+y)Z{$JO+ z#9Cm*N#fxaO`e+XzH$w_joeU-GxbJ-W#j|<#~dym_Hh3%7xG_3D#?*JUS>4^#Q@1O z<507Pc?k}g0QSMeMA1=aTYe~sje`!Bf=^H))o3TX6U*&E0^uUFebUEOc_(tX)E*-N z`7VdI&Q^-Kl0IM3)zzhz{?XBqtE+2Sd3kwR8UL?;7sr3=*S}MY<9FPeZ3clZSP^wYqV3FI3*+7}9)+`3o5dMe(esFTMT`!ZB)0 diff --git a/SatPI.svg b/SatPI.svg index 1103eb39..48772ce0 100644 --- a/SatPI.svg +++ b/SatPI.svg @@ -1 +1 @@ -SatPISatPIPropertiesInterfaceAttrStreamManagerXMLSupportgetFrontendDecryptInterface(..)RtspServerThreadthreadEntry() -> calls poll(..)methodSetup(..)methodPlay(..)methodOptions(..)methodDescribe(..)methodTeardown(..)HttpServerThreadthreadEntry() -> calls poll(..)methodPost(..)methodGet(..)SsdpServerThreadthreadEntry()PropertiesInterfaceAttrEth0 etc.XMLSupportMutex _mutexsocket::HttpcSocketrecvHttpcMessage(..)recvfromHttpcMessage(..)socket::SocketClientstd::string _msgstd::string _protocolStringstd::string _sessionIDstd::string _userAgentint _cseqsocket::SocketAttr_fdstd::string _ipAddrsocket::TcpSocketstd::string _protocolStringpoll(..) -> calls recvHttpcMessage(..)-> calls process(..)-> calls closeConnection(..)socket::UdpSocketinit_udp_socket(..)init_mutlicast_udp_socket(..)HttpcServerprocess(..)closeConnection(..)processStreamingRequest(..)StreamInterfacegetInputDevice() = 0getStreamClient(..) = 0getDecryptDevice() = 0StreamXMLSupportenabledStreamingType (RSTP/RTP/HTTP/..)streamInUsegetFrontendDecryptInterface()StreamClientMutex _mutexSocketClient *_httpStreamwatchdoginput::DeviceStreamIDisDataAvailable() = 0readFullTSPacket(..) = 0output::StreamThreadBaseThreaddecrypt::dvbapi::ClientThreaddecrypt::dvbapi::ClientPropertiesdvbcsa_bs_batch_sKeysdecrypt::dvbapi::FilterMutex _mutexmpegts::FilterMutex _mutexmpegts::PacketBuffermpegts::TableDatampegts::PidTablempegts::PATmpegts::PMTmpegts::PCRmpegts::SDToutput::StreamThreadRtcpoutput::StreamThreadHttpoutput::StreamThreadRtpcseqinput::stream::Streamerinput::file::TSReaderTSReaderDatainput::DeviceDataXMLSupportMutex _mutexbool _changedinput::dvb::Frontendinput::Translationinput::dvb::FrontendDecryptInterfaceinput::dvb::FrontendDataTuning/Channel Datainput::dvb::delivery::SystemDVBSDVBCDVBTATSCDiSEqcSwitchDiSEqcEN50494DiSEqcEN50607DiSEqcLnb_server_client[..]_streamManager_client[..]_decrypt_decrypt_streamManager_stream[..]_rtp_rtcp_httpStream_tsBuffer[..]_deliverySystem[..]_translationdvbapiData - Only with LIBDVBCSA_diseqc_lnb[MAX_LNB]_batch_filter \ No newline at end of file +SatPISatPIPropertiesInterfaceAttrStreamManagerXMLSupportgetFrontendDecryptInterface(..)RtspServerThreadthreadEntry() -> calls poll(..)methodSetup(..)methodPlay(..)methodOptions(..)methodDescribe(..)methodTeardown(..)HttpServerThreadthreadEntry() -> calls poll(..)methodPost(..)methodGet(..)SsdpServerThreadthreadEntry()PropertiesInterfaceAttrEth0 etc.XMLSupportMutex _mutexsocket::HttpcSocketrecvHttpcMessage(..)recvfromHttpcMessage(..)socket::SocketClientstd::string _msgstd::string _protocolStringstd::string _sessionIDstd::string _userAgentint _cseqsocket::SocketAttr_fdstd::string _ipAddrsocket::TcpSocketstd::string _protocolStringpoll(..) -> calls recvHttpcMessage(..)-> calls process(..)-> calls closeConnection(..)socket::UdpSocketinit_udp_socket(..)init_mutlicast_udp_socket(..)HttpcServerprocess(..)closeConnection(..)processStreamingRequest(..)StreamXMLSupportThread DataReaderThread Monitor/RTCPenabledstreamInUsegetFrontendDecryptInterface()output::StreamClientMutex _mutexSocketClient *_httpStreamwatchdogmpegts::PacketBufferinput::DeviceStreamIDisDataAvailable() = 0readFullTSPacket(..) = 0decrypt::dvbapi::ClientThreaddecrypt::dvbapi::ClientPropertiesdvbcsa_bs_batch_sKeysdecrypt::dvbapi::FilterMutex _mutexmpegts::FilterMutex _mutexmpegts::TableDatampegts::PidTablempegts::PATmpegts::PMTmpegts::PCRmpegts::SDToutput::StreamClientOutputHttpoutput::StreamClientOutputRtpoutput::StreamClientOutputRtpTcpinput::childpipe::TSReaderTSReaderDatainput::DeviceDataXMLSupportMutex _mutexbool _changedinput::dvb::Frontendinput::Translationinput::dvb::FrontendDecryptInterfaceinput::dvb::FrontendDataTuning/Channel Datainput::dvb::delivery::SystemDVBSDVBCDVBTATSCDiSEqcSwitchDiSEqcEN50494DiSEqcEN50607DiSEqcLnb_server_client[..]_streamManager_streamClientVector[..]_tsBuffer[..]_decrypt_decrypt_streamManager_stream[..]_rtp_rtcp_httpStream_deliverySystem[..]_translationdvbapiData - Only with LIBDVBCSA_diseqc_lnb[MAX_LNB]_batch_filter \ No newline at end of file diff --git a/src/Defs.h b/src/Defs.h index 71c68925..5fbb1744 100644 --- a/src/Defs.h +++ b/src/Defs.h @@ -20,11 +20,14 @@ #ifndef DEFS_H_INCLUDE #define DEFS_H_INCLUDE DEFS_H_INCLUDE +#include #include #include using StringVector = std::vector; +using PacketPtr = std::unique_ptr; + class TypeID { public: TypeID(int id) : _id(id) {} diff --git a/src/HeaderVector.cpp b/src/HeaderVector.cpp index ae5ffb8c..889750d6 100644 --- a/src/HeaderVector.cpp +++ b/src/HeaderVector.cpp @@ -26,7 +26,7 @@ // ============================================================================= std::string HeaderVector::getFieldParameter(const std::string_view reqHeader) const { - for (const std::string &header : _vector) { + for (const std::string& header : _vector) { const auto b = header.find(reqHeader, 0); const auto e = header.find_first_not_of(reqHeader, b); if (b != std::string::npos && reqHeader.size() == e && header[e] == ':') { @@ -43,7 +43,7 @@ std::string HeaderVector::getStringFieldParameter(std::string_view header, return std::string(); } StringVector params = StringConverter::split(field, ";\r\n"); - for (const std::string ¶m : params) { + for (const std::string& param : params) { const auto p = param.find(parameter, 0); if (p != std::string::npos) { StringVector r = StringConverter::split(param, "="); diff --git a/src/HttpServer.cpp b/src/HttpServer.cpp index c55c6003..9f290bd5 100644 --- a/src/HttpServer.cpp +++ b/src/HttpServer.cpp @@ -92,7 +92,7 @@ bool HttpServer::methodPost(SocketClient &client) { getHtmlBodyWithContent(htmlBody, HTML_NO_RESPONSE, "", CONTENT_TYPE_HTML, 0, 0); // send 'htmlBody' to client - if (!client.sendData(htmlBody.c_str(), htmlBody.size(), 0)) { + if (!client.sendData(htmlBody.data(), htmlBody.size(), 0)) { SI_LOG_ERROR("Send htmlBody failed"); return false; } @@ -147,7 +147,7 @@ bool HttpServer::methodGet(SocketClient &client, bool headOnly) { } else if (file == "STOP") { exitRequest = true; getHtmlBodyWithContent(htmlBody, HTML_NO_RESPONSE, "", CONTENT_TYPE_HTML, 0, 0); - } else if ((docTypeSize = readFile(filePath.c_str(), docType))) { + } else if ((docTypeSize = readFile(filePath.data(), docType))) { if (file.find(".xml") != std::string::npos) { // check if the request is the SAT>IP description xml then fill in the server version, UUID, // XSatipM3U, presentationURL and tuner string @@ -160,7 +160,7 @@ bool HttpServer::methodGet(SocketClient &client, bool headOnly) { _bindIPAddress, std::to_string(_properties.getHttpPort())); const std::string modelName = StringConverter::stringFormat("SatPI Server (@#1)", _bindIPAddress); - const std::string newDocType = StringConverter::stringFormat(docType.c_str(), + const std::string newDocType = StringConverter::stringFormat(docType.data(), modelName, _properties.getUPnPVersion(), _properties.getUUID(), presentationURL, _streamManager.getXMLDeliveryString(), _properties.getXSatipM3U()); docType = newDocType; @@ -193,9 +193,9 @@ bool HttpServer::methodGet(SocketClient &client, bool headOnly) { continue; } if (line.find("rtsp://") != std::string::npos) { - docType += StringConverter::stringFormat(line.c_str(), rtsp); + docType += StringConverter::stringFormat(line.data(), rtsp); } else if (line.find("http://") != std::string::npos) { - docType += StringConverter::stringFormat(line.c_str(), http); + docType += StringConverter::stringFormat(line.data(), http); } } docTypeSize = docType.size(); @@ -209,7 +209,7 @@ bool HttpServer::methodGet(SocketClient &client, bool headOnly) { } } else { file = _properties.getWebPath() + "/" + "404.html"; - docTypeSize = readFile(file.c_str(), docType); + docTypeSize = readFile(file.data(), docType); getHtmlBodyWithContent(htmlBody, HTML_NOT_FOUND, file, CONTENT_TYPE_HTML, docTypeSize, 0); } } @@ -217,13 +217,13 @@ bool HttpServer::methodGet(SocketClient &client, bool headOnly) { // send something? if (htmlBody.size() > 0) { // send 'htmlBody' to client - if (!client.sendData(htmlBody.c_str(), htmlBody.size(), 0)) { + if (!client.sendData(htmlBody.data(), htmlBody.size(), 0)) { SI_LOG_ERROR("Send htmlBody failed"); return false; } // send 'docType' to client if needed if (!headOnly && docTypeSize > 0) { - if (!client.sendData(docType.c_str(), docTypeSize, 0)) { + if (!client.sendData(docType.data(), docTypeSize, 0)) { SI_LOG_ERROR("Send docType failed"); return false; } diff --git a/src/HttpcServer.cpp b/src/HttpcServer.cpp index b540a2ab..79581c99 100644 --- a/src/HttpcServer.cpp +++ b/src/HttpcServer.cpp @@ -23,6 +23,7 @@ #include #include #include +#include #include #include #include @@ -32,6 +33,8 @@ #include #include +extern const char* const satpi_version; + const char *HttpcServer::HTML_BODY_WITH_CONTENT = "@#1 @#2\r\n" \ "Server: SatPI WebServer v0.1\r\n" \ @@ -82,8 +85,6 @@ HttpcServer::HttpcServer( _streamManager(streamManager), _bindIPAddress(bindIPAddress) {} -HttpcServer::~HttpcServer() {} - void HttpcServer::initialize( int port, bool nonblock) { @@ -164,18 +165,23 @@ void HttpcServer::processStreamingRequest(SocketClient &client) { const std::string method = client.getMethod(); std::string httpcReply; if (sessionID.empty() && method == "OPTIONS") { - methodOptions("", cseq, httpcReply); + static const char *RTSP_OPTIONS_OK = + "RTSP/1.0 200 OK\r\n" \ + "Server: satpi/@#1\r\n" \ + "CSeq: @#2\r\n" \ + "Public: OPTIONS, DESCRIBE, SETUP, PLAY, TEARDOWN\r\n" \ + "\r\n"; + httpcReply = StringConverter::stringFormat(RTSP_OPTIONS_OK, satpi_version, cseq); } else if (sessionID.empty() && method == "DESCRIBE") { methodDescribe("", cseq, feIndex, httpcReply); } else { - int clientID; - SpStream stream = _streamManager.findStreamAndClientIDFor(client, clientID); + const auto [stream, streamClient] = _streamManager.findStreamAndClientFor(client); if (stream != nullptr) { - stream->processStreamingRequest(client, clientID); + stream->processStreamingRequest(client, streamClient); // Check the Method if (method == "GET") { - stream->update(clientID); + stream->update(streamClient); const std::string multicast = params.getParameter("multicast"); if (multicast.empty()) { getHtmlBodyNoContent(httpcReply, HTML_OK, "", CONTENT_TYPE_VIDEO, 0); @@ -185,27 +191,26 @@ void HttpcServer::processStreamingRequest(SocketClient &client) { httpcReply += content; } } else if (method == "SETUP") { - methodSetup(*stream, clientID, httpcReply); + httpcReply = streamClient->getSetupMethodReply(stream->getStreamID()); - if (!stream->update(clientID)) { + if (!stream->update(streamClient)) { // something wrong here... send 408 error getHtmlBodyNoContent(httpcReply, HTML_REQUEST_TIMEOUT, "", CONTENT_TYPE_VIDEO, cseq); - stream->teardown(clientID); + stream->teardown(streamClient); } } else if (method == "PLAY") { - methodPlay(*stream, clientID, httpcReply); + httpcReply = streamClient->getPlayMethodReply(stream->getStreamID(), _bindIPAddress); - if (!stream->update(clientID)) { + if (!stream->update(streamClient)) { // something wrong here... send 408 error getHtmlBodyNoContent(httpcReply, HTML_REQUEST_TIMEOUT, "", CONTENT_TYPE_VIDEO, cseq); - stream->teardown(clientID); + stream->teardown(streamClient); } } else if (method == "TEARDOWN") { - methodTeardown(sessionID, cseq, httpcReply); - - stream->teardown(clientID); + httpcReply = streamClient->getTeardownMethodReply(); + stream->teardown(streamClient); } else if (method == "OPTIONS") { - methodOptions(sessionID, cseq, httpcReply); + httpcReply = streamClient->getOptionsMethodReply(); } else if (method == "DESCRIBE") { methodDescribe(sessionID, cseq, feIndex, httpcReply); } else { @@ -221,7 +226,7 @@ void HttpcServer::processStreamingRequest(SocketClient &client) { } const unsigned long time = sw.getIntervalMS(); SI_LOG_DEBUG("Send reply in @#1 ms\r\n@#2", time, httpcReply); - if (!client.sendData(httpcReply.c_str(), httpcReply.size(), MSG_NOSIGNAL)) { + if (!client.sendData(httpcReply.data(), httpcReply.size(), MSG_NOSIGNAL)) { SI_LOG_ERROR("Send Streaming reply failed"); } } diff --git a/src/HttpcServer.h b/src/HttpcServer.h index 997c9a10..ab24e898 100644 --- a/src/HttpcServer.h +++ b/src/HttpcServer.h @@ -28,6 +28,8 @@ FW_DECL_NS0(Stream); FW_DECL_NS0(StreamManager); +FW_DECL_SP_NS1(output, StreamClient); + /// HTTP Client Server class HttpcServer : public TcpSocket { @@ -66,7 +68,7 @@ class HttpcServer : StreamManager &streamManager, const std::string &bindIPAddress); - virtual ~HttpcServer(); + virtual ~HttpcServer() = default; /// Call this to initialize, setup and start this server virtual void initialize( @@ -94,18 +96,6 @@ class HttpcServer : return false; } - /// RTSP Method - virtual void methodSetup(const Stream &UNUSED(stream), int UNUSED(clientID), std::string &UNUSED(htmlBody)) {} - - /// RTSP Method - virtual void methodPlay(const Stream &UNUSED(stream), int UNUSED(clientID), std::string &UNUSED(htmlBody)) {} - - /// RTSP Method - virtual void methodTeardown(const std::string &UNUSED(sessionID), int UNUSED(cseq), std::string &UNUSED(htmlBody)) {} - - /// RTSP Method - virtual void methodOptions(const std::string &UNUSED(sessionID), int UNUSED(cseq), std::string &UNUSED(htmlBody)) {} - /// RTSP Method virtual void methodDescribe(const std::string &UNUSED(sessionID), int UNUSED(cseq), FeIndex UNUSED(index), std::string &UNUSED(htmlBody)) {} diff --git a/src/Log.cpp b/src/Log.cpp index 9837389e..c18ddc2e 100755 --- a/src/Log.cpp +++ b/src/Log.cpp @@ -37,6 +37,8 @@ static base::Mutex logMutex; bool Log::_syslogOn = false; bool Log::_coutLog = true; +bool Log::_logDebug = true; + Log::LogBuffer Log::_appLogBuffer; void Log::openAppLog(const char *deamonName, const bool daemonize) { @@ -64,6 +66,9 @@ void Log::log(const int priority, const std::string &msg) { if ((priority & MPEGTS_TABLES) == MPEGTS_TABLES) { return; } + if (priority == LOG_DEBUG && !_logDebug) { + return; + } // set timestamp struct timespec timeStamp; struct tm result; @@ -87,7 +92,7 @@ void Log::log(const int priority, const std::string &msg) { // log to syslog if (_syslogOn) { - syslog(priority, "%s", line.c_str()); + syslog(priority, "%s", line.data()); } #ifdef DEBUG @@ -112,7 +117,7 @@ std::string Log::makeJSON() { { base::MutexLock lock(logMutex); if (!_appLogBuffer.empty()) { - for (const LogElem &elem : _appLogBuffer) { + for (const LogElem& elem : _appLogBuffer) { json.startObject(); json.addValueString("timestamp", elem.timestamp); json.addValueString("msg", elem.msg); diff --git a/src/Log.h b/src/Log.h index 66a6e7c4..eec51e31 100644 --- a/src/Log.h +++ b/src/Log.h @@ -43,8 +43,16 @@ class Log { static bool getSysLogState(); + static void logDebug(bool log) { + _logDebug = log; + } + + static bool getLogDebugState() { + return _logDebug; + } + template - static void binlog(int priority, const unsigned char *p, int length, const char * format, Args&&... args) { + static void binlog(int priority, const unsigned char* p, int length, const char * format, Args&&... args) { std::string data = StringConverter::convertToHexASCIITable(p, length, 16); std::string line = StringConverter::stringFormat(format, std::forward(args)...); log(priority, StringConverter::stringFormat("@#1\r\n@#2\r\nEND\r\n", line, data)); @@ -83,6 +91,7 @@ class Log { static LogBuffer _appLogBuffer; static bool _syslogOn; static bool _coutLog; + static bool _logDebug; }; #define MPEGTS_TABLES 0x100 diff --git a/src/Properties.cpp b/src/Properties.cpp index 756ddaed..baf42f07 100644 --- a/src/Properties.cpp +++ b/src/Properties.cpp @@ -23,14 +23,6 @@ extern const char* const satpi_version; -// ============================================================================= -// -- Static const data -------------------------------------------------------- -// ============================================================================= - -const unsigned int Properties::TCP_PORT_MAX = 65535; -const unsigned int Properties::HTTP_PORT_MIN = 1024; -const unsigned int Properties::RTSP_PORT_MIN = 554; - // ============================================================================= // -- Constructors and destructor ---------------------------------------------- // ============================================================================= @@ -63,8 +55,6 @@ Properties::Properties( _appdataPathOpt = appdataPathOpt; } -Properties::~Properties() {} - // ============================================================================= // -- base::XMLSupport -------------------------------------------------------- // ============================================================================= @@ -103,6 +93,10 @@ void Properties::doFromXML(const std::string &xml) { const bool start = (element == "true") ? true : false; Log::startSysLog(start); } + if (findXMLElement(xml, "logDebug.value", element)) { + const bool log = (element == "true") ? true : false; + Log::logDebug(log); + } } void Properties::doAddToXML(std::string &xml) const { @@ -114,6 +108,7 @@ void Properties::doAddToXML(std::string &xml) const { ADD_XML_TEXT_INPUT(xml, "webPath", _webPath); ADD_XML_TEXT_INPUT(xml, "appDataPath", _appdataPath); ADD_XML_CHECKBOX(xml, "syslog", (Log::getSysLogState() ? "true" : "false")); + ADD_XML_CHECKBOX(xml, "logDebug", (Log::getLogDebugState() ? "true" : "false")); } // ============================================================================= diff --git a/src/Properties.h b/src/Properties.h index 7989f5a0..6d4ff187 100644 --- a/src/Properties.h +++ b/src/Properties.h @@ -34,9 +34,9 @@ class Properties : // ===================================================================== public: - static const unsigned int TCP_PORT_MAX; - static const unsigned int HTTP_PORT_MIN; - static const unsigned int RTSP_PORT_MIN; + static constexpr unsigned int TCP_PORT_MAX = 65535; + static constexpr unsigned int HTTP_PORT_MIN = 1024; + static constexpr unsigned int RTSP_PORT_MIN = 554; // ===================================================================== // -- Constructors and destructor -------------------------------------- @@ -52,7 +52,7 @@ class Properties : unsigned int httpPortOpt, unsigned int rtspPortOpt); - virtual ~Properties(); + virtual ~Properties() = default; // ===================================================================== // -- base::XMLSupport ------------------------------------------------- diff --git a/src/RtspServer.cpp b/src/RtspServer.cpp index 4a958ea4..9bfe9571 100644 --- a/src/RtspServer.cpp +++ b/src/RtspServer.cpp @@ -23,7 +23,7 @@ #include #include #include -#include +#include #include extern const char* const satpi_version; @@ -55,134 +55,8 @@ void RtspServer::threadEntry() { } } -void RtspServer::methodSetup(const Stream &stream, const int clientID, std::string &htmlBody) { - StreamClient &client = stream.getStreamClient(clientID); - switch (stream.getStreamingType()) { - case Stream::StreamingType::RTP_TCP: { - static const char *RTSP_SETUP_OK = - "RTSP/1.0 200 OK\r\n" \ - "Server: satpi/@#1\r\n" \ - "CSeq: @#2\r\n" \ - "Session: @#3;timeout=@#4\r\n" \ - "Transport: RTP/AVP/TCP;unicast;client_ip=@#5;interleaved=0-1\r\n" \ - "com.ses.streamID: @#6\r\n" \ - "\r\n"; - - // setup reply - htmlBody = StringConverter::stringFormat(RTSP_SETUP_OK, - satpi_version, - client.getCSeq(), - client.getSessionID(), - client.getSessionTimeout(), - client.getIPAddressOfStream(), - stream.getStreamID().getID()); - break; - } - case Stream::StreamingType::RTSP_UNICAST: { - static const char *RTSP_SETUP_OK = - "RTSP/1.0 200 OK\r\n" \ - "Server: satpi/@#1\r\n" \ - "CSeq: @#2\r\n" \ - "Session: @#3;timeout=@#4\r\n" \ - "Transport: RTP/AVP;unicast;client_ip=@#5;client_port=@#6-@#7\r\n" \ - "com.ses.streamID: @#8\r\n" \ - "\r\n"; - - // setup reply - htmlBody = StringConverter::stringFormat(RTSP_SETUP_OK, - satpi_version, - client.getCSeq(), - client.getSessionID(), - client.getSessionTimeout(), - client.getIPAddressOfStream(), - client.getRtpSocketAttr().getSocketPort(), - client.getRtcpSocketAttr().getSocketPort(), - stream.getStreamID().getID()); - break; - } - case Stream::StreamingType::RTSP_MULTICAST: { - static const char *RTSP_SETUP_OK = - "RTSP/1.0 200 OK\r\n" \ - "Server: satpi/@#1\r\n" \ - "CSeq: @#2\r\n" \ - "Session: @#3;timeout=@#4\r\n" \ - "Transport: RTP/AVP;multicast;destination=@#5;port=@#6-@#7;ttl=5\r\n" \ - "com.ses.streamID: @#8\r\n" \ - "\r\n"; - - // setup reply - htmlBody = StringConverter::stringFormat(RTSP_SETUP_OK, - satpi_version, - client.getCSeq(), - client.getSessionID(), - client.getSessionTimeout(), - client.getIPAddressOfStream(), - client.getRtpSocketAttr().getSocketPort(), - client.getRtcpSocketAttr().getSocketPort(), - stream.getStreamID().getID()); - break; - } - default: - static const char *RTSP_SETUP_REPLY = - "RTSP/1.0 461 Unsupported Transport\r\n" \ - "Server: satpi/@#1\r\n" \ - "CSeq: @#2\r\n" \ - "\r\n"; - - // setup reply - htmlBody = StringConverter::stringFormat(RTSP_SETUP_REPLY, - satpi_version, - client.getCSeq()); - return; - }; -} - -void RtspServer::methodPlay(const Stream &stream, const int clientID, std::string &htmlBody) { - const StreamClient &client = stream.getStreamClient(clientID); - static const char *RTSP_PLAY_OK = - "RTSP/1.0 200 OK\r\n" \ - "Server: satpi/@#1\r\n" \ - "RTP-Info: url=rtsp://@#2/stream=@#3\r\n" \ - "CSeq: @#4\r\n" \ - "Session: @#5\r\n" \ - "Range: npt=0.000-\r\n" \ - "\r\n"; - - htmlBody = StringConverter::stringFormat(RTSP_PLAY_OK, satpi_version, _bindIPAddress, - stream.getStreamID().getID(), client.getCSeq(), client.getSessionID()); -} - -void RtspServer::methodTeardown( - const std::string &sessionID, const int cseq, std::string &htmlBody) { - static const char *RTSP_TEARDOWN_OK = - "RTSP/1.0 200 OK\r\n" \ - "Server: satpi/@#1\r\n" \ - "CSeq: @#2\r\n" \ - "Session: @#3\r\n" \ - "\r\n"; - - htmlBody = StringConverter::stringFormat(RTSP_TEARDOWN_OK, satpi_version, cseq, sessionID); -} - -void RtspServer::methodOptions( - const std::string &sessionID, const int cseq, std::string &htmlBody) { - static const char *RTSP_OPTIONS_OK = - "RTSP/1.0 200 OK\r\n" \ - "Server: satpi/@#1\r\n" \ - "CSeq: @#2\r\n" \ - "Public: OPTIONS, DESCRIBE, SETUP, PLAY, TEARDOWN\r\n" \ - "@#3" \ - "\r\n"; - - // check if we are in session, then we need to send the Session ID - const std::string sessionIDHeaderField = (sessionID.size() > 2) ? - StringConverter::stringFormat("Session: @#1\r\n", sessionID) : ""; - - htmlBody = StringConverter::stringFormat(RTSP_OPTIONS_OK, satpi_version, cseq, sessionIDHeaderField); -} - void RtspServer::methodDescribe( - const std::string &sessionID, const int cseq, const FeIndex feIndex, std::string &htmlBody) { + const std::string &sessionID, const int cseq, const FeIndex feIndex, std::string &htmlBody) { static const char *RTSP_DESCRIBE = "@#1" \ "Server: satpi/@#2\r\n" \ diff --git a/src/RtspServer.h b/src/RtspServer.h index 7315391a..e4371ef7 100644 --- a/src/RtspServer.h +++ b/src/RtspServer.h @@ -33,9 +33,9 @@ FW_DECL_NS0(StreamManager); class RtspServer : public base::ThreadBase, public HttpcServer { - // ===================================================================== - // -- Constructors and destructor -------------------------------------- - // ===================================================================== + // ========================================================================= + // -- Constructors and destructor ------------------------------------------ + // ========================================================================= public: RtspServer(StreamManager &streamManager, const std::string &bindIPAddress); @@ -43,9 +43,7 @@ class RtspServer : virtual ~RtspServer(); /// Call this to initialize, setup and start this server - virtual void initialize( - int port, - bool nonblock); + virtual void initialize(int port, bool nonblock); protected: /// Thread function @@ -53,18 +51,6 @@ class RtspServer : private: - /// - virtual void methodSetup(const Stream &stream, int clientID, std::string &htmlBody) final; - - /// - virtual void methodPlay(const Stream &stream, int clientID, std::string &htmlBody) final; - - /// - virtual void methodTeardown(const std::string &sessionID, int cseq, std::string &htmlBody) final; - - /// - virtual void methodOptions(const std::string &sessionID, int cseq, std::string &htmlBody) final; - /// virtual void methodDescribe(const std::string &sessionID, int cseq, FeIndex index, std::string &htmlBody) final; diff --git a/src/Stream.cpp b/src/Stream.cpp index 15e0444f..6724cd4b 100644 --- a/src/Stream.cpp +++ b/src/Stream.cpp @@ -22,45 +22,56 @@ #include #include #include +#include +#include #include #include #include -#include -#include -#include -#include +#include +#include +#include #include -#include -#include +#ifdef LIBDVBCSA + #include +#endif + +#include +#include -static unsigned int seedp = 0xFEED; -const unsigned int Stream::MAX_CLIENTS = 8; // ============================================================================= // -- Constructors and destructor ---------------------------------------------- // ============================================================================= Stream::Stream(input::SpDevice device, decrypt::dvbapi::SpClient decrypt) : - _streamingType(StreamingType::NONE), _enabled(true), _streamInUse(false), - _streamActive(false), - _client(new StreamClient[MAX_CLIENTS]), - _streaming(nullptr), _decrypt(decrypt), _device(device), - _ssrc((uint32_t)(rand_r(&seedp) % 0xffff)), - _spc(0), - _soc(0), - _timestamp(0), - _rtp_payload(0.0), - _rtcpSignalUpdate(1) { + _rtcpSignalUpdate(1), + _threadDeviceDataReader( + StringConverter::stringFormat("Reader@#1", _device->getFeID()), + std::bind(&Stream::threadExecuteDeviceDataReader, this)), + _threadDeviceMonitor( + StringConverter::stringFormat("Monitor@#1", _device->getFeID()), + std::bind(&Stream::threadExecuteDeviceMonitor, this)), + _writeIndex(0), + _readIndex(0), + _sendInterval(100), + _signalLock(false) { ASSERT(device); -} - -Stream::~Stream() { - DELETE_ARRAY(_client); + // Initialize all TS packets + for (mpegts::PacketBuffer& buffer : _tsBuffer) { + buffer.initialize(0, 0); + } + std::array nullPacked{0}; + nullPacked[0] = 0x47; + nullPacked[1] = 0x1F; + nullPacked[2] = 0xFF; + _tsEmpty.initialize(0, 0); + std::memcpy(_tsEmpty.getWriteBufferPtr(), nullPacked.data(), 188); + _tsEmpty.addAmountOfBytesWritten(188); } // =========================================================================== @@ -71,8 +82,35 @@ SpStream Stream::makeSP(input::SpDevice device, decrypt::dvbapi::SpClient decryp return std::make_shared(device, decrypt); } +// ======================================================================= +// -- base::XMLSupport -------------------------------------------------- +// ======================================================================= + +void Stream::doAddToXML(std::string &xml) const { + ADD_XML_ELEMENT(xml, "streamindex", _device->getFeID().getID()); + + ADD_XML_CHECKBOX(xml, "enable", (_enabled ? "true" : "false")); + ADD_XML_ELEMENT(xml, "attached", _streamInUse ? "yes" : "no"); + ADD_XML_NUMBER_INPUT(xml, "rtcpSignalUpdate", _rtcpSignalUpdate, 1, 5); + for (output::SpStreamClient client : _streamClientVector) { + client->addToXML(xml); + } + _device->addToXML(xml); +} + +void Stream::doFromXML(const std::string &xml) { + std::string element; + if (findXMLElement(xml, "enable.value", element)) { + _enabled = (element == "true") ? true : false; + } + if (findXMLElement(xml, "rtcpSignalUpdate.value", element)) { + _rtcpSignalUpdate = std::stoi(element); + } + _device->fromXML(xml); +} + // =========================================================================== -// -- StreamInterface -------------------------------------------------------- +// -- Other member functions ------------------------------------------------- // =========================================================================== StreamID Stream::getStreamID() const { @@ -87,115 +125,131 @@ int Stream::getFeIndex() const { return _device->getFeIndex(); } -StreamClient &Stream::getStreamClient(int clientID) const { - return _client[clientID]; -} - -input::SpDevice Stream::getInputDevice() const { - return _device; -} - #ifdef LIBDVBCSA -decrypt::dvbapi::SpClient Stream::getDecryptDevice() const { - return _decrypt; +input::dvb::SpFrontendDecryptInterface Stream::getFrontendDecryptInterface() { + return std::dynamic_pointer_cast(_device); } #endif -uint32_t Stream::getSSRC() const { - return _ssrc; +void Stream::addDeliverySystemCount( + std::size_t &dvbs2, + std::size_t &dvbt, + std::size_t &dvbt2, + std::size_t &dvbc, + std::size_t &dvbc2) { + if (_enabled) { + _device->addDeliverySystemCount(dvbs2, dvbt, dvbt2, dvbc, dvbc2); + } } -long Stream::getTimestamp() const { - return _timestamp; -} +void Stream::startStreaming(output::SpStreamClient streamClient) { + streamClient->startStreaming(); -uint32_t Stream::getSPC() const { - return _spc; -} - -unsigned int Stream::getRtcpSignalUpdateFrequency() const { - return _rtcpSignalUpdate; -} + // set begin timestamp + _t1 = std::chrono::steady_clock::now(); + _writeIndex = 0; + _readIndex = 0; + _tsBuffer[_writeIndex].reset(); -uint32_t Stream::getSOC() const { - return _soc; + _threadDeviceMonitor.startThread(); + _threadDeviceDataReader.startThread(); + _threadDeviceDataReader.setPriority(base::Thread::Priority::AboveNormal); + SI_LOG_DEBUG("Frontend: @#1, Start Reader and Monitor Thread", _device->getFeID()); } -void Stream::addRtpData(uint32_t byte, long timestamp) { - // inc RTP packet counter - ++_spc; - _soc += byte; - _rtp_payload = _rtp_payload + byte; - _timestamp = timestamp; +void Stream::pauseStreaming(output::SpStreamClient UNUSED(streamClient)) { + _threadDeviceDataReader.pauseThread(); + _threadDeviceMonitor.pauseThread(); + SI_LOG_DEBUG("Frontend: @#1, Pause Reader and Monitor Thread", _device->getFeID()); +#ifdef LIBDVBCSA + if (_decrypt != nullptr) { + _decrypt->stopDecrypt(_device->getFeIndex(), _device->getFeID()); + } +#endif } -double Stream::getRtpPayload() const { - return _rtp_payload; -} +void Stream::restartStreaming(output::SpStreamClient UNUSED(streamClient)) { + // set begin timestamp + _t1 = std::chrono::steady_clock::now(); + _writeIndex = 0; + _readIndex = 0; + _tsBuffer[_writeIndex].reset(); -std::string Stream::attributeDescribeString() const { - return _device->attributeDescribeString(); + _threadDeviceDataReader.restartThread(); + _threadDeviceMonitor.restartThread(); + SI_LOG_DEBUG("Frontend: @#1, Restart Reader and Monitor Thread", _device->getFeID()); } -// ======================================================================= -// -- base::XMLSupport -------------------------------------------------- -// ======================================================================= - -void Stream::doAddToXML(std::string &xml) const { - ADD_XML_ELEMENT(xml, "streamindex", _device->getFeID().getID()); - - ADD_XML_CHECKBOX(xml, "enable", (_enabled ? "true" : "false")); - ADD_XML_ELEMENT(xml, "attached", _streamInUse ? "yes" : "no"); - ADD_XML_NUMBER_INPUT(xml, "rtcpSignalUpdate", _rtcpSignalUpdate, 1, 5); - ADD_XML_ELEMENT(xml, "spc", _spc.load()); - ADD_XML_ELEMENT(xml, "payload", _rtp_payload.load() / (1024.0 * 1024.0)); - - _client[0].addToXML(xml); - _device->addToXML(xml); +void Stream::stopStreaming() { + _threadDeviceDataReader.stopThread(); + _threadDeviceMonitor.stopThread(); + SI_LOG_DEBUG("Frontend: @#1, Stop Reader and Monitor Thread", _device->getFeID()); +#ifdef LIBDVBCSA + if (_decrypt != nullptr) { + _decrypt->stopDecrypt(_device->getFeIndex(), _device->getFeID()); + } +#endif + _device->teardown(); + _streamInUse = false; } -void Stream::doFromXML(const std::string &xml) { - std::string element; - if (findXMLElement(xml, "enable.value", element)) { - _enabled = (element == "true") ? true : false; - } - if (findXMLElement(xml, "rtcpSignalUpdate.value", element)) { - _rtcpSignalUpdate = std::stoi(element); +void Stream::determineAndMakeStreamClientType(FeID feID, const SocketClient &client) { + // Split message into Headers + HeaderVector headers = client.getHeaders(); + const TransportParamVector params = client.getTransportParameters(); + const std::string method = client.getMethod(); + if (method == "GET") { + const std::string multicast = params.getParameter("multicast"); + if (!multicast.empty()) { + // Format: multicast=IP_ADDR,RTP_PORT,RTCP_PORT,TTL + const StringVector multiParam = StringConverter::split(multicast, ","); + if (multiParam.size() == 4) { + client.spoofHeaderWith(StringConverter::stringFormat( + "Transport: RTP/AVP;multicast;destination=@#1;port=@#2-@#3;ttl=@#4\r\n", + multiParam[0], multiParam[1], multiParam[2], multiParam[3])); + headers = client.getHeaders(); + SI_LOG_INFO("Frontend: @#1, Setup Multicast (@#2) for StreamClient", + feID, multicast); + SI_LOG_DEBUG("Frontend: @#1, Found Streaming type: HTTP -> Multicast", feID); + _streamClientVector.push_back(output::StreamClientOutputRtp::makeSP(feID, true)); + } + } else { + SI_LOG_DEBUG("Frontend: @#1, Found Streaming type: HTTP", feID); + _streamClientVector.push_back(output::StreamClientOutputHttp::makeSP(feID)); + } + } else { + const std::string transport = headers.getFieldParameter("Transport"); + if (transport.find("unicast") != std::string::npos) { + if (transport.find("RTP/AVP") != std::string::npos) { + SI_LOG_DEBUG("Frontend: @#1, Found Streaming type: RTP/AVP", feID); + _streamClientVector.push_back(output::StreamClientOutputRtp::makeSP(feID, false)); + } + } else if (transport.find("multicast") != std::string::npos) { + SI_LOG_DEBUG("Frontend: @#1, Found Streaming type: RTSP Multicast", feID); + _streamClientVector.push_back(output::StreamClientOutputRtp::makeSP(feID, true)); + } else if (transport.find("RTP/AVP/TCP") != std::string::npos) { + SI_LOG_DEBUG("Frontend: @#1, Found Streaming type: RTP/AVP/TCP", feID); + _streamClientVector.push_back(output::StreamClientOutputRtpTcp::makeSP(feID)); + } } - _device->fromXML(xml); } -// =========================================================================== -// -- Other member functions ------------------------------------------------- -// =========================================================================== -#ifdef LIBDVBCSA -input::dvb::SpFrontendDecryptInterface Stream::getFrontendDecryptInterface() { - return std::dynamic_pointer_cast(_device); -} -#endif - -bool Stream::findClientIDFor(SocketClient &socketClient, - const bool newSession, const std::string sessionID, int &clientID) { +output::SpStreamClient Stream::findStreamClientFor(SocketClient &socketClient, + const bool newSession, const std::string sessionID) { base::MutexLock lock(_mutex); const FeID id = _device->getFeID(); const TransportParamVector params = socketClient.getTransportParameters(); const input::InputSystem msys = params.getMSYSParameter(); const double reqFreq = params.getDoubleParameter("freq"); - // Check if the input device is set, else this stream is not usable - if (!_device) { - SI_LOG_ERROR("Frontend: @#1, Input Device not set?...", id); - return false; - } - // Do we have a new session then check some things if (newSession) { if (!_enabled) { SI_LOG_INFO("Frontend: @#1, New session but this stream is not enabled, skipping...", id); - return false; + return nullptr; } else if (_streamInUse) { SI_LOG_INFO("Frontend: @#1, New session but this stream is in use, skipping...", id); - return false; + return nullptr; } else if (!_device->capableOf(msys)) { if (_device->capableToTransform(params)) { SI_LOG_INFO("Frontend: @#1, Capable of transforming msys=@#2 with freq=@#3", @@ -203,26 +257,30 @@ bool Stream::findClientIDFor(SocketClient &socketClient, } else { SI_LOG_INFO("Frontend: @#1, Not capable of handling msys=@#2 with freq=@#3", id, StringConverter::delsys_to_string(msys), reqFreq); - return false; + return nullptr; } } } + // @TODO[StreamClient] Make here StreamClients etc. (add sharing) + if (_streamClientVector.empty()) { + determineAndMakeStreamClientType(id, socketClient); + } + // if we have a session ID try to find it among our StreamClients - for (std::size_t i = 0; i < MAX_CLIENTS; ++i) { + for (output::SpStreamClient client : _streamClientVector) { // If we have a new session we like to find an empty slot so '-1' - if (_client[i].getSessionID().compare(newSession ? "-1" : sessionID) == 0) { + if (client->getSessionID().compare(newSession ? "-1" : sessionID) == 0) { if (msys != input::InputSystem::UNDEFINED) { - SI_LOG_INFO("Frontend: @#1, StreamClient[@#2] with SessionID @#3 for @#4", - id, i, sessionID, StringConverter::delsys_to_string(msys)); + SI_LOG_INFO("Frontend: @#1, StreamClient with SessionID @#2 for @#3", + id, sessionID, StringConverter::delsys_to_string(msys)); } else { - SI_LOG_INFO("Frontend: @#1, StreamClient[@#2] with SessionID @#3", - id, i, sessionID); + SI_LOG_INFO("Frontend: @#1, StreamClient with SessionID @#2", + id, sessionID); } - _client[i].setSocketClient(socketClient); + client->setSocketClient(socketClient); _streamInUse = true; - clientID = i; - return true; + return client; } } if (msys != input::InputSystem::UNDEFINED) { @@ -231,244 +289,172 @@ bool Stream::findClientIDFor(SocketClient &socketClient, } else { SI_LOG_INFO("Frontend: @#1, No StreamClient with SessionID @#2", id, sessionID); } - return false; + return nullptr; } void Stream::checkForSessionTimeout() { base::MutexLock lock(_mutex); - - for (std::size_t i = 0; i < MAX_CLIENTS; ++i) { - if (_client[i].sessionTimeout() || !_enabled) { + if (!_streamInUse) { + return; + } + for (const output::SpStreamClient client : _streamClientVector) { + if (client->sessionTimeout() || !_enabled) { if (_enabled) { - SI_LOG_INFO("Frontend: @#1, Watchdog kicked in for StreamClient[@#2] with SessionID @#3", - _device->getFeID(), i, _client[i].getSessionID()); + SI_LOG_INFO("Frontend: @#1, Watchdog kicked in for StreamClient with SessionID @#2", + _device->getFeID(), client->getSessionID()); } else { - SI_LOG_INFO("Frontend: @#1, Reclaiming StreamClient[@#2] with SessionID @#3", - _device->getFeID(), i, _client[i].getSessionID()); + SI_LOG_INFO("Frontend: @#1, Reclaiming StreamClient with SessionID @#2", + _device->getFeID(), client->getSessionID()); } - teardown(i); + teardown(client); } } } -bool Stream::update(int clientID) { +bool Stream::update(output::SpStreamClient streamClient) { base::MutexLock lock(_mutex); - const FeID id = _device->getFeID(); - // first time streaming? - if (!_streaming) { - switch (_streamingType) { - case StreamingType::NONE: - _streaming.reset(nullptr); - SI_LOG_ERROR("Frontend: @#1, No streaming type found!!", id); - break; - case StreamingType::HTTP: - SI_LOG_DEBUG("Frontend: @#1, Found Streaming type: HTTP", id); - _streaming.reset(new output::StreamThreadHttp(*this)); - break; - case StreamingType::RTSP_UNICAST: - SI_LOG_DEBUG("Frontend: @#1, Found Streaming type: RTSP Unicast", id); - _streaming.reset(new output::StreamThreadRtp(*this)); - break; - case StreamingType::RTSP_MULTICAST: - SI_LOG_DEBUG("Frontend: @#1, Found Streaming type: RTSP Multicast", id); - _streaming.reset(new output::StreamThreadRtp(*this)); - break; - case StreamingType::RTP_TCP: - SI_LOG_DEBUG("Frontend: @#1, Found Streaming type: RTP/TCP", id); - _streaming.reset(new output::StreamThreadRtpTcp(*this)); - break; - case StreamingType::FILE_SRC: - SI_LOG_DEBUG("Frontend: @#1, Found Streaming type: FILE", id); - _streaming.reset(new output::StreamThreadTSWriter(*this, "test.ts")); - break; - default: - _streaming.reset(nullptr); - SI_LOG_ERROR("Frontend: @#1, Unknown streaming type!", id); - }; - if (!_streaming) { - return false; - } - } - // Get changed flag, before device update, because it resets it - const bool changed = _device->hasDeviceDataChanged(); + + // Get frequency changed flag, before device update, because it resets it + const bool frequencyChanged = _device->hasDeviceFrequencyChanged(); if (!_device->update()) { return false; } // start or restart streaming again - if (_streaming) { - if (!_streamActive) { - _streamActive = _streaming->startStreaming(clientID); - } else if (changed) { - _streaming->restartStreaming(clientID); - } + const bool threadStopped = _threadDeviceDataReader.isStopped(); + if (threadStopped) { + startStreaming(streamClient); + } else if (frequencyChanged) { + restartStreaming(streamClient); } return true; } -bool Stream::teardown(int clientID) { +bool Stream::teardown(output::SpStreamClient streamClient) { base::MutexLock lock(_mutex); - SI_LOG_INFO("Frontend: @#1, Teardown StreamClient[@#2] with SessionID @#3", - _device->getFeID(), clientID, _client[clientID].getSessionID()); + SI_LOG_INFO("Frontend: @#1, Teardown StreamClient with SessionID @#2", + _device->getFeID(), streamClient->getSessionID()); - // Stop streaming by deleting object - if (_streaming) { - _streaming.reset(nullptr); + const auto s = std::find(_streamClientVector.begin(), _streamClientVector.end(), streamClient); + if (s != _streamClientVector.end()) { + _streamClientVector.erase(s); } - _device->teardown(); - - // as last, else sessionID and IP is reset - _client[clientID].teardown(); - - // @TODO Are all other StreamClients stopped?? - if (clientID == 0) { - for (std::size_t i = 1; i < MAX_CLIENTS; ++i) { - _client[i].teardown(); - } - _streamActive = false; - _streamInUse = false; - _streamingType = StreamingType::NONE; + streamClient->teardown(); + if (_streamClientVector.size() == 0) { + stopStreaming(); } return true; } -bool Stream::processStreamingRequest(const SocketClient &client, const int clientID) { +bool Stream::processStreamingRequest(const SocketClient &client, output::SpStreamClient streamClient) { base::MutexLock lock(_mutex); - // Split message into Headers - HeaderVector headers = client.getHeaders(); - - // Save clients seq number - const std::string cseq = headers.getFieldParameter("CSeq"); - if (!cseq.empty()) { - _client[clientID].setCSeq(std::stoi(cseq)); + if (client.hasTransportParameters()) { + const std::string method = client.getMethod(); + if (method == "SETUP" || method == "PLAY" || method == "GET") { + const TransportParamVector params = client.getTransportParameters(); + _device->parseStreamString(params); + } } - // Save clients User-Agent - const std::string userAgent = headers.getFieldParameter("User-Agent"); - if (!userAgent.empty()) { - _client[clientID].setUserAgent(userAgent); + // Frequency changed?.. pause Stream + if (_device->hasDeviceFrequencyChanged() && _threadDeviceDataReader.isStarted()) { + pauseStreaming(streamClient); } - TransportParamVector params = client.getTransportParameters(); - const std::string method = client.getMethod(); - if ((method == "SETUP" || method == "PLAY" || method == "GET") && - client.hasTransportParameters()) { - _device->parseStreamString(params); - } + streamClient->processStreamingRequest(client); + return true; +} - // Channel changed?.. stop/pause Stream - if (_device->hasDeviceDataChanged()) { - if (_streaming) { - _streaming->pauseStreaming(clientID); +std::string Stream::getDescribeMediaLevelString() const { + _device->monitorSignal(false); + const std::string describe = _device->attributeDescribeString(); + std::string mediaLevel; + if (describe.size() > 5) { + for (const output::SpStreamClient client : _streamClientVector) { + mediaLevel += client->getDescribeMediaLevelString(_device->getStreamID(), describe); } } + return mediaLevel; +} - // Get transport type from request, and maybe ports - if (_streamingType == StreamingType::NONE) { - if (method == "GET") { - const std::string multicast = params.getParameter("multicast"); - if (!multicast.empty()) { - // Format: multicast=IP_ADDR,RTP_PORT,RTCP_PORT,TTL - const StringVector multiParam = StringConverter::split(multicast, ","); - if (multiParam.size() == 4) { - client.spoofHeaderWith(StringConverter::stringFormat( - "Transport: RTP/AVP;multicast;destination=@#1;port=@#2-@#3;ttl=@#4\r\n", - multiParam[0], multiParam[1], multiParam[2], multiParam[3])); - headers = client.getHeaders(); - SI_LOG_INFO("Frontend: @#1, Setup Multicast (@#2) for StreamClient[@#3]", - _device->getFeID(), multicast, clientID); - _streamingType = StreamingType::RTSP_MULTICAST; - _client[clientID].setSessionTimeoutCheck(StreamClient::SessionTimeoutCheck::TEARDOWN); - } - } else { - _streamingType = StreamingType::HTTP; - _client[clientID].setSessionTimeoutCheck(StreamClient::SessionTimeoutCheck::FILE_DESCRIPTOR); - } - _client[clientID].setIPAddressOfStream(_client[clientID].getIPAddressOfSocket()); - } else { - const std::string transport = headers.getFieldParameter("Transport"); - if (transport.find("unicast") != std::string::npos) { - if (transport.find("RTP/AVP") != std::string::npos) { - _streamingType = StreamingType::RTSP_UNICAST; - } - _client[clientID].setSessionTimeoutCheck(StreamClient::SessionTimeoutCheck::WATCHDOG); - } else if (transport.find("multicast") != std::string::npos) { - _streamingType = StreamingType::RTSP_MULTICAST; - _client[clientID].setSessionTimeoutCheck(StreamClient::SessionTimeoutCheck::TEARDOWN); - } else if (transport.find("RTP/AVP/TCP") != std::string::npos) { - _streamingType = StreamingType::RTP_TCP; - _client[clientID].setSessionTimeoutCheck(StreamClient::SessionTimeoutCheck::WATCHDOG); +bool Stream::threadExecuteDeviceDataReader() { + const size_t read = _readIndex; + size_t write = _writeIndex; + const size_t availableSize = (_writeIndex >= _readIndex) ? + ((_tsBuffer.size() - _writeIndex) + _readIndex) : (_readIndex - _writeIndex); + +// SI_LOG_DEBUG("Frontend: @#1, PacketBuffer MAX @#2 W @#3 R @#4 A @#5", _device->getFeID(), _tsBuffer.size(), write, read, availableSize); + if (_device->isDataAvailable() && availableSize >= 1) { + if (_device->readTSPackets(_tsBuffer[_writeIndex])) { +#ifdef LIBDVBCSA + if (_decrypt != nullptr) { + _decrypt->decrypt(_device->getFeIndex(), _device->getFeID(), _tsBuffer[_writeIndex]); } +#endif + // goto next, so inc write index + ++_writeIndex; + _writeIndex %= _tsBuffer.size(); + // reset next + _tsBuffer[_writeIndex].reset(); } } + executeStreamClientWriter(); + return true; +} - switch (_streamingType) { - case StreamingType::RTP_TCP: { - const int interleaved = headers.getIntFieldParameter("Transport", "interleaved"); - if (interleaved != -1) { - _client[clientID].setIPAddressOfStream(_client[clientID].getIPAddressOfSocket()); +void Stream::executeStreamClientWriter() { + // calculate interval + _t2 = std::chrono::steady_clock::now(); + const unsigned long interval = std::chrono::duration_cast(_t2 - _t1).count(); + const bool intervalExeeded = interval > _sendInterval; + + const size_t availableSize = (_writeIndex >= _readIndex) ? + (_writeIndex - _readIndex) : ((_tsBuffer.size() - _readIndex) + _writeIndex); + + if (availableSize > 0 || intervalExeeded) { + const size_t cnt = (availableSize > 4) ? 4 : 1; +// SI_LOG_DEBUG("Frontend: @#1, PacketBuffer MAX @#2 W @#3 R @#4 A @#5 C @#6", _device->getFeID(), _tsBuffer.size(), write, read, availableSize, cnt); + for (size_t i = 0; i < cnt; ++i) { + const bool readyToSend = _tsBuffer[_readIndex].isReadyToSend(); + if (readyToSend) { + _t1 = _t2; + bool incrementReadIndex = false; + // Send the packet full or not, else send null packet + for (const output::SpStreamClient client : _streamClientVector) { + if (client->writeData(_tsBuffer[_readIndex])) { + incrementReadIndex = true; + } } - } - break; - case StreamingType::RTSP_UNICAST: { - const int port = headers.getIntFieldParameter("Transport", "client_port"); - if (port != -1) { - _client[clientID].setIPAddressOfStream(_client[clientID].getIPAddressOfSocket()); - _client[clientID].getRtpSocketAttr().setupSocketStructure(_client[clientID].getIPAddressOfStream(), port, 1); - _client[clientID].getRtcpSocketAttr().setupSocketStructure(_client[clientID].getIPAddressOfStream(), port + 1, 1); + if (incrementReadIndex) { + ++_readIndex; + _readIndex %= _tsBuffer.size(); } - } - break; - case StreamingType::RTSP_MULTICAST: { - const std::string dest = headers.getStringFieldParameter("Transport", "destination"); - if (!dest.empty()) { - _client[clientID].setIPAddressOfStream(dest); - } - const std::string ports = headers.getStringFieldParameter("Transport", "port"); - const StringVector port = StringConverter::split(ports, "-"); - const int ttl = headers.getIntFieldParameter("Transport", "ttl"); - if (port.size() == 2) { - const int rtp = std::isdigit(port[0][0]) ? std::stoi(port[0]) : 15000; - const int rtcp = std::isdigit(port[1][0]) ? std::stoi(port[1]) : 15001; - _client[clientID].getRtpSocketAttr().setupSocketStructure(dest, rtp, ttl); - _client[clientID].getRtcpSocketAttr().setupSocketStructure(dest, rtcp, ttl); + } else if (intervalExeeded) { + for (const output::SpStreamClient client : _streamClientVector) { + client->writeData(_tsEmpty); } + break; + } else { + break; } - break; - default: - // Do nothing here - break; - }; - - _client[clientID].restartWatchDog(); - return true; + } + } } -std::string Stream::getDescribeMediaLevelString() const { - static const char *RTSP_DESCRIBE_MEDIA_LEVEL = - "m=video @#1 RTP/AVP 33\r\n" \ - "c=IN IP4 @#2\r\n" \ - "a=control:stream=@#3\r\n" \ - "a=fmtp:33 @#4\r\n" \ - "a=@#5\r\n"; - _device->monitorSignal(false); - const std::string desc_attr = _device->attributeDescribeString(); - if (desc_attr.size() > 5) { - if (_streamingType == StreamingType::RTSP_MULTICAST) { - return StringConverter::stringFormat(RTSP_DESCRIBE_MEDIA_LEVEL, - _client[0].getRtpSocketAttr().getSocketPort(), - _client[0].getIPAddressOfStream() + "/0", - _device->getStreamID().getID(), desc_attr, - (_streamActive) ? "sendonly" : "inactive"); - } else { - return StringConverter::stringFormat(RTSP_DESCRIBE_MEDIA_LEVEL, - 0, "0.0.0.0", _device->getStreamID().getID(), desc_attr, - (_streamActive) ? "sendonly" : "inactive"); - } +bool Stream::threadExecuteDeviceMonitor() { + // check do we need to update Device monitor signals + _signalLock = _device->monitorSignal(false); + const unsigned long interval = 200 * _rtcpSignalUpdate; + + const std::string desc = _device->attributeDescribeString(); + for (const output::SpStreamClient client : _streamClientVector) { + client->writeRTCPData(desc); } - return ""; + std::this_thread::sleep_for(std::chrono::milliseconds(interval)); + return true; } + diff --git a/src/Stream.h b/src/Stream.h index b03318f0..a5e2931a 100644 --- a/src/Stream.h +++ b/src/Stream.h @@ -21,23 +21,21 @@ #define STREAM_H_INCLUDE STREAM_H_INCLUDE #include -#include -#include #include +#include #include -#include +#include +#include #include #include -#include #include #include FW_DECL_NS0(SocketClient); -FW_DECL_NS1(output, StreamThreadBase); -FW_DECL_NS1(input, DeviceData); -FW_DECL_UP_NS1(output, StreamThreadBase); +FW_DECL_SP_NS1(input, Device); +FW_DECL_SP_NS1(output, StreamClient); FW_DECL_SP_NS2(decrypt, dvbapi, Client); FW_DECL_SP_NS2(input, dvb, FrontendDecryptInterface); @@ -45,19 +43,8 @@ FW_DECL_VECTOR_OF_SP_NS0(Stream); /// The class @c Stream carries all the data/information of an stream class Stream : - public StreamInterface, public base::XMLSupport { public: - static const unsigned int MAX_CLIENTS; - - enum class StreamingType { - NONE, - HTTP, - RTSP_UNICAST, - RTSP_MULTICAST, - RTP_TCP, - FILE_SRC - }; // ========================================================================= // -- Constructors and destructor ------------------------------------------ @@ -66,7 +53,7 @@ class Stream : Stream(input::SpDevice device, decrypt::dvbapi::SpClient decrypt); - virtual ~Stream(); + virtual ~Stream() = default; // ========================================================================= // -- static member functions ---------------------------------------------- @@ -87,45 +74,15 @@ class Stream : virtual void doFromXML(const std::string &xml) final; // ========================================================================= - // -- StreamInterface ------------------------------------------------------ + // -- Other member functions ----------------------------------------------- // ========================================================================= public: - virtual StreamID getStreamID() const final; - - virtual FeID getFeID() const final; - - virtual int getFeIndex() const final; - - virtual StreamClient &getStreamClient(int clientID) const final; - - virtual input::SpDevice getInputDevice() const final; - -#ifdef LIBDVBCSA - /// - virtual decrypt::dvbapi::SpClient getDecryptDevice() const final; -#endif - - virtual uint32_t getSSRC() const final; + StreamID getStreamID() const; - virtual long getTimestamp() const final; + FeID getFeID() const; - virtual uint32_t getSPC() const final; - - virtual unsigned int getRtcpSignalUpdateFrequency() const final; - - virtual uint32_t getSOC() const final; - - virtual void addRtpData(uint32_t byte, long timestamp) final; - - virtual double getRtpPayload() const final; - - virtual std::string attributeDescribeString() const final; - - // ========================================================================= - // -- Other member functions ----------------------------------------------- - // ========================================================================= - public: + int getFeIndex() const; #ifdef LIBDVBCSA /// @@ -138,21 +95,11 @@ class Stream : std::size_t &dvbt, std::size_t &dvbt2, std::size_t &dvbc, - std::size_t &dvbc2) { - if (_enabled) { - _device->addDeliverySystemCount(dvbs2, dvbt, dvbt2, dvbc, dvbc2); - } - } - - /// Find the clientID for the requested parameters - bool findClientIDFor(SocketClient &socketClient, - bool newSession, std::string sessionID, int &clientID); + std::size_t &dvbc2); - /// Check is this stream used already - bool streamInUse() const { - base::MutexLock lock(_mutex); - return _streamInUse; - } + /// Find the StreamClient for the requested parameters + output::SpStreamClient findStreamClientFor(SocketClient &socketClient, + bool newSession, std::string sessionID); /// Check is this stream enabled, can we use it? bool streamEnabled() const { @@ -160,29 +107,52 @@ class Stream : return _enabled; } - /// Get the stream type of this stream - StreamingType getStreamingType() const { - base::MutexLock lock(_mutex); - return _streamingType; - } - - /// Teardown the stream client with clientID - bool teardown(int clientID); + /// Teardown the specified StreamClient + /// @param streamClient specifies the client that will be used + bool teardown(output::SpStreamClient streamClient); /// Check if there are any stream clients with a session time-out /// that should be closed void checkForSessionTimeout(); + private: + + /// + void startStreaming(output::SpStreamClient streamClient); + + /// + void pauseStreaming(output::SpStreamClient streamClient); + + /// + void restartStreaming(output::SpStreamClient streamClient); + + /// Call this when there are no StreamClients using this stream anymore + void stopStreaming(); + + /// + void determineAndMakeStreamClientType(FeID feID, const SocketClient &client); + + /// Thread execute function @see base::Thread should @return true to + /// keep thread running and @return false will stop and then terminate this thread + bool threadExecuteDeviceDataReader(); + + /// Write data to Streamclients + void executeStreamClientWriter(); + + /// Thread execute function @see base::Thread should @return true to + /// keep thread running and @return false will stop and then terminate this thread + bool threadExecuteDeviceMonitor(); + // ========================================================================= // -- Functions used for RTSP Server --------------------------------------- // ========================================================================= public: /// - bool processStreamingRequest(const SocketClient &client, int clientID); + bool processStreamingRequest(const SocketClient &client, output::SpStreamClient streamClient); /// - bool update(int clientID); + bool update(output::SpStreamClient streamClient); /// std::string getDescribeMediaLevelString() const; @@ -194,22 +164,24 @@ class Stream : base::Mutex _mutex; - StreamingType _streamingType; /// - bool _enabled; /// is this stream enabled, could we use it? - bool _streamInUse; /// - bool _streamActive; /// - - StreamClient *_client; /// defines the participants of this stream - /// index 0 is the owner of this stream - output::UpStreamThreadBase _streaming; /// - decrypt::dvbapi::SpClient _decrypt;/// - input::SpDevice _device; /// - std::atomic _ssrc; /// synchronisation source identifier of sender - std::atomic _spc; /// sender RTP packet count (used in SR packet) - std::atomic _soc; /// sender RTP payload count (used in SR packet) - std::atomic _timestamp; /// - std::atomic _rtp_payload; /// - unsigned int _rtcpSignalUpdate; /// + bool _enabled; + bool _streamInUse; + + std::vector _streamClientVector; + + decrypt::dvbapi::SpClient _decrypt; + input::SpDevice _device; + unsigned int _rtcpSignalUpdate; + base::Thread _threadDeviceDataReader; + base::Thread _threadDeviceMonitor; + std::array _tsBuffer; + mpegts::PacketBuffer _tsEmpty; + std::size_t _writeIndex; + std::size_t _readIndex; + unsigned long _sendInterval; + std::chrono::steady_clock::time_point _t1; + std::chrono::steady_clock::time_point _t2; + std::atomic_bool _signalLock; }; diff --git a/src/StreamClient.cpp b/src/StreamClient.cpp deleted file mode 100644 index 845258fb..00000000 --- a/src/StreamClient.cpp +++ /dev/null @@ -1,145 +0,0 @@ -/* StreamClient.cpp - - Copyright (C) 2014 - 2023 Marc Postema (mpostema09 -at- gmail.com) - - This program is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public License - as published by the Free Software Foundation; either version 2 - of the License, or (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - Or, point your browser to http://www.gnu.org/copyleft/gpl.html -*/ -#include - -#include -#include -#include - -// ============================================================================ -// -- Constructors and destructor -------------------------------------------- -// ============================================================================ - -StreamClient::StreamClient() : - _socketClient(nullptr), - _sessionTimeoutCheck(SessionTimeoutCheck::WATCHDOG), - _ipAddress("0.0.0.0"), - _watchdog(0), - _sessionTimeout(60), - _sessionID("-1"), - _userAgent("None"), - _cseq(0) {} - -StreamClient::~StreamClient() {} - -// ======================================================================= -// -- base::XMLSupport -------------------------------------------------- -// ======================================================================= - -void StreamClient::doAddToXML(std::string &xml) const { - ADD_XML_ELEMENT(xml, "owner", _ipAddress); - ADD_XML_ELEMENT(xml, "ownerSessionID", _sessionID); - ADD_XML_ELEMENT(xml, "userAgent", _userAgent); - ADD_XML_ELEMENT(xml, "rtpPort", _rtp.getSocketPort()); - ADD_XML_ELEMENT(xml, "rtcpPort", _rtcp.getSocketPort()); - ADD_XML_ELEMENT(xml, "httpPort", (_socketClient == nullptr) ? 0 : _socketClient->getSocketPort()); -} - -void StreamClient::doFromXML(const std::string &UNUSED(xml)) {} - -// ============================================================================ -// -- Other member functions ------------------------------------------------- -// ============================================================================ - -void StreamClient::teardown() { - base::MutexLock lock(_mutex); - - _watchdog = 0; - _sessionID = "-1"; - _ipAddress = "0.0.0.0"; - _userAgent = "None"; - _sessionTimeoutCheck = SessionTimeoutCheck::WATCHDOG; - - // Do not delete - _socketClient = nullptr; -} - -void StreamClient::restartWatchDog() { - base::MutexLock lock(_mutex); - - // reset watchdog and give some extra timeout - _watchdog = std::time(nullptr) + _sessionTimeout + 15; -} - -void StreamClient::selfDestruct() { - base::MutexLock lock(_mutex); - _watchdog = 1; -} - -bool StreamClient::isSelfDestructing() const { - base::MutexLock lock(_mutex); - return _watchdog == 1; -} - -bool StreamClient::sessionTimeout() const { - base::MutexLock lock(_mutex); - // See if we need to check watchdog or http FD - switch (_sessionTimeoutCheck) { - case SessionTimeoutCheck::WATCHDOG: - return ((_watchdog != 0) && (_watchdog < std::time(nullptr))); - case SessionTimeoutCheck::FILE_DESCRIPTOR: - return (_socketClient->getFD() == -1); - case SessionTimeoutCheck::TEARDOWN: - default: - return false; - }; -} - -void StreamClient::setSocketClient(SocketClient &socket) { - base::MutexLock lock(_mutex); - _socketClient = &socket; -} - -SocketAttr &StreamClient::getRtpSocketAttr() { - return _rtp; -} - -SocketAttr &StreamClient::getRtcpSocketAttr() { - return _rtcp; -} - -// ============================================================================ -// -- HTTP member functions -------------------------------------------------- -// ============================================================================ - -bool StreamClient::sendHttpData(const void *buf, std::size_t len, int flags) { - base::MutexLock lock(_mutex); - return (_socketClient == nullptr) ? false : _socketClient->sendData(buf, len, flags); -} - -bool StreamClient::writeHttpData(const struct iovec *iov, int iovcnt) { - base::MutexLock lock(_mutex); - return (_socketClient == nullptr) ? false : _socketClient->writeData(iov, iovcnt); -} - -int StreamClient::getHttpSocketPort() const { - base::MutexLock lock(_mutex); - return (_socketClient == nullptr) ? 0 : _socketClient->getSocketPort(); -} - -int StreamClient::getHttpNetworkSendBufferSize() const { - base::MutexLock lock(_mutex); - return (_socketClient == nullptr) ? 0 : _socketClient->getNetworkSendBufferSize(); -} - -bool StreamClient::setHttpNetworkSendBufferSize(int size) { - base::MutexLock lock(_mutex); - return (_socketClient == nullptr) ? false : _socketClient->setNetworkSendBufferSize(size); -} diff --git a/src/StreamInterface.h b/src/StreamInterface.h deleted file mode 100644 index 9d1c9935..00000000 --- a/src/StreamInterface.h +++ /dev/null @@ -1,91 +0,0 @@ -/* StreamInterface.h - - Copyright (C) 2014 - 2023 Marc Postema (mpostema09 -at- gmail.com) - - This program is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public License - as published by the Free Software Foundation; either version 2 - of the License, or (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - Or, point your browser to http://www.gnu.org/copyleft/gpl.html -*/ -#ifndef STREAMINTERFACE_H_INCLUDE -#define STREAMINTERFACE_H_INCLUDE STREAMINTERFACE_H_INCLUDE - -#include -#include - -FW_DECL_NS0(StreamClient); -FW_DECL_SP_NS1(input, Device); -FW_DECL_SP_NS2(decrypt, dvbapi, Client); - -/// The class @c StreamInterface is an interface to an @c Stream -class StreamInterface { - // ======================================================================= - // -- Constructors and destructor ---------------------------------------- - // ======================================================================= - public: - - StreamInterface() {} - - virtual ~StreamInterface() {} - - // ======================================================================= - // -- Other member functions --------------------------------------------- - // ======================================================================= - public: - - /// Get the streamID of this stream - virtual StreamID getStreamID() const = 0; - - /// Get the FeID of the Frontend used for this stream - virtual FeID getFeID() const = 0; - - /// Get the index of this Frontend used for this stream - virtual int getFeIndex() const = 0; - - /// - virtual StreamClient &getStreamClient(int clientID) const = 0; - - /// - virtual input::SpDevice getInputDevice() const = 0; - -#ifdef LIBDVBCSA - /// - virtual decrypt::dvbapi::SpClient getDecryptDevice() const = 0; -#endif - - virtual uint32_t getSSRC() const = 0; - - /// - virtual long getTimestamp() const = 0; - - /// - virtual uint32_t getSPC() const = 0; - - /// The Frontend Monitor update interval - virtual unsigned int getRtcpSignalUpdateFrequency() const = 0; - - /// - virtual uint32_t getSOC() const = 0; - - /// - virtual void addRtpData(uint32_t byte, long timestamp) = 0; - - /// - virtual double getRtpPayload() const = 0; - - /// Get the stream Description string for RTCP and DESCRIBE command - virtual std::string attributeDescribeString() const = 0; - -}; - -#endif // STREAMINTERFACE_H_INCLUDE diff --git a/src/StreamManager.cpp b/src/StreamManager.cpp index 50023466..02bf87b9 100644 --- a/src/StreamManager.cpp +++ b/src/StreamManager.cpp @@ -21,7 +21,7 @@ #include #include -#include +#include #include #include #include @@ -151,7 +151,7 @@ std::tuple StreamManager::findFrontendID(const Transpor return { FeIndex(), FeID(), StreamID() }; } -SpStream StreamManager::findStreamAndClientIDFor(SocketClient &socketClient, int &clientID) { +std::tuple StreamManager::findStreamAndClientFor(SocketClient &socketClient) { // Here we need to find the correct Stream and StreamClient assert(!_streamVector.empty()); HeaderVector headers = socketClient.getHeaders(); @@ -162,7 +162,6 @@ SpStream StreamManager::findStreamAndClientIDFor(SocketClient &socketClient, int std::string sessionID = headers.getFieldParameter("Session"); bool newSession = false; - clientID = 0; // if no sessionID, then make a new one or its just a outside message. if (sessionID.empty()) { @@ -176,45 +175,47 @@ SpStream StreamManager::findStreamAndClientIDFor(SocketClient &socketClient, int } else { // None of the above.. so it is just an outside session SI_LOG_DEBUG("Found message outside session"); - return nullptr; + return { nullptr, nullptr }; } } // if no index, then we have to find a suitable one if (feIndex == -1) { - SI_LOG_INFO("Found FrondtendID: x (fe=x) StreamID: x SessionID: @#1", sessionID); + SI_LOG_INFO("Found FrondtendID: x (fe=x) StreamID: x SessionID: @#1 New Session: @#2", + sessionID, newSession ? "true" : "false"); for (SpStream stream : _streamVector) { - if (stream->findClientIDFor(socketClient, newSession, sessionID, clientID)) { - stream->getStreamClient(clientID).setSessionID(sessionID); - return stream; + output::SpStreamClient streamClient = stream->findStreamClientFor(socketClient, newSession, sessionID); + if (streamClient) { + streamClient->setSessionID(sessionID); + return { stream, streamClient }; } } } else { SI_LOG_INFO("Found FrondtendID: @#1 (fe=@#2) StreamID: @#3 SessionID: @#4", feID, feID, streamID, sessionID); // Did we find the StreamClient? - if (_streamVector[feIndex]->findClientIDFor(socketClient, newSession, sessionID, clientID)) { - _streamVector[feIndex]->getStreamClient(clientID).setSessionID(sessionID); - return _streamVector[feIndex]; + output::SpStreamClient streamClient = _streamVector[feIndex]->findStreamClientFor(socketClient, newSession, sessionID); + if (streamClient) { + streamClient->setSessionID(sessionID); + return { _streamVector[feIndex], streamClient }; } // No, Then try to search in other Streams for (SpStream stream : _streamVector) { - if (stream->findClientIDFor(socketClient, newSession, sessionID, clientID)) { - stream->getStreamClient(clientID).setSessionID(sessionID); - return stream; + streamClient = stream->findStreamClientFor(socketClient, newSession, sessionID); + if (streamClient) { + streamClient->setSessionID(sessionID); + return { stream, streamClient }; } } } // Did not find anything SI_LOG_ERROR("Found no Stream/Client of interest!"); - return nullptr; + return { nullptr, nullptr }; } void StreamManager::checkForSessionTimeout() { assert(!_streamVector.empty()); for (SpStream stream : _streamVector) { - if (stream->streamInUse()) { - stream->checkForSessionTimeout(); - } + stream->checkForSessionTimeout(); } } diff --git a/src/StreamManager.h b/src/StreamManager.h index a3ac25a9..cf79c9f2 100644 --- a/src/StreamManager.h +++ b/src/StreamManager.h @@ -32,6 +32,7 @@ FW_DECL_NS0(TransportParamVector); FW_DECL_VECTOR_OF_SP_NS0(Stream); +FW_DECL_SP_NS1(output, StreamClient); FW_DECL_SP_NS2(decrypt, dvbapi, Client); FW_DECL_SP_NS2(input, dvb, FrontendDecryptInterface); @@ -77,9 +78,7 @@ class StreamManager : bool enableUnsecureFrontends); /// - SpStream findStreamAndClientIDFor( - SocketClient &socketClient, - int &clientID); + std::tuple findStreamAndClientFor(SocketClient &socketClient); /// std::tuple findFrontendIDWithStreamID(StreamID id) const; diff --git a/src/StringConverter.cpp b/src/StringConverter.cpp index 8eac9ecb..0ba1599a 100644 --- a/src/StringConverter.cpp +++ b/src/StringConverter.cpp @@ -56,7 +56,7 @@ StringVector StringConverter::split(const std::string_view input, std::string StringConverter::stringToUpper(const std::string_view str) { std::string result(str); - for (auto &c : result) { + for (auto& c : result) { if (std::islower(c)) { c = std::toupper(c); } @@ -99,7 +99,7 @@ std::string StringConverter::getline(const std::string_view msg, return std::string(line); } -std::string StringConverter::convertToHexASCIITable(const unsigned char *p, const std::size_t length, const std::size_t blockSize) { +std::string StringConverter::convertToHexASCIITable(const unsigned char* p, const std::size_t length, const std::size_t blockSize) { if (blockSize == 0) { return ""; } diff --git a/src/StringConverter.h b/src/StringConverter.h index 5a73dda2..37d8f6db 100644 --- a/src/StringConverter.h +++ b/src/StringConverter.h @@ -90,7 +90,7 @@ class StringConverter { return line; } - static std::string convertToHexASCIITable(const unsigned char *p, std::size_t length, std::size_t blockSize); + static std::string convertToHexASCIITable(const unsigned char* p, std::size_t length, std::size_t blockSize); template static std::string hexString(const T &value, const int width) { diff --git a/src/TransportParamVector.cpp b/src/TransportParamVector.cpp index 54fc7265..e8b56055 100644 --- a/src/TransportParamVector.cpp +++ b/src/TransportParamVector.cpp @@ -27,7 +27,7 @@ // ============================================================================= std::string TransportParamVector::getParameter(const std::string_view parameter) const { - for (const std::string ¶m : _vector) { + for (const std::string& param : _vector) { const auto b = param.find(parameter, 0); const auto e = param.find_first_not_of(parameter, b); if (b != std::string::npos && parameter.size() == e && param[e] == '=') { @@ -40,7 +40,7 @@ std::string TransportParamVector::getParameter(const std::string_view parameter) void TransportParamVector::replaceParameter( const std::string_view parameter, const std::string_view value) { - for (std::string ¶m : _vector) { + for (std::string& param : _vector) { const auto b = param.find(parameter, 0); const auto e = param.find_first_not_of(parameter, b); if (b != std::string::npos && parameter.size() == e && param[e] == '=') { diff --git a/src/Utils.cpp b/src/Utils.cpp index dfc97017..6066debb 100644 --- a/src/Utils.cpp +++ b/src/Utils.cpp @@ -61,7 +61,7 @@ void Utils::annotateBackTrace(const char *app, const char *file) { const std::string addr = line.substr(begin + 1, end - begin - 1); char addr2line[256]; - snprintf(addr2line, sizeof(addr2line),"addr2line %s -e %s", addr.c_str(), app); + snprintf(addr2line, sizeof(addr2line),"addr2line %s -e %s", addr.data(), app); base::ChildPIPEReader exec; exec.open(addr2line); diff --git a/src/base/CharPointerArray.h b/src/base/CharPointerArray.h index 5da14e8a..b2945636 100644 --- a/src/base/CharPointerArray.h +++ b/src/base/CharPointerArray.h @@ -35,7 +35,7 @@ class CharPointerArray { // Allocate Size of container + null terminator (and nullptr it) _data = new char *[container.size() + 1]{nullptr}; int counter = 0; - for (const std::string &str : container) { + for (const std::string& str : container) { // Allocate Size of str + null terminator (and zero it) _data[counter] = new char [str.size() + 1]{0}; // Copy str diff --git a/src/base/M3UParser.cpp b/src/base/M3UParser.cpp index c8a057e7..826a3906 100644 --- a/src/base/M3UParser.cpp +++ b/src/base/M3UParser.cpp @@ -92,7 +92,7 @@ namespace base { for (std::string token; tokenizerTrackInfo.isNextToken(token); ) { const std::string srcStr = findAndParseToken(token, "satip-src=\""); if (!srcStr.empty()) { - element.src = std::atof(srcStr.c_str()); + element.src = std::atof(srcStr.data()); } const std::string freqStr = findAndParseToken(token, "satip-freq=\""); if (!freqStr.empty()) { diff --git a/src/base/Thread.cpp b/src/base/Thread.cpp index 6717df63..87c92ce1 100644 --- a/src/base/Thread.cpp +++ b/src/base/Thread.cpp @@ -44,12 +44,10 @@ namespace base { const std::string &name, FunctionThreadExecute threadExecuteFunction) : _state(State::Unknown), - _thread(0u), + _thread(0), _name(name), _threadExecuteFunction(threadExecuteFunction) {} - Thread::~Thread() {} - // ========================================================================= // -- Other member functions ----------------------------------------------- // ========================================================================= @@ -72,11 +70,11 @@ namespace base { return; } _state = State::Stopping; - size_t timeout = 0u; + size_t timeout = 0; while (_state != State::Stopped) { std::this_thread::sleep_for(std::chrono::milliseconds(100)); ++timeout; - if (timeout > 50u) { + if (timeout > 50) { cancelThread(); SI_LOG_DEBUG("@#1: Thread did not stop within timeout? !!TIMEOUT!!", _name); break; @@ -163,9 +161,9 @@ namespace base { pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, nullptr); pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, nullptr); #ifdef HAS_NP_FUNCTIONS - pthread_setname_np(_thread, _name.c_str()); + pthread_setname_np(_thread, _name.data()); #else - prctl(PR_SET_NAME, _name.c_str(), 0, 0, 0); + prctl(PR_SET_NAME, _name.data(), 0, 0, 0); #endif try { for (;;) { diff --git a/src/base/Thread.h b/src/base/Thread.h index b0c198b3..386470ec 100644 --- a/src/base/Thread.h +++ b/src/base/Thread.h @@ -62,7 +62,7 @@ class Thread { const std::string &name, FunctionThreadExecute threadExecuteFunction); - virtual ~Thread(); + virtual ~Thread() = default; // ===================================================================== // -- static member functions ------------------------------------------ @@ -89,6 +89,21 @@ class Thread { /// @return true if thread is running false if there was an error bool startThread(); + /// Check if this thread is started + bool isStarted() const { + return _state == State::Started || _state == State::Starting; + } + + /// Check if this thread is paused + bool isPaused() const { + return _state == State::Paused || _state == State::Pausing; + } + + /// Check if this thread is paused + bool isStopped() const { + return _state == State::Stopped || _state == State::Stopping || _state == State::Unknown; + } + /// Stop the running thread give 5.0 sec to stop else cancel it void stopThread(); diff --git a/src/base/ThreadBase.cpp b/src/base/ThreadBase.cpp index d059b05c..baac386f 100644 --- a/src/base/ThreadBase.cpp +++ b/src/base/ThreadBase.cpp @@ -143,9 +143,9 @@ namespace base { pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, nullptr); pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, nullptr); #ifdef HAS_NP_FUNCTIONS - pthread_setname_np(_thread, _name.c_str()); + pthread_setname_np(_thread, _name.data()); #else - prctl(PR_SET_NAME, _name.c_str(), 0, 0, 0); + prctl(PR_SET_NAME, _name.data(), 0, 0, 0); #endif try { threadEntry(); diff --git a/src/decrypt/dvbapi/Client.cpp b/src/decrypt/dvbapi/Client.cpp index 10bdfac9..a41d1968 100644 --- a/src/decrypt/dvbapi/Client.cpp +++ b/src/decrypt/dvbapi/Client.cpp @@ -155,7 +155,7 @@ namespace decrypt::dvbapi { // Don't send PAT or PMT before we have an active if (pid == 0 || frontend->isMarkedAsActivePMT(pid)) { } else { - const unsigned char *tableData = filterData.c_str(); + const unsigned char* tableData = filterData.data(); const int sectionLength = (((tableData[6] & 0x0F) << 8) | tableData[7]) + 3; // 3 = tableID + length field #ifdef ICAM // Check for ICAM ECM @@ -224,7 +224,7 @@ namespace decrypt::dvbapi { bool Client::initClientSocket(SocketClient &client, const std::string &ipAddr, int port) { - client.setupSocketStructure(ipAddr, port, 1); + client.setupSocketStructure(ipAddr, port, 0); if (!client.setupSocketHandle(SOCK_STREAM /*| SOCK_NONBLOCK*/, 0)) { SI_LOG_ERROR("OSCam Server handle failed"); @@ -254,7 +254,7 @@ namespace decrypt::dvbapi { std::memcpy(&buff[4], &version, 2); buff[6] = len; - std::memcpy(&buff[7], name.c_str(), len); + std::memcpy(&buff[7], name.data(), len); if (!_client.sendData(buff.get(), 7 + len, MSG_DONTWAIT)) { SI_LOG_ERROR("write failed"); @@ -401,7 +401,7 @@ namespace decrypt::dvbapi { char tmpData[2048]; auto i = 0; const ssize_t size = _client.recvDatafrom(tmpData, sizeof(tmpData) - 1, MSG_DONTWAIT); - const unsigned char *buf = reinterpret_cast(&tmpData); + const unsigned char* buf = reinterpret_cast(&tmpData); if (size > 0) { while (i < size) { // get command @@ -423,8 +423,8 @@ namespace decrypt::dvbapi { const int demux = buf[i + 5]; const int filter = buf[i + 6]; const int pid = (buf[i + 7] << 8) | buf[i + 8]; - const unsigned char *filterData = &buf[i + 9]; - const unsigned char *filterMask = &buf[i + 25]; + const unsigned char* filterData = &buf[i + 9]; + const unsigned char* filterMask = &buf[i + 25]; // SI_LOG_BIN_DEBUG(&buf[i], 65, "Frontend: @#1, DVBAPI_DMX_SET_FILTER", adapter); @@ -534,10 +534,10 @@ namespace decrypt::dvbapi { _serverIPAddr = element; } if (findXMLElement(xml, "OSCamPORT.value", element)) { - _serverPort = std::stoi(element.c_str()); + _serverPort = std::stoi(element.data()); } if (findXMLElement(xml, "AdapterOffset.value", element)) { - _adapterOffset = std::stoi(element.c_str()); + _adapterOffset = std::stoi(element.data()); } if (findXMLElement(xml, "OSCamEnabled.value", element)) { _enabled = (element == "true") ? true : false; diff --git a/src/decrypt/dvbapi/ClientProperties.h b/src/decrypt/dvbapi/ClientProperties.h index 40e93c56..708dacfe 100644 --- a/src/decrypt/dvbapi/ClientProperties.h +++ b/src/decrypt/dvbapi/ClientProperties.h @@ -76,7 +76,7 @@ namespace decrypt::dvbapi { void decryptBatch(); /// Set the 'next' key for the requested parity - void setKey(const unsigned char *cw, int parity, int index) { + void setKey(const unsigned char* cw, int parity, int index) { _keys.set(cw, parity, index); } @@ -91,7 +91,7 @@ namespace decrypt::dvbapi { /// Start and add the requested filter void startOSCamFilterData(const FeID id, int pid, int demux, int filter, - const unsigned char *filterData, const unsigned char *filterMask) { + const unsigned char* filterData, const unsigned char* filterMask) { _filter.start(id, pid, demux, filter, filterData, filterMask); } @@ -101,7 +101,7 @@ namespace decrypt::dvbapi { } /// Find the correct filter for the 'collected' data or ts packet - bool findOSCamFilterData(const FeID id, int pid, const unsigned char *tsPacket, const int tableID, + bool findOSCamFilterData(const FeID id, int pid, const unsigned char* tsPacket, const int tableID, int &filter, int &demux, mpegts::TSData &filterData) { return _filter.find(id, pid, tsPacket, tableID, filter, demux, filterData); } diff --git a/src/decrypt/dvbapi/Filter.h b/src/decrypt/dvbapi/Filter.h index 13e09fc1..4076c2fd 100644 --- a/src/decrypt/dvbapi/Filter.h +++ b/src/decrypt/dvbapi/Filter.h @@ -46,7 +46,7 @@ namespace decrypt::dvbapi { /// Start and add the requested filter void start(const FeID id, int pid, int demux, int filter, - const unsigned char *filterData, const unsigned char *filterMask) { + const unsigned char* filterData, const unsigned char* filterMask) { base::MutexLock lock(_mutex); if (demux < DEMUX_SIZE && filter < FILTER_SIZE) { _filterData[demux][filter].set(id, pid, filterData, filterMask); @@ -54,7 +54,7 @@ namespace decrypt::dvbapi { } /// Find the correct filter for the 'collected' data or ts packet - bool find(const FeID id, const int pid, const unsigned char *data, const int tableID, + bool find(const FeID id, const int pid, const unsigned char* data, const int tableID, int &filter, int &demux, mpegts::TSData &filterData) { base::MutexLock lock(_mutex); for (demux = 0; demux < DEMUX_SIZE; ++demux) { diff --git a/src/decrypt/dvbapi/FilterData.h b/src/decrypt/dvbapi/FilterData.h index 795c91bb..7ce55da7 100644 --- a/src/decrypt/dvbapi/FilterData.h +++ b/src/decrypt/dvbapi/FilterData.h @@ -59,7 +59,7 @@ namespace decrypt::dvbapi { } /// Collect Table data for tableID - void collectRawTableData(const FeID id, const int tableID, const unsigned char *data, bool trace) { + void collectRawTableData(const FeID id, const int tableID, const unsigned char* data, bool trace) { _tableData.collectRawData(id, tableID, data, trace); } @@ -95,7 +95,7 @@ namespace decrypt::dvbapi { } /// Set the requested filter data and set it active - void set(const FeID id, int pid, const unsigned char *data, const unsigned char *mask) { + void set(const FeID id, int pid, const unsigned char* data, const unsigned char* mask) { _pid = pid; _id = id; _filterActive = true; @@ -106,7 +106,7 @@ namespace decrypt::dvbapi { } /// Check if the requested data matches this filter or if we already collecting - bool matchOrCollecting(const unsigned char *data) const { + bool matchOrCollecting(const unsigned char* data) const { if (!_collecting) { bool match = true; const uint32_t sectionLength = (((data[6] & 0x0F) << 8) | data[7]) + 3; // 3 = tableID + length field diff --git a/src/decrypt/dvbapi/Keys.cpp b/src/decrypt/dvbapi/Keys.cpp index e6fd4371..f63bbe5b 100644 --- a/src/decrypt/dvbapi/Keys.cpp +++ b/src/decrypt/dvbapi/Keys.cpp @@ -34,7 +34,7 @@ namespace decrypt::dvbapi { // -- Other member functions -------------------------------------------------- // ============================================================================= -void Keys::set(const unsigned char *cw, int parity, int UNUSED(index)) { +void Keys::set(const unsigned char* cw, int parity, int UNUSED(index)) { dvbcsa_bs_key_s *k = dvbcsa_bs_key_alloc(); #ifdef ICAM const unsigned char icamECM = (_icam[parity].size() > 0) ? _icam[parity].back() : 0; diff --git a/src/decrypt/dvbapi/Keys.h b/src/decrypt/dvbapi/Keys.h index 908b1ce9..35019819 100644 --- a/src/decrypt/dvbapi/Keys.h +++ b/src/decrypt/dvbapi/Keys.h @@ -53,7 +53,7 @@ class Keys { // ========================================================================= public: - void set(const unsigned char *cw, int parity, int index); + void set(const unsigned char* cw, int parity, int index); void setICAM(const unsigned char ecm, int parity); diff --git a/src/decrypt/dvbca/DVBCA.cpp b/src/decrypt/dvbca/DVBCA.cpp index 3831db1f..a18024af 100644 --- a/src/decrypt/dvbca/DVBCA.cpp +++ b/src/decrypt/dvbca/DVBCA.cpp @@ -164,7 +164,7 @@ static char fileFIFO[] = "/tmp/fifo"; mpegts::PMT::Data tableData; pmt.getDataForSectionNumber(0, tableData); const int programNumber = pmt.getProgramNumber(); - const unsigned char *data = tableData.data.c_str(); + const unsigned char* data = tableData.data.data(); const std::size_t tableSize = (data[6] & 0x0F) | data[7]; const mpegts::TSData progInfo = pmt.getProgramInfo(); const std::size_t progSize = progInfo.size(); @@ -198,7 +198,7 @@ static char fileFIFO[] = "/tmp/fifo"; // 4 = CRC 9 = PMT Header from section length const std::size_t len = tableSize - 4u - 9u - progSize; - const unsigned char *ptr = &data[17u + progSize]; + const unsigned char* ptr = &data[17u + progSize]; for (std::size_t i = 0u; i < len; ) { caPMT += ptr[i + 0u]; caPMT += ptr[i + 1u]; @@ -566,7 +566,7 @@ END } // path << "/proc/stb/tsmux/input" << tuner_no << "_choices"; -// if(::access(path.str().c_str(), R_OK) < 0) +// if(::access(path.str().data(), R_OK) < 0) // static const char *proc_ci_choices = "/proc/stb/tsmux/ci0_input_choices"; // if (CFile::contains_word(proc_ci_choices, "PVR")) // lowest prio = PVR @@ -578,11 +578,11 @@ END //setInputSource(int tuner_no, const std::string &source) 'source' Tuner Letter // snprintf(buf, sizeof(buf), "/proc/stb/tsmux/input%d", tuner_no); -// if (CFile::write(buf, source.c_str()) == -1) +// if (CFile::write(buf, source.data()) == -1) //int eDVBCISlot::setSource(const std::string &source) 'source' Tuner Letter // snprintf(buf, sizeof(buf), "/proc/stb/tsmux/ci%d_input", slotid); -// if(CFile::write(buf, source.c_str()) == -1) +// if(CFile::write(buf, source.data()) == -1) //int eDVBCISlot::setClockRate(int rate) // snprintf(buf, sizeof(buf), "/proc/stb/tsmux/ci%d_tsclk", slotid); diff --git a/src/input/Device.h b/src/input/Device.h index 89ebae60..c3af625a 100644 --- a/src/input/Device.h +++ b/src/input/Device.h @@ -68,11 +68,10 @@ class Device : /// Read the available data from this device /// @param buffer this is the buffer were to wirite to - /// @param finalCall this should be the last try and should return as soon as possible - virtual bool readTSPackets(mpegts::PacketBuffer &buffer, bool finalCall) = 0; + virtual bool readTSPackets(mpegts::PacketBuffer& buffer) = 0; /// Check the capability of this device - /// @param system + /// @param system specifies the input system that this device is capable of virtual bool capableOf(input::InputSystem system) const = 0; /// Check if this device can transform the reguest according to an M3U file @@ -84,8 +83,10 @@ class Device : /// @return true meaning there is a Signal Lock virtual bool monitorSignal(bool showStatus) = 0; - /// - virtual bool hasDeviceDataChanged() const = 0; + /// This indicates that the frequency (or pol) has changed, so some actions + /// are required + /// @return true meaning the frequency (or pol) has changed + virtual bool hasDeviceFrequencyChanged() const = 0; /// Parse the input/request string from client. /// For example: diff --git a/src/input/DeviceData.cpp b/src/input/DeviceData.cpp index c512368f..286f68dd 100644 --- a/src/input/DeviceData.cpp +++ b/src/input/DeviceData.cpp @@ -30,7 +30,7 @@ namespace input { DeviceData::DeviceData() { _delsys = input::InputSystem::UNDEFINED; - _changed = false; + _frequencyChanged = false; _internalPidFiltering = false; _status = static_cast(0); _strength = 0; @@ -78,7 +78,7 @@ void DeviceData::doFromXML(const std::string &xml) { void DeviceData::initialize() { base::MutexLock lock(_mutex); - _changed = false; + _frequencyChanged = false; _delsys = input::InputSystem::UNDEFINED; _filter.clear(); setMonitorData(static_cast(0), 0, 0, 0, 0); @@ -139,14 +139,14 @@ fe_delivery_system DeviceData::convertDeliverySystem() const { } } -void DeviceData::resetDeviceDataChanged() { +void DeviceData::resetDeviceFrequencyChanged() { base::MutexLock lock(_mutex); - _changed = false; + _frequencyChanged = false; } -bool DeviceData::hasDeviceDataChanged() const { +bool DeviceData::hasDeviceFrequencyChanged() const { base::MutexLock lock(_mutex); - return _changed; + return _frequencyChanged; } void DeviceData::parseAndUpdatePidsTable(FeID id, const TransportParamVector& params) { diff --git a/src/input/DeviceData.h b/src/input/DeviceData.h index 0d84c879..eca49e25 100644 --- a/src/input/DeviceData.h +++ b/src/input/DeviceData.h @@ -103,10 +103,10 @@ class DeviceData : /// Check the 'Channel Data changed' flag. /// If changed we should update frontend - bool hasDeviceDataChanged() const; + bool hasDeviceFrequencyChanged() const; /// Reset/clear the 'Channel Data changed' flag - void resetDeviceDataChanged(); + void resetDeviceFrequencyChanged(); /// Get the current Delivery System input::InputSystem getDeliverySystem() const; @@ -155,7 +155,7 @@ class DeviceData : base::Mutex _mutex; - bool _changed; + bool _frequencyChanged; input::InputSystem _delsys; mpegts::Filter _filter; mpegts::Generator _generator; diff --git a/src/input/childpipe/TSReader.cpp b/src/input/childpipe/TSReader.cpp index 74c87d35..5946f692 100644 --- a/src/input/childpipe/TSReader.cpp +++ b/src/input/childpipe/TSReader.cpp @@ -34,7 +34,7 @@ namespace input::childpipe { // ============================================================================= // -- Static constexpr variables ---------------------------------------------- // ============================================================================= -static constexpr int WAIT_TIMER = 15; +static constexpr int WAIT_TIMER = 10; // ============================================================================= // -- Constructors and destructor --------------------------------------------- @@ -118,8 +118,8 @@ bool TSReader::isDataAvailable() { return true; } -bool TSReader::readTSPackets(mpegts::PacketBuffer &buffer, const bool finalCall) { -/////////////////////// +bool TSReader::readTSPackets(mpegts::PacketBuffer& buffer) { +/* ////////////////////// if (_deviceData.generatePSI()) { const mpegts::TSData data = _deviceData.getPSIGenerator().generatePSIFrom( _feID, _transform.getTransformationMap()); @@ -131,24 +131,25 @@ bool TSReader::readTSPackets(mpegts::PacketBuffer &buffer, const bool finalCall) return buffer.full(); } -/////////////////////// +////////////////////// */ if (!_exec.isOpen()) { return false; } + const bool filter = _deviceData.isInternalPidFilteringEnabled(); for (int i = 0; i < 7; ++i) { const int readSize = _exec.read(buffer.getWriteBufferPtr(), buffer.getAmountOfBytesToWrite()); if (readSize > 0) { buffer.addAmountOfBytesWritten(readSize); buffer.trySyncing(); - _deviceData.getFilter().filterData(_feID, buffer, _deviceData.isInternalPidFilteringEnabled()); - if (buffer.full() || finalCall) { - break; + _deviceData.getFilter().filterData(_feID, buffer, filter); + if (buffer.full()) { + return true; } } - std::this_thread::sleep_for(std::chrono::microseconds(5)); + std::this_thread::sleep_for(std::chrono::microseconds(2)); } - // Check again if buffer is full or final call before sending - return buffer.full() || (finalCall && buffer.isReadyToSend()); + // Check again if buffer is full + return buffer.full(); } bool TSReader::capableOf(const input::InputSystem system) const { @@ -168,8 +169,8 @@ bool TSReader::monitorSignal(bool UNUSED(showStatus)) { return true; } -bool TSReader::hasDeviceDataChanged() const { - return _deviceData.hasDeviceDataChanged(); +bool TSReader::hasDeviceFrequencyChanged() const { + return _deviceData.hasDeviceFrequencyChanged(); } void TSReader::parseStreamString(const TransportParamVector& params) { @@ -184,8 +185,8 @@ void TSReader::parseStreamString(const TransportParamVector& params) { bool TSReader::update() { SI_LOG_INFO("Frontend: @#1, Updating frontend...", _feID); - if (_deviceData.hasDeviceDataChanged()) { - _deviceData.resetDeviceDataChanged(); + if (_deviceData.hasDeviceFrequencyChanged()) { + _deviceData.resetDeviceFrequencyChanged(); closeActivePIDFilters(); _exec.close(); } diff --git a/src/input/childpipe/TSReader.h b/src/input/childpipe/TSReader.h index 6d7bba07..58753784 100644 --- a/src/input/childpipe/TSReader.h +++ b/src/input/childpipe/TSReader.h @@ -89,7 +89,7 @@ class TSReader : virtual bool isDataAvailable() final; - virtual bool readTSPackets(mpegts::PacketBuffer &buffer, bool finalCall) final; + virtual bool readTSPackets(mpegts::PacketBuffer& buffer) final; virtual bool capableOf(input::InputSystem msys) const final; @@ -97,7 +97,7 @@ class TSReader : virtual bool monitorSignal(bool showStatus) final; - virtual bool hasDeviceDataChanged() const final; + virtual bool hasDeviceFrequencyChanged() const final; virtual void parseStreamString(const TransportParamVector& params) final; diff --git a/src/input/childpipe/TSReaderData.cpp b/src/input/childpipe/TSReaderData.cpp index 533a4b15..27b0ee27 100644 --- a/src/input/childpipe/TSReaderData.cpp +++ b/src/input/childpipe/TSReaderData.cpp @@ -51,15 +51,17 @@ void TSReaderData::doInitialize() { } void TSReaderData::doParseStreamString(const FeID id, const TransportParamVector& params) { +/* const std::string genPSI = params.getParameter("genPSI"); if (genPSI == "yes") { initialize(); parseAndUpdatePidsTable(id, params); - _changed = true; + _frequencyChanged = true; _genPSI = true; _pcrTimer = 100; return; } +*/ const std::string filePath = params.getURIParameter("exec"); // Check did we receive an new path or just the same again if (filePath.empty() || (hasFilePath() && filePath == _filePath)) { @@ -67,7 +69,7 @@ void TSReaderData::doParseStreamString(const FeID id, const TransportParamVector return; } initialize(); - _changed = true; + _frequencyChanged = true; _filePath = StringConverter::getPercentDecoding(filePath); // when 'pcrtimer=' is not set or zero the PCR from the stream is used, else this timer // will be used as read interval. diff --git a/src/input/dvb/Frontend.cpp b/src/input/dvb/Frontend.cpp index a265733c..d156c78e 100644 --- a/src/input/dvb/Frontend.cpp +++ b/src/input/dvb/Frontend.cpp @@ -110,25 +110,25 @@ static void getAttachedFrontends( // unused var (void)path; - const std::string fe0 = StringConverter::stringFormat(FRONTEND.c_str(), 0, 0); - const std::string dvr0 = StringConverter::stringFormat(DVR.c_str(), 0, 0); - const std::string dmx0 = StringConverter::stringFormat(DMX.c_str(), 0, 0); + const std::string fe0 = StringConverter::stringFormat(FRONTEND.data(), 0, 0); + const std::string dvr0 = StringConverter::stringFormat(DVR.data(), 0, 0); + const std::string dmx0 = StringConverter::stringFormat(DMX.data(), 0, 0); input::dvb::SpFrontend frontend0 = std::make_shared(0, appDataPath, fe0, dvr0, dmx0); streamVector.push_back(Stream::makeSP(frontend0, decrypt)); - const std::string fe1 = StringConverter::stringFormat(FRONTEND.c_str(), 1, 0); - const std::string dvr1 = StringConverter::stringFormat(DVR.c_str(), 1, 0); - const std::string dmx1 = StringConverter::stringFormat(DMX.c_str(), 1, 0); + const std::string fe1 = StringConverter::stringFormat(FRONTEND.data(), 1, 0); + const std::string dvr1 = StringConverter::stringFormat(DVR.data(), 1, 0); + const std::string dmx1 = StringConverter::stringFormat(DMX.data(), 1, 0); input::dvb::SpFrontend frontend1 = std::make_shared(1, appDataPath, fe1, dvr1, dmx1); streamVector.push_back(Stream::makeSP(frontend1, decrypt)); #else dirent **file_list; - const int n = scandir(path.c_str(), &file_list, nullptr, versionsort); + const int n = scandir(path.data(), &file_list, nullptr, versionsort); if (n > 0) { for (int i = 0; i < n; ++i) { const std::string full_path = StringConverter::stringFormat("@#1/@#2", path, file_list[i]->d_name); struct stat stat_buf; - if (stat(full_path.c_str(), &stat_buf) == 0) { + if (stat(full_path.data(), &stat_buf) == 0) { switch (stat_buf.st_mode & S_IFMT) { case S_IFCHR: // character device if (strstr(file_list[i]->d_name, "frontend") != nullptr) { @@ -136,12 +136,12 @@ static void getAttachedFrontends( sscanf(file_list[i]->d_name, "frontend%d", &fe_nr); int adapt_nr; const std::string ADAPTER_TMP = startPath + "/adapter%d"; - sscanf(path.c_str(), ADAPTER_TMP.c_str(), &adapt_nr); + sscanf(path.data(), ADAPTER_TMP.data(), &adapt_nr); // Make new paths - const std::string fe = StringConverter::stringFormat(FRONTEND.c_str(), adapt_nr, fe_nr); - const std::string dvr = StringConverter::stringFormat(DVR.c_str(), adapt_nr, fe_nr); - const std::string dmx = StringConverter::stringFormat(DMX.c_str(), adapt_nr, fe_nr); + const std::string fe = StringConverter::stringFormat(FRONTEND.data(), adapt_nr, fe_nr); + const std::string dvr = StringConverter::stringFormat(DVR.data(), adapt_nr, fe_nr); + const std::string dmx = StringConverter::stringFormat(DMX.data(), adapt_nr, fe_nr); // Make new frontend here const StreamSpVector::size_type size = streamVector.size(); @@ -196,6 +196,10 @@ void Frontend::doAddToXML(std::string &xml) const { ADD_XML_NUMBER_INPUT(xml, "dvrbuffer", _dvrBufferSizeMB, 0, MAX_DVR_BUFFER_SIZE); ADD_XML_NUMBER_INPUT(xml, "waitOnLockTimeout", _waitOnLockTimeout, 0, MAX_WAIT_ON_LOCK_TIMEOUT); +#ifdef LIBDVBCSA + ADD_XML_NUMBER_INPUT(xml, "dvbcsa_bs_batch_size", _dvbapiData.getMaximumBatchSize(), 0, _dvbapiData.getMaximumBatchSize()); +#endif + // Channel _frontendData.addToXML(xml); @@ -262,7 +266,7 @@ bool Frontend::isDataAvailable() { return false; } -bool Frontend::readTSPackets(mpegts::PacketBuffer &buffer, const bool UNUSED(finalCall)) { +bool Frontend::readTSPackets(mpegts::PacketBuffer& buffer) { // try read maximum amount of bytes from DMX const auto readSize = ::read(_fd_dmx, buffer.getWriteBufferPtr(), buffer.getAmountOfBytesToWrite()); if (readSize > 0) { @@ -280,7 +284,7 @@ bool Frontend::readTSPackets(mpegts::PacketBuffer &buffer, const bool UNUSED(fin } bool Frontend::capableOf(const input::InputSystem system) const { - for (const input::dvb::delivery::UpSystem &deliverySystem : _deliverySystem) { + for (const input::dvb::delivery::UpSystem& deliverySystem : _deliverySystem) { if (deliverySystem->isCapableOf(system)) { return true; } @@ -402,8 +406,8 @@ bool Frontend::monitorSignal(const bool showStatus) { #endif } -bool Frontend::hasDeviceDataChanged() const { - return _frontendData.hasDeviceDataChanged(); +bool Frontend::hasDeviceFrequencyChanged() const { + return _frontendData.hasDeviceFrequencyChanged(); } void Frontend::parseStreamString(const TransportParamVector& params) { @@ -422,8 +426,8 @@ bool Frontend::update() { base::StopWatch sw; sw.start(); // Setup, tune and set PID Filters - if (_frontendData.hasDeviceDataChanged()) { - _frontendData.resetDeviceDataChanged(); + if (_frontendData.hasDeviceFrequencyChanged()) { + _frontendData.resetDeviceFrequencyChanged(); _tuned = false; // Close active PIDs closeActivePIDFilters(); @@ -448,7 +452,7 @@ bool Frontend::teardown() { closeActivePIDFilters(); _tuned = false; // Do teardown of frontends before closing FE - for (const input::dvb::delivery::UpSystem &deliverySystem : _deliverySystem) { + for (const input::dvb::delivery::UpSystem& deliverySystem : _deliverySystem) { deliverySystem->teardown(_fd_fe); } closeDMX(); @@ -729,7 +733,7 @@ void Frontend::setupFrontend() { } int Frontend::openFE(const std::string &path, const bool readonly) const { - const int fd = ::open(path.c_str(), (readonly ? O_RDONLY : O_RDWR) | O_NONBLOCK); + const int fd = ::open(path.data(), (readonly ? O_RDONLY : O_RDWR) | O_NONBLOCK); if (fd < 0) { SI_LOG_PERROR("Frontend: @#1, Failed to open @#2", _feID, path); } @@ -744,7 +748,7 @@ void Frontend::closeFE() { } int Frontend::openDMX(const std::string &path) const { - const int fd = ::open(path.c_str(), O_RDWR | O_NONBLOCK); + const int fd = ::open(path.data(), O_RDWR | O_NONBLOCK); if (fd < 0) { SI_LOG_PERROR("Frontend: @#1, Failed to open @#2", _feID, path); } @@ -760,7 +764,7 @@ void Frontend::closeDMX() { bool Frontend::tune() { const input::InputSystem delsys = _frontendData.getDeliverySystem(); - for (input::dvb::delivery::UpSystem &system : _deliverySystem) { + for (input::dvb::delivery::UpSystem& system : _deliverySystem) { if (system->isCapableOf(delsys)) { return system->tune(_fd_fe, _frontendData); } diff --git a/src/input/dvb/Frontend.h b/src/input/dvb/Frontend.h index b70885f5..b2081cc8 100644 --- a/src/input/dvb/Frontend.h +++ b/src/input/dvb/Frontend.h @@ -106,16 +106,16 @@ class Frontend : virtual const dvbcsa_bs_key_s *getKey(int parity) const final; - virtual void setKey(const unsigned char *cw, int parity, int index) final; + virtual void setKey(const unsigned char* cw, int parity, int index) final; virtual void setICAM(const unsigned char ecm, int parity) final; virtual void startOSCamFilterData(int pid, int demux, int filter, - const unsigned char *filterData, const unsigned char *filterMask) final; + const unsigned char* filterData, const unsigned char* filterMask) final; virtual void stopOSCamFilterData(int pid, int demux, int filter) final; - virtual bool findOSCamFilterData(int pid, const unsigned char *tsPacket, int tableID, + virtual bool findOSCamFilterData(int pid, const unsigned char* tsPacket, int tableID, int &filter, int &demux, mpegts::TSData &filterData) final; virtual std::vector getActiveOSCamDemuxFilters() const final; @@ -155,7 +155,7 @@ class Frontend : virtual bool isDataAvailable() final; - virtual bool readTSPackets(mpegts::PacketBuffer &buffer, bool finalCall) final; + virtual bool readTSPackets(mpegts::PacketBuffer& buffer) final; virtual bool capableOf(InputSystem system) const final; @@ -163,7 +163,7 @@ class Frontend : virtual bool monitorSignal(bool showStatus) final; - virtual bool hasDeviceDataChanged() const final; + virtual bool hasDeviceFrequencyChanged() const final; virtual void parseStreamString(const TransportParamVector& params) final; diff --git a/src/input/dvb/FrontendData.cpp b/src/input/dvb/FrontendData.cpp index 0971da1d..f3b14bd8 100644 --- a/src/input/dvb/FrontendData.cpp +++ b/src/input/dvb/FrontendData.cpp @@ -121,7 +121,7 @@ void FrontendData::doParseStreamString(const FeID id, const TransportParamVector SI_LOG_INFO("Frontend: @#1, New frequency requested (@#2 -> @#3), clearing old channel data...", id, oldFreq, reqFreq); initialize(); _freq = reqFreq * 1000.0; - _changed = true; + _frequencyChanged = true; } else if (method == "SETUP" || method == "PLAY") { const std::string list = params.getParameter("pids"); if (list.empty()) { @@ -143,21 +143,21 @@ void FrontendData::doParseStreamString(const FeID id, const TransportParamVector if (isId != -1) { if (_isId != isId) { _isId = isId; - _changed = true; + _frequencyChanged = true; } } const int plsCode = params.getIntParameter("plsc"); if (plsCode != -1) { if (_plsCode != plsCode) { _plsCode = plsCode & 0x3FFFF; - _changed = true; + _frequencyChanged = true; } } const int plpId = params.getIntParameter("plp"); if (plpId != -1) { if (_plpId != plpId) { _plpId = plpId; - _changed = true; + _frequencyChanged = true; } } const int plsMode = params.getIntParameter("plsm"); diff --git a/src/input/dvb/FrontendDecryptInterface.h b/src/input/dvb/FrontendDecryptInterface.h index 8a5bc8c6..0fb844d1 100644 --- a/src/input/dvb/FrontendDecryptInterface.h +++ b/src/input/dvb/FrontendDecryptInterface.h @@ -70,20 +70,20 @@ class FrontendDecryptInterface { virtual const dvbcsa_bs_key_s *getKey(int parity) const = 0; /// - virtual void setKey(const unsigned char *cw, int parity, int index) = 0; + virtual void setKey(const unsigned char* cw, int parity, int index) = 0; /// virtual void setICAM(unsigned char ecm, int parity) = 0; /// virtual void startOSCamFilterData(int pid, int demux, int filter, - const unsigned char *filterData, const unsigned char *filterMask) = 0; + const unsigned char* filterData, const unsigned char* filterMask) = 0; /// virtual void stopOSCamFilterData(int pid, int demux, int filter) = 0; /// - virtual bool findOSCamFilterData(int pid, const unsigned char *tsPacket, int tableID, + virtual bool findOSCamFilterData(int pid, const unsigned char* tsPacket, int tableID, int &filter, int &demux, mpegts::TSData &filterData) = 0; /// Get the vector of current 'active' OSCam demux filters diff --git a/src/input/dvb/Frontend_DecryptInterface.cpp b/src/input/dvb/Frontend_DecryptInterface.cpp index c1757f1a..a212954b 100644 --- a/src/input/dvb/Frontend_DecryptInterface.cpp +++ b/src/input/dvb/Frontend_DecryptInterface.cpp @@ -51,7 +51,7 @@ const dvbcsa_bs_key_s *Frontend::getKey(int parity) const { return _dvbapiData.getKey(parity); } -void Frontend::setKey(const unsigned char *cw, int parity, int index) { +void Frontend::setKey(const unsigned char* cw, int parity, int index) { _dvbapiData.setKey(cw, parity, index); } @@ -60,7 +60,7 @@ void Frontend::setICAM(const unsigned char ecm, const int parity) { } void Frontend::startOSCamFilterData(const int pid, const int demux, const int filter, - const unsigned char *filterData, const unsigned char *filterMask) { + const unsigned char* filterData, const unsigned char* filterMask) { SI_LOG_INFO("Frontend: @#1, Start filter PID: @#2 demux: @#3 filter: @#4 (data @#5 @#6 @#7 mask @#8 @#9 @#10 @#11)", _feID, PID(pid), demux, filter, HEX2(filterData[0]), HEX2(filterData[1]), HEX2(filterData[2]), @@ -78,7 +78,7 @@ void Frontend::stopOSCamFilterData(const int pid, const int demux, const int fil // Do not update frontend or remove the PID! } -bool Frontend::findOSCamFilterData(const int pid, const unsigned char *tsPacket, +bool Frontend::findOSCamFilterData(const int pid, const unsigned char* tsPacket, const int tableID, int &filter, int &demux, mpegts::TSData &filterData) { return _dvbapiData.findOSCamFilterData(_feID, pid, tsPacket, tableID, filter, demux, filterData); } diff --git a/src/input/dvb/delivery/DVBS.cpp b/src/input/dvb/delivery/DVBS.cpp index bda7aa1c..c96a3fa1 100644 --- a/src/input/dvb/delivery/DVBS.cpp +++ b/src/input/dvb/delivery/DVBS.cpp @@ -97,7 +97,7 @@ namespace input::dvb::delivery { ADD_XML_ELEMENT(xml, "inputtype", "selectionlist"); ADD_XML_ELEMENT(xml, "value", _fbcConnect - (_fbcSetID * 8)); ADD_XML_BEGIN_ELEMENT(xml, "list"); - for (const auto &choice : _choices) { + for (const auto& choice : _choices) { ADD_XML_ELEMENT(xml, StringConverter::stringFormat("option@#1", choice.first), choice.second); } ADD_XML_END_ELEMENT(xml, "list"); @@ -190,12 +190,12 @@ namespace input::dvb::delivery { if (_fbcTuner && _fbcLinked && _sendDiSEqcViaRootTuner) { // Replace Frontend number with Root Frontend Number fePathDiseqc.replace(fePathDiseqc.end()-1, fePathDiseqc.end(), std::to_string(_fbcConnect)); - feFDDiseqc = ::open(fePathDiseqc.c_str(), O_RDWR | O_NONBLOCK); + feFDDiseqc = ::open(fePathDiseqc.data(), O_RDWR | O_NONBLOCK); if (feFDDiseqc < 0) { // Probably already open, try to find it and duplicate fd dirent **fileList; const std::string procSelfFD("/proc/self/fd"); - const int n = scandir(procSelfFD.c_str(), &fileList, nullptr, versionsort); + const int n = scandir(procSelfFD.data(), &fileList, nullptr, versionsort); if (n > 0) { for (int i = 0; i < n; ++i) { // Check do we have a digit @@ -206,7 +206,7 @@ namespace input::dvb::delivery { const int fd = std::atoi(fileList[i]->d_name); const std::string procSelfFDNr = procSelfFD + "/" + std::to_string(fd); char buf[255]; - const auto s = readlink(procSelfFDNr.c_str(), buf, sizeof(buf)); + const auto s = readlink(procSelfFDNr.data(), buf, sizeof(buf)); if (s > 0) { buf[s] = 0; if (fePathDiseqc == buf) { diff --git a/src/input/file/TSReader.cpp b/src/input/file/TSReader.cpp index 7a9341f2..0bdcd669 100644 --- a/src/input/file/TSReader.cpp +++ b/src/input/file/TSReader.cpp @@ -111,7 +111,7 @@ bool TSReader::isDataAvailable() { return true; } -bool TSReader::readTSPackets(mpegts::PacketBuffer &buffer, const bool finalCall) { +bool TSReader::readTSPackets(mpegts::PacketBuffer& buffer) { if (!_file.is_open()) { return false; } @@ -123,8 +123,8 @@ bool TSReader::readTSPackets(mpegts::PacketBuffer &buffer, const bool finalCall) // Add data to Filter _deviceData.getFilter().filterData(_feID, buffer, false); } - // Check again if buffer is full or final call before sending - return buffer.full() || (finalCall && buffer.isReadyToSend()); + // Check again if buffer is full + return buffer.full(); } bool TSReader::capableOf(const input::InputSystem system) const { @@ -144,8 +144,8 @@ bool TSReader::monitorSignal(bool UNUSED(showStatus)) { return true; } -bool TSReader::hasDeviceDataChanged() const { - return _deviceData.hasDeviceDataChanged(); +bool TSReader::hasDeviceFrequencyChanged() const { + return _deviceData.hasDeviceFrequencyChanged(); } void TSReader::parseStreamString(const TransportParamVector& params) { @@ -160,8 +160,8 @@ void TSReader::parseStreamString(const TransportParamVector& params) { bool TSReader::update() { SI_LOG_INFO("Frontend: @#1, Updating frontend...", _feID); - if (_deviceData.hasDeviceDataChanged()) { - _deviceData.resetDeviceDataChanged(); + if (_deviceData.hasDeviceFrequencyChanged()) { + _deviceData.resetDeviceFrequencyChanged(); _file.close(); if (!_file.is_open()) { const std::string filePath = _deviceData.getFilePath(); diff --git a/src/input/file/TSReader.h b/src/input/file/TSReader.h index 8b7796e1..3aa72d13 100644 --- a/src/input/file/TSReader.h +++ b/src/input/file/TSReader.h @@ -89,7 +89,7 @@ class TSReader : virtual bool isDataAvailable() final; - virtual bool readTSPackets(mpegts::PacketBuffer &buffer, bool finalCall) final; + virtual bool readTSPackets(mpegts::PacketBuffer& buffer) final; virtual bool capableOf(input::InputSystem msys) const final; @@ -97,7 +97,7 @@ class TSReader : virtual bool monitorSignal(bool showStatus) final; - virtual bool hasDeviceDataChanged() const final; + virtual bool hasDeviceFrequencyChanged() const final; virtual void parseStreamString(const TransportParamVector& params) final; diff --git a/src/input/file/TSReaderData.cpp b/src/input/file/TSReaderData.cpp index eff6ad26..0671c141 100644 --- a/src/input/file/TSReaderData.cpp +++ b/src/input/file/TSReaderData.cpp @@ -56,7 +56,7 @@ void TSReaderData::doParseStreamString(const FeID UNUSED(id), const TransportPar return; } initialize(); - _changed = true; + _frequencyChanged = true; _filePath = filePath; } diff --git a/src/input/stream/Streamer.cpp b/src/input/stream/Streamer.cpp index fb38cc8a..aaabb723 100644 --- a/src/input/stream/Streamer.cpp +++ b/src/input/stream/Streamer.cpp @@ -103,7 +103,7 @@ bool Streamer::isDataAvailable() { return false; } -bool Streamer::readTSPackets(mpegts::PacketBuffer &buffer, const bool finalCall) { +bool Streamer::readTSPackets(mpegts::PacketBuffer& buffer) { if (_udpMultiListen.getFD() == -1) { return false; } @@ -117,8 +117,8 @@ bool Streamer::readTSPackets(mpegts::PacketBuffer &buffer, const bool finalCall) // Add data to Filter _deviceData.getFilter().filterData(_feID, buffer, _deviceData.isInternalPidFilteringEnabled()); } - // Check again if buffer is full or final call before sending - return buffer.full() || (finalCall && buffer.isReadyToSend()); + // Check again if buffer is full + return buffer.full(); } bool Streamer::capableOf(const input::InputSystem system) const { @@ -135,8 +135,8 @@ bool Streamer::monitorSignal(const bool UNUSED(showStatus)) { return true; } -bool Streamer::hasDeviceDataChanged() const { - return _deviceData.hasDeviceDataChanged(); +bool Streamer::hasDeviceFrequencyChanged() const { + return _deviceData.hasDeviceFrequencyChanged(); } // Server side @@ -156,8 +156,8 @@ void Streamer::parseStreamString(const TransportParamVector& params) { bool Streamer::update() { SI_LOG_INFO("Frontend: @#1, Updating frontend...", _feID); - if (_deviceData.hasDeviceDataChanged()) { - _deviceData.resetDeviceDataChanged(); + if (_deviceData.hasDeviceFrequencyChanged()) { + _deviceData.resetDeviceFrequencyChanged(); closeActivePIDFilters(); _udpMultiListen.closeFD(); } diff --git a/src/input/stream/Streamer.h b/src/input/stream/Streamer.h index 254ccf6e..b6eb2f82 100644 --- a/src/input/stream/Streamer.h +++ b/src/input/stream/Streamer.h @@ -90,7 +90,7 @@ class Streamer : virtual bool isDataAvailable() final; - virtual bool readTSPackets(mpegts::PacketBuffer &buffer, bool finalCall) final; + virtual bool readTSPackets(mpegts::PacketBuffer& buffer) final; virtual bool capableOf(input::InputSystem msys) const final; @@ -98,7 +98,7 @@ class Streamer : virtual bool monitorSignal(bool showStatus) final; - virtual bool hasDeviceDataChanged() const final; + virtual bool hasDeviceFrequencyChanged() const final; virtual void parseStreamString(const TransportParamVector& params) final; diff --git a/src/input/stream/StreamerData.cpp b/src/input/stream/StreamerData.cpp index 82b8a1d4..21c62e4e 100644 --- a/src/input/stream/StreamerData.cpp +++ b/src/input/stream/StreamerData.cpp @@ -60,7 +60,7 @@ void StreamerData::doParseStreamString(const FeID id, const TransportParamVector return; } initialize(); - _changed = true; + _frequencyChanged = true; _uri = uri; // Parse uri ex. udp@224.0.1.3:1234 diff --git a/src/main.cpp b/src/main.cpp index 942552cb..a91e4a8f 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -72,7 +72,7 @@ static void child_handler(int signum) { exitApp = true; break; case SIGSEGV: - Utils::createBackTrace(appName.c_str()); + Utils::createBackTrace(appName.data()); exit(1); break; default: @@ -95,9 +95,9 @@ static void daemonize(const std::string &lockfile, const char *user) { // create the lock file as the current user // give group 'rw' permission and other users 'r' permissions if (!lockfile.empty()) { - lfp = open(lockfile.c_str(), O_RDWR | O_CREAT, 0664); + lfp = open(lockfile.data(), O_RDWR | O_CREAT, 0664); if (lfp < 0) { - printf("unable to create lock file %s, %s (code=%d)\r\n", lockfile.c_str(), strerror(errno), errno); + printf("unable to create lock file %s, %s (code=%d)\r\n", lockfile.data(), strerror(errno), errno); exit(EXIT_FAILURE); } } @@ -151,7 +151,7 @@ static void daemonize(const std::string &lockfile, const char *user) { // at this point we are executing as the child process struct passwd *pw = getpwuid(geteuid()); - printf("running as user: %s with pid %d (%s)\r\n", pw->pw_name, getpid(), lockfile.c_str()); + printf("running as user: %s with pid %d (%s)\r\n", pw->pw_name, getpid(), lockfile.data()); // now record our pid to lockfile sprintf(str, "%d\n", getpid()); @@ -305,7 +305,7 @@ int main(int argc, char *argv[]) { } else if (strcmp(argv[i], "--backtrace") == 0) { if (i + 1 < argc) { ++i; - Utils::annotateBackTrace(appName.c_str(), argv[i]); + Utils::annotateBackTrace(appName.data(), argv[i]); return EXIT_SUCCESS; } printUsage(argv[0]); diff --git a/src/mpegts/Filter.cpp b/src/mpegts/Filter.cpp index 570de850..10467ba0 100644 --- a/src/mpegts/Filter.cpp +++ b/src/mpegts/Filter.cpp @@ -60,7 +60,7 @@ void Filter::doAddToXML(std::string &xml) const { ADD_XML_ELEMENT(xml, "pat", getPATData()->toXML()); ADD_XML_BEGIN_ELEMENT(xml, "pmtlist"); - for (const auto &[pid, pmt] : _pmtMap) { + for (const auto& [pid, pmt] : _pmtMap) { ADD_XML_ELEMENT(xml, "pmt", pmt->toXML()); } ADD_XML_END_ELEMENT(xml, "pmtlist"); @@ -112,7 +112,7 @@ void Filter::parsePIDString(const FeID id, const std::string &reqPids, const boo } } else { const StringVector reqPidList = StringConverter::split(reqPids, ","); - for (const std::string &pid : reqPidList) { + for (const std::string& pid : reqPidList) { try { if (const auto p = std::stoi(pid); p > 18 || add) { _pidTable.setPID(p, add); @@ -123,7 +123,7 @@ void Filter::parsePIDString(const FeID id, const std::string &reqPids, const boo } if (add) { const StringVector userPidList = StringConverter::split(_userPids, ","); - for (const std::string &pid : userPidList) { + for (const std::string& pid : userPidList) { try { _pidTable.setPID(std::stoi(pid), add); } catch (const std::invalid_argument &) { @@ -136,22 +136,14 @@ void Filter::parsePIDString(const FeID id, const std::string &reqPids, const boo void Filter::filterData(const FeID id, mpegts::PacketBuffer &buffer, const bool filter) { // base::MutexLock lock(_mutex); - const std::size_t size = buffer.getNumberOfCompletedPackets(); const std::size_t begin = buffer.getBeginOfUnFilteredPackets(); + const std::size_t size = buffer.getNumberOfCompletedPackets(); for (std::size_t i = begin; i < size; ++i) { - const unsigned char *ptr = buffer.getTSPacketPtr(i); - // Check is this the beginning of the TS and no Transport error indicator and not a NULL packet - if (ptr[0] != 0x47 || (ptr[1] & 0x80) == 0x80 || (ptr[1] == 0x1F && ptr[2] == 0xFF)) { - if (filter && !_pidTable.isAllPID()) { - buffer.markTSForPurging(i); - } - continue; - } - // get PID and CC from TS + const unsigned char* ptr = buffer.getTSPacketPtr(i); const uint16_t pid = ((ptr[1] & 0x1f) << 8) | ptr[2]; - // If pid was not opened, skip this one (and perhaps purge it) - if (!_pidTable.isPIDOpened(pid)) { + // Check is this the beginning of the TS and no Transport error indicator and not a NULL packet + if (ptr[0] != 0x47 || (ptr[1] & 0x80) == 0x80 || pid == 0x1FFF || !_pidTable.isPIDOpened(pid)) { if (filter && !_pidTable.isAllPID()) { buffer.markTSForPurging(i); } @@ -246,7 +238,7 @@ void Filter::filterData(const FeID id, mpegts::PacketBuffer &buffer, const bool #endif } } else if (_filterPCR && PCR::isPCRTableData(ptr)) { - for (const auto &[_, pmt] : _pmtMap) { + for (const auto& [_, pmt] : _pmtMap) { const int pcrPID = pmt->getPCRPid(); if (pid == pcrPID && _pidTable.isPIDOpened(pcrPID) && _pidTable.getPacketCounter(pcrPID) > 0) { _pcr->collectData(id, ptr); @@ -276,7 +268,7 @@ mpegts::SpPMT Filter::getPMTData(const int pid) const { base::MutexLock lock(_mutex); if (pid == 0) { // Try to find current PMT based on open PCR - for (const auto &[_, pmt] : _pmtMap) { + for (const auto& [_, pmt] : _pmtMap) { const int pcrPID = pmt->getPCRPid(); if (_pidTable.isPIDOpened(pcrPID) && _pidTable.getPacketCounter(pcrPID) > 0) { return pmt; diff --git a/src/mpegts/Filter.h b/src/mpegts/Filter.h index 7832a934..76a11d9b 100644 --- a/src/mpegts/Filter.h +++ b/src/mpegts/Filter.h @@ -208,7 +208,7 @@ class Filter : _pmtMap.erase(pid); } else { // Did we close the PCR Pid - for (const auto &[_, pmt] : _pmtMap) { + for (const auto& [_, pmt] : _pmtMap) { const int pcrPID = pmt->getPCRPid(); if (pcrPID > 0 && pcrPID == pid) { const int pmtPID = pmt->getAssociatedPID(); diff --git a/src/mpegts/NIT.cpp b/src/mpegts/NIT.cpp index 9f1318b4..48631855 100644 --- a/src/mpegts/NIT.cpp +++ b/src/mpegts/NIT.cpp @@ -160,7 +160,7 @@ void NIT::clear() { void NIT::doAddToXML(std::string &xml) const { ADD_XML_ELEMENT(xml, "networkID", DIGIT(_nid, 4)); ADD_XML_ELEMENT(xml, "networkName", _networkName); - for (const auto &entry : _table) { + for (const auto& entry : _table) { std::string name = "transportStreamID_" + DIGIT(entry.transportStreamID, 0); ADD_XML_BEGIN_ELEMENT(xml, name); ADD_XML_ELEMENT(xml, "msys", entry.msys); @@ -183,7 +183,7 @@ void NIT::parse(const FeID id) { for (std::size_t secNr = 0; secNr < _numberOfSections; ++secNr) { TableData::Data tableData; if (getDataForSectionNumber(secNr, tableData)) { - const unsigned char *data = tableData.data.c_str(); + const unsigned char* data = tableData.data.data(); size_t index = 8; _nid = getWord(index, data); @@ -294,7 +294,7 @@ mpegts::TSData NIT::generateFrom( mpegts::TSData data; int prognr = 0; - for (auto [freq, element] : info) { + for (const auto& [freq, element] : info) { SI_LOG_DEBUG("Frontend: @#1, Generating NIT: Prog NR: @#2 - @#3 PMT PID: @#4", id, HEX(prognr, 4), DIGIT(prognr, 5), element.freq); } diff --git a/src/mpegts/PAT.cpp b/src/mpegts/PAT.cpp index 112be760..ffe9442a 100644 --- a/src/mpegts/PAT.cpp +++ b/src/mpegts/PAT.cpp @@ -40,7 +40,7 @@ void PAT::clear() { // ============================================================================= void PAT::doAddToXML(std::string &xml) const { - for (const auto &[pid, _] : _pmtPidTable) { + for (const auto& [pid, _] : _pmtPidTable) { ADD_XML_ELEMENT(xml, "pmt", pid); } } @@ -54,7 +54,7 @@ void PAT::doFromXML(const std::string &UNUSED(xml)) {} void PAT::parse(const FeID id) { Data tableData; if (getDataForSectionNumber(0, tableData)) { - const unsigned char *data = tableData.data.c_str(); + const unsigned char* data = tableData.data.data(); _tid = (data[8u] << 8) | data[9u]; // SI_LOG_BIN_DEBUG(data, tableData.data.size(), "Frontend: @#1, PAT data", id); @@ -66,7 +66,7 @@ void PAT::parse(const FeID id) { const size_t len = tableData.sectionLength - 4u - 5u; // skip to Table begin and iterate over entries - const unsigned char *ptr = &data[13u]; + const unsigned char* ptr = &data[13u]; for (size_t i = 0u; i < len; i += 4u) { // Get PAT entry const int prognr = (ptr[i + 0u] << 8) | ptr[i + 1u]; @@ -84,7 +84,7 @@ void PAT::parse(const FeID id) { } mpegts::TSData PAT::generateFrom( - FeID UNUSED(id), const base::M3UParser::TransformationMap &info) { + FeID UNUSED(id), const base::M3UParser::TransformationMap& UNUSED(info)) { static int cc = 0; int version = 5; @@ -122,10 +122,10 @@ mpegts::TSData PAT::generateFrom( tmp[index + 3] = 0x10; // index += 4; +/* int prognr = 0x4000; int pmtPid = 0x0100; - - for (auto [freq, element] : info) { + for (const auto& [freq, element] : info) { // SI_LOG_DEBUG("Frontend: @#1, Generating PAT: TID: @#2 Prog NR: @#3 - @#4 PMT PID: @#5 CC: @#6", // id, transportStreamID, HEX(prognr, 4), DIGIT(prognr, 5), element.freq, cc); tmp[index + 0] = (prognr & 0xFF00) >> 8; @@ -138,6 +138,7 @@ mpegts::TSData PAT::generateFrom( ++prognr; pmtPid += 0x10; } +*/ // Adjust lenght int len = index - 8 + 4; tmp[6] = (len & 0xFF00) >> 8; diff --git a/src/mpegts/PCR.cpp b/src/mpegts/PCR.cpp index 193e2915..6228e987 100644 --- a/src/mpegts/PCR.cpp +++ b/src/mpegts/PCR.cpp @@ -36,7 +36,7 @@ PCR::PCR() : // -- Other member functions -------------------------------------------------- // ============================================================================= -void PCR::collectData(const FeID UNUSED(id), const unsigned char *data) { +void PCR::collectData(const FeID UNUSED(id), const unsigned char* data) { if (isPCRTableData(data)) { // 4 3 2 1 0 // 76543210 98765432 10987654 32109876 54321098 76543210 diff --git a/src/mpegts/PCR.h b/src/mpegts/PCR.h index a7a24d14..95dbeea3 100644 --- a/src/mpegts/PCR.h +++ b/src/mpegts/PCR.h @@ -46,7 +46,7 @@ class PCR { /// This will check for 'adaptation field flag' and 'PCR field present' to /// indicate this is an PCR table - static bool isPCRTableData(const unsigned char *data) { + static bool isPCRTableData(const unsigned char* data) { return ((data[3] & 0x20) == 0x20 && (data[5] & 0x10) == 0x10); } @@ -56,7 +56,7 @@ class PCR { public: /// Collect Table data for tableID - void collectData(FeID id, const unsigned char *data); + void collectData(FeID id, const unsigned char* data); std::int64_t getPCRDelta() const; diff --git a/src/mpegts/PMT.cpp b/src/mpegts/PMT.cpp index 88addb99..d89ae6c3 100644 --- a/src/mpegts/PMT.cpp +++ b/src/mpegts/PMT.cpp @@ -45,13 +45,13 @@ void PMT::clear() { void PMT::doAddToXML(std::string &xml) const { ADD_XML_ELEMENT(xml, "pid", _pmtData.pid); ADD_XML_ELEMENT(xml, "serviceID", DIGIT(_programNumber, 6)); - for (const auto &data : _pmtData.esPID) { + for (const auto& data : _pmtData.esPID) { ADD_XML_BEGIN_ELEMENT(xml, "elementary"); ADD_XML_ELEMENT(xml, "pid", data.pid); ADD_XML_ELEMENT(xml, "streamtype", data.streamType); ADD_XML_END_ELEMENT(xml, "elementary"); } - for (const auto &data : _pmtData.ecmPID) { + for (const auto& data : _pmtData.ecmPID) { std::string name = "caid_" + HEX(data.caid, 4); ADD_XML_BEGIN_ELEMENT(xml, name); ADD_XML_ELEMENT(xml, "ecmPID", data.ecmpid); @@ -88,7 +88,7 @@ void PMT::cleanPI(unsigned char *data) { const std::size_t len = sectionLength - 4 - 9 - prgLength; // skip to ES Table begin and iterate over entries - const unsigned char *ptr = &data[17 + prgLength]; + const unsigned char* ptr = &data[17 + prgLength]; for (std::size_t i = 0; i < len; ) { // const int streamType = ptr[i + 0]; // const int elementaryPID = ((ptr[i + 1] & 0x1F) << 8) | ptr[i + 2]; @@ -106,7 +106,7 @@ void PMT::cleanPI(unsigned char *data) { pmt[7] = (newSectionLength & 0xFF); // append calculated CRC - const uint32_t crc = mpegts::TableData::calculateCRC32(pmt.c_str() + 5, pmt.size() - 5); + const uint32_t crc = mpegts::TableData::calculateCRC32(pmt.data() + 5, pmt.size() - 5); pmt += ((crc >> 24) & 0xFF); pmt += ((crc >> 16) & 0xFF); pmt += ((crc >> 8) & 0xFF); @@ -117,7 +117,7 @@ void PMT::cleanPI(unsigned char *data) { pmt += 0xFF; } // copy new PMT to buffer - memcpy(data, pmt.c_str(), 188); + memcpy(data, pmt.data(), 188); static bool once = true; if (once) { @@ -139,7 +139,7 @@ void PMT::cleanPI(unsigned char *data) { int PMT::parsePCRPid() { Data tableData; if (getDataForSectionNumber(0, tableData)) { - const unsigned char *const data = tableData.data.c_str(); + const unsigned char* const data = tableData.data.data(); _pcrPID = ((data[13u] & 0x1F) << 8) | data[14u]; } return _pcrPID; @@ -148,7 +148,7 @@ int PMT::parsePCRPid() { void PMT::parse(const FeID id) { Data tableData; if (getDataForSectionNumber(0, tableData)) { - const unsigned char* const data = tableData.data.c_str(); + const unsigned char* const data = tableData.data.data(); _programNumber = ((data[ 8u] ) << 8) | data[ 9u]; _pcrPID = ((data[13u] & 0x1F) << 8) | data[14u]; _prgLength = ((data[15u] & 0x0F) << 8) | data[16u]; @@ -181,7 +181,7 @@ void PMT::parse(const FeID id) { const std::size_t len = tableData.sectionLength - 4u - 9u - _prgLength; // Skip to ES Table begin and iterate over entries - const unsigned char *const ptr = &data[17u + _prgLength]; + const unsigned char* const ptr = &data[17u + _prgLength]; for (std::size_t i = 0u; i < len; ) { const int streamType = ptr[i + 0u]; const int elementaryPID = ((ptr[i + 1u] & 0x1F) << 8u) | ptr[i + 2u]; diff --git a/src/mpegts/PacketBuffer.cpp b/src/mpegts/PacketBuffer.cpp index d383ab2f..e2d809d9 100644 --- a/src/mpegts/PacketBuffer.cpp +++ b/src/mpegts/PacketBuffer.cpp @@ -48,8 +48,6 @@ void PacketBuffer::initialize(const uint32_t ssrc, const long timestamp) { _buffer[9] = (ssrc >> 16) & 0xff; // synchronization source _buffer[10] = (ssrc >> 8) & 0xff; // synchronization source _buffer[11] = (ssrc >> 0) & 0xff; // synchronization source - - _initialized = true; } bool PacketBuffer::trySyncing() { @@ -61,7 +59,7 @@ bool PacketBuffer::trySyncing() { return true; } for (size_t i = RTP_HEADER_LEN; i < MTU_MAX_TS_PACKET_SIZE + RTP_HEADER_LEN - (TS_PACKET_SIZE * 2); ++i) { - const unsigned char *cData = _buffer + i; + const unsigned char* cData = _buffer + i; if (cData[TS_PACKET_SIZE * 0] == 0x47 && cData[TS_PACKET_SIZE * 1] == 0x47 && cData[TS_PACKET_SIZE * 2] == 0x47) { @@ -91,18 +89,23 @@ void PacketBuffer::purge() { if (_purgePending == 0) { return; } + if (_purgePending == NUMBER_OF_TS_PACKETS) { + reset(); + return; + } _purgePending = 0; const std::size_t bufSize = getCurrentBufferSize(); if (bufSize == 0) { return; } - // i: represents the packet number, and not the packet position! + const int begin = (bufSize / TS_PACKET_SIZE) - 1; + const int end = (_processedIndex > RTP_HEADER_LEN) ? (_processedIndex / TS_PACKET_SIZE) : 0; std::size_t skipData = 0; - for (std::size_t i = (bufSize / TS_PACKET_SIZE); i > 0 ; --i) { - unsigned char *cData = getTSPacketPtr(i - 1); + for (int i = begin; i >= end; --i) { + unsigned char *cData = getTSPacketPtr(i); if (cData[1] == 0xFF) { // Next packet needs to be purged as well, then continue to next - if (i > 1 && (cData - TS_PACKET_SIZE)[1] == 0xFF) { + if (i > 0 && (cData - TS_PACKET_SIZE)[1] == 0xFF) { skipData += TS_PACKET_SIZE; continue; } @@ -114,21 +117,29 @@ void PacketBuffer::purge() { std::memcpy(cData, nextData, endData - nextData); } _writeIndex -= skipData; + _processedIndex = _writeIndex; skipData = 0; } } } -void PacketBuffer::tagRTPHeaderWith(const uint16_t cseq, const long timestamp) { +void PacketBuffer::tagRTPHeaderWith( + const uint32_t ssrc, const uint16_t cseq, const long timestamp) { // update sequence number - _buffer[2] = ((cseq >> 8) & 0xFF); // sequence number - _buffer[3] = (cseq & 0xFF); // sequence number + _buffer[2] = ((cseq >> 8) & 0xFF); + _buffer[3] = (cseq & 0xFF); // update timestamp - _buffer[4] = (timestamp >> 24) & 0xFF; // timestamp - _buffer[5] = (timestamp >> 16) & 0xFF; // timestamp - _buffer[6] = (timestamp >> 8) & 0xFF; // timestamp - _buffer[7] = (timestamp >> 0) & 0xFF; // timestamp + _buffer[4] = (timestamp >> 24) & 0xFF; + _buffer[5] = (timestamp >> 16) & 0xFF; + _buffer[6] = (timestamp >> 8) & 0xFF; + _buffer[7] = (timestamp >> 0) & 0xFF; + + // Update synchronization source + _buffer[8] = (ssrc >> 24) & 0xFF; + _buffer[9] = (ssrc >> 16) & 0xFF; + _buffer[10] = (ssrc >> 8) & 0xFF; + _buffer[11] = (ssrc >> 0) & 0xFF; } } diff --git a/src/mpegts/PacketBuffer.h b/src/mpegts/PacketBuffer.h index c42126e4..3fede5cd 100644 --- a/src/mpegts/PacketBuffer.h +++ b/src/mpegts/PacketBuffer.h @@ -76,7 +76,7 @@ class PacketBuffer { void purge(); /// This will tag the RTP header with sequence number and timestamp - void tagRTPHeaderWith(uint16_t cseq, long timestamp); + void tagRTPHeaderWith(uint32_t ssrc, uint16_t cseq, long timestamp); /// This function will return the maximum number of TS Packets that will fit /// in this TS buffer @@ -144,7 +144,7 @@ class PacketBuffer { const std::size_t index = (packetNumber * TS_PACKET_SIZE) + RTP_HEADER_LEN; return &_buffer[index]; } - const unsigned char *getTSPacketPtr(std::size_t packetNumber) const { + const unsigned char* getTSPacketPtr(std::size_t packetNumber) const { const std::size_t index = (packetNumber * TS_PACKET_SIZE) + RTP_HEADER_LEN; return &_buffer[index]; } @@ -167,7 +167,7 @@ class PacketBuffer { if (_decryptPending && ready) { const std::size_t size = getNumberOfCompletedPackets(); for (std::size_t i = 0; i < size; ++i) { - const unsigned char *ts = getTSPacketPtr(i); + const unsigned char* ts = getTSPacketPtr(i); ready &= ((ts[3] & 0x80) != 0x80); } } @@ -200,7 +200,6 @@ class PacketBuffer { unsigned char _buffer[MTU]; std::size_t _writeIndex = RTP_HEADER_LEN; mutable std::size_t _processedIndex = RTP_HEADER_LEN; - bool _initialized = false; bool _decryptPending = false; std::size_t _purgePending = 0; diff --git a/src/mpegts/PidTable.cpp b/src/mpegts/PidTable.cpp index 3f12ba31..a13e74c2 100644 --- a/src/mpegts/PidTable.cpp +++ b/src/mpegts/PidTable.cpp @@ -102,10 +102,7 @@ void PidTable::addPIDData(const int pid, const uint8_t cc) { if (_totalCCErrorsBegin == 0) { _totalCCErrorsBegin = _totalCCErrors; } - int diff = cc - data.cc; - if (diff < 0) { - diff += 0x10; - } + const uint8_t diff = (cc >= data.cc) ? (cc - data.cc) : ((0x10 - data.cc) + cc); data.cc = cc; data.cc_error += diff; _totalCCErrors += diff; @@ -134,7 +131,7 @@ void PidTable::setPID(const int pid, const bool use) { } break; default: - // Nothing todo here + // Nothing to do here break; } } diff --git a/src/mpegts/SDT.cpp b/src/mpegts/SDT.cpp index e69da365..83f5e9d9 100644 --- a/src/mpegts/SDT.cpp +++ b/src/mpegts/SDT.cpp @@ -41,7 +41,7 @@ void SDT::clear() { void SDT::doAddToXML(std::string &xml) const { ADD_XML_ELEMENT(xml, "transportStreamID", _transportStreamID); ADD_XML_ELEMENT(xml, "networkID", _networkID); - for (const auto &[serviceID, sdtData] : _sdtTable) { + for (const auto& [serviceID, sdtData] : _sdtTable) { ADD_XML_BEGIN_ELEMENT(xml, "service"); ADD_XML_ELEMENT(xml, "serviceID", DIGIT(serviceID, 6)); ADD_XML_ELEMENT(xml, "networkName", sdtData.networkNameUTF8); @@ -60,7 +60,7 @@ void SDT::parse(const FeID id) { for (std::size_t secNr = 0; secNr < _numberOfSections; ++secNr) { TableData::Data tableData; if (getDataForSectionNumber(secNr, tableData)) { - const unsigned char *data = tableData.data.c_str(); + const unsigned char* data = tableData.data.data(); _transportStreamID = (data[ 8u] << 8u) | data[ 9u]; _networkID = (data[13u] << 8u) | data[14u]; @@ -73,7 +73,7 @@ void SDT::parse(const FeID id) { const std::size_t len = tableData.sectionLength - 4u - 8u; // Skip to Service Description Table begin and iterate over entries - const unsigned char *ptr = &data[16u]; + const unsigned char* ptr = &data[16u]; for (std::size_t i = 0u; i < len; ) { const int serviceID = (ptr[i + 0u] << 8u) | ptr[i + 1u]; const int eit = ptr[i + 2u]; @@ -111,7 +111,7 @@ void SDT::parse(const FeID id) { // UTF-8 U+0080 U+07FF yyxx xxxx yyyyy xxxxxx 110yyyyy 10xxxxxx => UTF-8 // Ext ASCII - E2 => 1110 0010 => 00011 100010 => 11000011 10100010 => C3 A2 -void SDT::copyToUTF8(std::string &str, const unsigned char *ptr, const std::size_t len) { +void SDT::copyToUTF8(std::string &str, const unsigned char* ptr, const std::size_t len) { const std::size_t offset = (ptr[0] < 0x20) ? ((ptr[0] == 0x10) ? 2 : 1) : 0; for (std::size_t i = offset; i < len; ++i) { if ((ptr[i] & 0x80) == 0x80) { diff --git a/src/mpegts/SDT.h b/src/mpegts/SDT.h index e03ed9f4..735e89bf 100644 --- a/src/mpegts/SDT.h +++ b/src/mpegts/SDT.h @@ -87,7 +87,7 @@ class SDT : protected: - void copyToUTF8(std::string &str, const unsigned char *ptr, std::size_t len); + void copyToUTF8(std::string& str, const unsigned char* ptr, std::size_t len); // ========================================================================= // -- Data members -------------------------------------------------------- diff --git a/src/mpegts/TableData.cpp b/src/mpegts/TableData.cpp index e202b92c..c7229dd9 100644 --- a/src/mpegts/TableData.cpp +++ b/src/mpegts/TableData.cpp @@ -96,7 +96,7 @@ static uint32_t crc32Table[] = { // -- Static member functions ------------------------------------------------- // ============================================================================= -uint32_t TableData::calculateCRC32(const unsigned char *data, const std::size_t len) { +uint32_t TableData::calculateCRC32(const unsigned char* data, const std::size_t len) { uint32_t crc = 0xffffffff; for(size_t i = 0; i < len; ++i) { crc = (crc << 8) ^ crc32Table[((crc >> 24) ^ (data[i] & 0xff)) & 0xff]; @@ -148,7 +148,7 @@ const char* TableData::getTableTXT(const int tableID) const { } void TableData::collectData(const FeID id, const int tableID, - const unsigned char *data, const bool trace, const bool raw) { + const unsigned char* data, const bool trace, const bool raw) { Data ¤tTableData = _dataTable[_currentSectionNumber]; const std::size_t tableSize = currentTableData.data.size(); const bool payloadStart = (data[1] & 0x40) == 0x40; @@ -184,7 +184,7 @@ void TableData::collectData(const FeID id, const int tableID, if (raw) { setCollected(); } else { - const unsigned char *crcData = currentTableData.data.c_str(); + const unsigned char* crcData = currentTableData.data.data(); const uint32_t crc = CRC(crcData, sectionLength); const uint32_t calccrc = calculateCRC32(&crcData[5], sectionLength - 4 + 3); if (calccrc == crc) { @@ -217,7 +217,7 @@ void TableData::collectData(const FeID id, const int tableID, } // Check did we finish collecting Table Data if (sectionLength <= (tableDataSize - 9)) { // 9 = Untill Table Section Length - const unsigned char *crcData = currentTableData.data.c_str(); + const unsigned char* crcData = currentTableData.data.data(); const uint32_t crc = CRC(crcData, sectionLength); const uint32_t calccrc = calculateCRC32(&crcData[5], sectionLength - 4 + 3); if (calccrc == crc) { @@ -240,7 +240,7 @@ void TableData::collectData(const FeID id, const int tableID, } } -bool TableData::addData(const int tableID, const unsigned char *data, +bool TableData::addData(const int tableID, const unsigned char* data, const int length, const int pid, const int cc) { Data ¤tTableData = _dataTable[_currentSectionNumber]; currentTableData.tableID = tableID; diff --git a/src/mpegts/TableData.h b/src/mpegts/TableData.h index c3da2e01..e98ef790 100644 --- a/src/mpegts/TableData.h +++ b/src/mpegts/TableData.h @@ -75,7 +75,7 @@ class TableData { // ========================================================================= public: - static uint32_t calculateCRC32(const unsigned char *data, std::size_t len); + static uint32_t calculateCRC32(const unsigned char* data, std::size_t len); // ========================================================================= // -- Other member functions ---------------------------------------------- @@ -91,12 +91,12 @@ class TableData { bool getDataForSectionNumber(size_t secNr, TableData::Data &data) const; /// Collect Table data for tableID - void collectData(FeID id, int tableID, const unsigned char *data, bool trace) { + void collectData(FeID id, int tableID, const unsigned char* data, bool trace) { collectData(id, tableID, data, trace, false); } /// Collect Raw Table data for tableID - void collectRawData(FeID id, int tableID, const unsigned char *data, bool trace) { + void collectRawData(FeID id, int tableID, const unsigned char* data, bool trace) { collectData(id, tableID, data, trace, true); } @@ -112,7 +112,7 @@ class TableData { protected: /// Add Table data that was collected - bool addData(int tableID, const unsigned char *data, int length, int pid, int cc); + bool addData(int tableID, const unsigned char* data, int length, int pid, int cc); /// Set if the current Table has been collected void setCollected(); @@ -121,26 +121,26 @@ class TableData { const char* getTableTXT(int tableID) const; /// - uint8_t getByte(size_t &i, const unsigned char *buf) { + uint8_t getByte(size_t &i, const unsigned char* buf) { uint8_t d = buf[i]; ++i; return d; } /// - uint16_t getWord(size_t &i, const unsigned char *buf) { + uint16_t getWord(size_t &i, const unsigned char* buf) { uint16_t d = (buf[i] << 8) | buf[i + 1]; i += 2; return d; } - uint32_t get24Bits(size_t &i, const unsigned char *buf) { + uint32_t get24Bits(size_t &i, const unsigned char* buf) { uint32_t d = (buf[i] << 16) | (buf[i + 1] << 8) | buf[i + 2]; i += 3; return d; } - uint32_t getDWord(size_t &i, const unsigned char *buf) { + uint32_t getDWord(size_t &i, const unsigned char* buf) { uint32_t d = (buf[i] << 24) | (buf[i + 1] << 16) | (buf[i + 2] << 8) | buf[i + 3]; i += 4; return d; @@ -149,7 +149,7 @@ class TableData { private: /// Collect Table data for tableID - void collectData(FeID id, int tableID, const unsigned char *data, bool trace, bool raw); + void collectData(FeID id, int tableID, const unsigned char* data, bool trace, bool raw); // ========================================================================= // -- Data members -------------------------------------------------------- diff --git a/src/output/StreamClient.cpp b/src/output/StreamClient.cpp new file mode 100644 index 00000000..5f315831 --- /dev/null +++ b/src/output/StreamClient.cpp @@ -0,0 +1,378 @@ +/* StreamClient.cpp + + Copyright (C) 2014 - 2023 Marc Postema (mpostema09 -at- gmail.com) + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2 + of the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + Or, point your browser to http://www.gnu.org/copyleft/gpl.html +*/ +#include + +#include +#include +#include +#include + +#include + +extern const char* const satpi_version; + +namespace output { + +// ============================================================================= +// -- Constructors and destructor --------------------------------------------- +// ============================================================================= + +StreamClient::StreamClient(FeID feID) : + _feID(feID), + _streamActive(false), + _socketClient(nullptr), + _sessionTimeoutCheck(SessionTimeoutCheck::WATCHDOG), + _ipAddressOfStream("0.0.0.0"), + _watchdog(0), + _sessionTimeout(60), + _sessionID("-1"), + _userAgent("None"), + _commandSeq(0), + _senderRtpPacketCnt(0), + _senderOctectPayloadCnt(0), + _payload(0.0) { + std::random_device rd; + std::mt19937 gen(rd()); + std::normal_distribution<> dist(0xffff, 0xffff); + _ssrc = std::lround(dist(gen)); +} + +// ============================================================================= +// -- base::XMLSupport -------------------------------------------------------- +// ============================================================================= + +void StreamClient::doAddToXML(std::string &xml) const { + ADD_XML_ELEMENT(xml, "owner", _ipAddressOfStream); + ADD_XML_ELEMENT(xml, "ownerSessionID", _sessionID); + ADD_XML_ELEMENT(xml, "userAgent", _userAgent); + ADD_XML_ELEMENT(xml, "rtpPort", _rtp.getSocketPort()); + ADD_XML_ELEMENT(xml, "rtcpPort", _rtcp.getSocketPort()); + ADD_XML_ELEMENT(xml, "httpPort", (_socketClient == nullptr) ? 0 : _socketClient->getSocketPort()); + ADD_XML_ELEMENT(xml, "spc", _senderRtpPacketCnt.load()); + ADD_XML_ELEMENT(xml, "clientPayload", _payload.load() / (1024.0 * 1024.0)); +} + +void StreamClient::doFromXML(const std::string &UNUSED(xml)) {} + +// ============================================================================= +// -- Other member functions -------------------------------------------------- +// ============================================================================= + +bool StreamClient::processStreamingRequest(const SocketClient &client) { + // Split message into Headers + HeaderVector headers = client.getHeaders(); + + // Save clients seq number + const std::string cseq = headers.getFieldParameter("CSeq"); + if (!cseq.empty()) { + _commandSeq = std::stoi(cseq); + } + + // Save clients User-Agent + const std::string userAgent = headers.getFieldParameter("User-Agent"); + if (!userAgent.empty()) { + _userAgent = userAgent; + } + doProcessStreamingRequest(client); + + // reset watchdog and give some extra timeout + _watchdog = std::time(nullptr) + _sessionTimeout + 15; + return true; +} + +void StreamClient::startStreaming() { + doStartStreaming(); + _streamActive = true; +} + +bool StreamClient::writeData(mpegts::PacketBuffer& buffer) { + const long timestamp = base::TimeCounter::getTicks() * 90; + const size_t dataSize = buffer.getCurrentBufferSize(); + + ++_senderRtpPacketCnt; + _senderOctectPayloadCnt += dataSize; + _payload += dataSize; + _timestamp = timestamp; + buffer.tagRTPHeaderWith(_ssrc, _senderRtpPacketCnt, timestamp); + + return doWriteData(buffer); +} + +void StreamClient::writeRTCPData(const std::string& attributeDescribeString) { + const auto [sr, srlen] = getSR(); + const auto [sdes, sdeslen] = getSDES(); + const auto [app, applen] = getAPP(attributeDescribeString); + + doWriteRTCPData(sr, srlen, sdes, sdeslen, app, applen); +} + +void StreamClient::teardown() { + doTeardown(); + { + base::MutexLock lock(_mutex); + + _streamActive = false; + _watchdog = 0; + _sessionID = "-1"; + _ipAddressOfStream = "0.0.0.0"; + _userAgent = "None"; + _sessionTimeoutCheck = SessionTimeoutCheck::WATCHDOG; + + // Do not delete + _socketClient = nullptr; + } +} + +void StreamClient::selfDestruct() { + base::MutexLock lock(_mutex); + _watchdog = 1; +} + +bool StreamClient::isSelfDestructing() const { + base::MutexLock lock(_mutex); + return _watchdog == 1; +} + +bool StreamClient::sessionTimeout() const { + base::MutexLock lock(_mutex); + // See if we need to check watchdog or http FD + switch (_sessionTimeoutCheck) { + case SessionTimeoutCheck::WATCHDOG: + return ((_watchdog != 0) && (_watchdog < std::time(nullptr))); + case SessionTimeoutCheck::FILE_DESCRIPTOR: + return (_socketClient == nullptr) ? false : (_socketClient->getFD() == -1); + default: + return false; + }; +} + +void StreamClient::setSocketClient(SocketClient &socket) { + base::MutexLock lock(_mutex); + _socketClient = &socket; +} + +std::string StreamClient::getSetupMethodReply(const StreamID UNUSED(streamID)) { + static const char *RTSP_SETUP_REPLY = + "RTSP/1.0 461 Unsupported Transport\r\n" \ + "Server: satpi/@#1\r\n" \ + "CSeq: @#2\r\n" \ + "\r\n"; + return StringConverter::stringFormat(RTSP_SETUP_REPLY, + satpi_version, + _commandSeq); +} + +std::string StreamClient::getPlayMethodReply( + StreamID streamID, + const std::string& ipAddressOfServer) { + static const char *RTSP_PLAY_OK = + "RTSP/1.0 200 OK\r\n" \ + "Server: satpi/@#1\r\n" \ + "RTP-Info: url=rtsp://@#2/stream=@#3\r\n" \ + "CSeq: @#4\r\n" \ + "Session: @#5\r\n" \ + "Range: npt=0.000-\r\n" \ + "\r\n"; + return StringConverter::stringFormat(RTSP_PLAY_OK, + satpi_version, + ipAddressOfServer, + streamID.getID(), + _commandSeq, + _sessionID); +} + +std::string StreamClient::getOptionsMethodReply() const { + static const char *RTSP_OPTIONS_OK = + "RTSP/1.0 200 OK\r\n" \ + "Server: satpi/@#1\r\n" \ + "CSeq: @#2\r\n" \ + "Public: OPTIONS, DESCRIBE, SETUP, PLAY, TEARDOWN\r\n" \ + "Session: @#3\r\n" \ + "\r\n"; + return StringConverter::stringFormat(RTSP_OPTIONS_OK, + satpi_version, _commandSeq, _sessionID); +} + +std::string StreamClient::getTeardownMethodReply() const { + static const char *RTSP_TEARDOWN_OK = + "RTSP/1.0 200 OK\r\n" \ + "Server: satpi/@#1\r\n" \ + "CSeq: @#2\r\n" \ + "Session: @#3\r\n" \ + "\r\n"; + return StringConverter::stringFormat(RTSP_TEARDOWN_OK, + satpi_version, _commandSeq, _sessionID); +} + +// ============================================================================= +// -- RTCP member functions --------------------------------------------------- +// ============================================================================= + +std::pair StreamClient::getAPP(const std::string &desc) const { + // total length and align on 32 bits + int len = 16 + desc.size(); + if ((len % 4) != 0) { + len += 4 - (len % 4); + } + // Application Defined packet (APP Packet) + // Alloc and copy data and adjust length + PacketPtr app(new uint8_t[len]); + app[0] = 0x80; // version: 2, padding: 0, subtype: 0 + app[1] = 204; // payload type: 204 (0xcc) (APP) + app[2] = 0; // length (total in 32-bit words minus one) + app[3] = 0; // length (total in 32-bit words minus one) + app[4] = (_ssrc >> 24) & 0xff;// synchronization source + app[5] = (_ssrc >> 16) & 0xff;// synchronization source + app[6] = (_ssrc >> 8) & 0xff;// synchronization source + app[7] = (_ssrc >> 0) & 0xff;// synchronization source + app[8] = 'S'; // name + app[9] = 'E'; // name + app[10] = 'S'; // name + app[11] = '1'; // name + app[12] = 0; // identifier (0000) + app[13] = 0; // identifier + app[14] = 0; // string length + app[15] = 0; // string length + // here the App defined data is added + + // Alloc and copy data and adjust length + std::memcpy(app.get() + 16, desc.data(), desc.size()); + const int ws = (len / 4) - 1; + app[2] = (ws >> 8) & 0xff; + app[3] = (ws >> 0) & 0xff; + const int ss = desc.size(); + app[14] = (ss >> 8) & 0xff; + app[15] = (ss >> 0) & 0xff; + return {std::move(app), len}; +} + +std::pair StreamClient::getSR() const { + // Sender Report (SR Packet) + int len = 28; + PacketPtr sr(new uint8_t[len]); + sr[0] = 0x80; // version: 2, padding: 0, sr blocks: 0 + sr[1] = 200; // payload type: 200 (0xc8) (SR) + sr[2] = 0; // length (total in 32-bit words minus one) + sr[3] = 0; // length (total in 32-bit words minus one) + sr[4] = (_ssrc >> 24) & 0xff; // synchronization source + sr[5] = (_ssrc >> 16) & 0xff; // synchronization source + sr[6] = (_ssrc >> 8) & 0xff; // synchronization source + sr[7] = (_ssrc >> 0) & 0xff; // synchronization source + + const std::time_t ntp = std::time(nullptr); + // NTP integer part + sr[8] = (ntp >> 24) & 0xff; // NTP most sign word + sr[9] = (ntp >> 16) & 0xff; // NTP most sign word + sr[10] = (ntp >> 8) & 0xff; // NTP most sign word + sr[11] = (ntp >> 0) & 0xff; // NTP most sign word + // NTP fractional part + sr[12] = 0; // NTP least sign word + sr[13] = 0; // NTP least sign word + sr[14] = 0; // NTP least sign word + sr[15] = 0; // NTP least sign word + + const long timestamp = _timestamp; + sr[16] = (timestamp >> 24) & 0xff; // RTP timestamp RTS + sr[17] = (timestamp >> 16) & 0xff; // RTP timestamp RTS + sr[18] = (timestamp >> 8) & 0xff; // RTP timestamp RTS + sr[19] = (timestamp >> 0) & 0xff; // RTP timestamp RTS + const int32_t spc = _senderRtpPacketCnt; + sr[20] = (spc >> 24) & 0xff; // sender's packet count SPC + sr[21] = (spc >> 16) & 0xff; // sender's packet count SPC + sr[22] = (spc >> 8) & 0xff; // sender's packet count SPC + sr[23] = (spc >> 0) & 0xff; // sender's packet count SPC + const uint32_t soc = _senderOctectPayloadCnt; + sr[24] = (soc >> 24) & 0xff; // sender's octet count SOC + sr[25] = (soc >> 16) & 0xff; // sender's octet count SOC + sr[26] = (soc >> 8) & 0xff; // sender's octet count SOC + sr[27] = (soc >> 0) & 0xff; // sender's octet count SOC + + // Alloc and copy data and adjust length + const int ws = (len / 4) - 1; + sr[2] = (ws >> 8) & 0xff; + sr[3] = (ws >> 0) & 0xff; + return {std::move(sr), len}; +} + +std::pair StreamClient::getSDES() const { + // Source Description (SDES Packet) + int len = 20; + PacketPtr sdes(new uint8_t[len]); + sdes[0] = 0x81; // version: 2, padding: 0, sc blocks: 1 + sdes[1] = 202; // payload type: 202 (0xca) (SDES) + sdes[2] = 0; // length (total in 32-bit words minus one) + sdes[3] = 3; // length (total in 32-bit words minus one) + + sdes[4] = (_ssrc >> 24) & 0xff; // synchronization source + sdes[5] = (_ssrc >> 16) & 0xff; // synchronization source + sdes[6] = (_ssrc >> 8) & 0xff; // synchronization source + sdes[7] = (_ssrc >> 0) & 0xff; // synchronization source + + sdes[8] = 1; // CNAME: 1 + sdes[9] = 6; // length: 6 + sdes[10] = 'S'; // data + sdes[11] = 'a'; // data + + sdes[12] = 't'; // data + sdes[13] = 'P'; // data + sdes[14] = 'I'; // data + sdes[15] = 0; // data + + sdes[16] = 0; // data + sdes[17] = 0; // data + sdes[18] = 0; // data + sdes[19] = 0; // data + + const int ws = (len / 4) - 1; + sdes[2] = (ws >> 8) & 0xff; + sdes[3] = (ws >> 0) & 0xff; + return {std::move(sdes), len}; +} + +// ============================================================================= +// -- HTTP member functions --------------------------------------------------- +// ============================================================================= + +bool StreamClient::sendHttpData(const void *buf, std::size_t len, int flags) { +// base::MutexLock lock(_mutex); + return (_socketClient == nullptr) ? false : _socketClient->sendData(buf, len, flags); +} + +bool StreamClient::writeHttpData(const struct iovec *iov, int iovcnt) { +// base::MutexLock lock(_mutex); + return (_socketClient == nullptr) ? false : _socketClient->writeData(iov, iovcnt); +} + +int StreamClient::getHttpSocketPort() const { +// base::MutexLock lock(_mutex); + return (_socketClient == nullptr) ? 0 : _socketClient->getSocketPort(); +} + +int StreamClient::getHttpNetworkSendBufferSize() const { +// base::MutexLock lock(_mutex); + return (_socketClient == nullptr) ? 0 : _socketClient->getNetworkSendBufferSize(); +} + +bool StreamClient::setHttpNetworkSendBufferSize(int size) { +// base::MutexLock lock(_mutex); + return (_socketClient == nullptr) ? false : _socketClient->setNetworkSendBufferSize(size); +} + +} diff --git a/src/StreamClient.h b/src/output/StreamClient.h similarity index 55% rename from src/StreamClient.h rename to src/output/StreamClient.h index 21e1b041..a6e6a2db 100644 --- a/src/StreamClient.h +++ b/src/output/StreamClient.h @@ -20,15 +20,24 @@ #ifndef STREAM_CLIENT_H_INCLUDE #define STREAM_CLIENT_H_INCLUDE STREAM_CLIENT_H_INCLUDE +#include #include -#include -#include +#include #include #include +#include +#include +#include +#include +#include #include #include +FW_DECL_SP_NS1(output, StreamClient); + +namespace output { + /// StreamClient defines the owner/participants of an stream class StreamClient : public base::XMLSupport { public: @@ -39,42 +48,54 @@ class StreamClient : public base::XMLSupport { TEARDOWN }; - // ===================================================================== - // -- Constructors and destructor -------------------------------------- - // ===================================================================== + enum class StreamingType { + NONE, + HTTP, + RTSP_UNICAST, + RTSP_MULTICAST, + RTP_TCP, + FILE_SRC + }; + + // ========================================================================= + // -- Constructors and destructor ------------------------------------------ + // ========================================================================= public: - StreamClient(); + StreamClient(FeID feID); - virtual ~StreamClient(); + virtual ~StreamClient() = default; - // ======================================================================= - // -- base::XMLSupport --------------------------------------------------- - // ======================================================================= + // ========================================================================= + // -- base::XMLSupport ----------------------------------------------------- + // ========================================================================= private: /// @see XMLSupport - virtual void doAddToXML(std::string &xml) const final; + virtual void doAddToXML(std::string& xml) const final; /// @see XMLSupport - virtual void doFromXML(const std::string &xml) final; + virtual void doFromXML(const std::string& xml) final; - // ===================================================================== - // -- Other member functions ------------------------------------------ - // ===================================================================== + // ========================================================================= + // -- Other member functions ---------------------------------------------- + // ========================================================================= public: /// - void teardown(); + bool processStreamingRequest(const SocketClient& client); - /// Call this if the stream should stop because of some error - void selfDestruct(); + /// + void startStreaming(); - /// Check if this client is self destructing - bool isSelfDestructing() const; + /// + bool writeData(mpegts::PacketBuffer& buffer); /// - void restartWatchDog(); + void writeRTCPData(const std::string& attributeDescribeString); + + /// + void teardown(); /// Check if this client has an session timeout bool sessionTimeout() const; @@ -82,83 +103,97 @@ class StreamClient : public base::XMLSupport { /// Set the client that is sending data void setSocketClient(SocketClient &socket); + /// Set the session ID for this client + /// @param specifies the the session ID to use + void setSessionID(const std::string& sessionID) { + base::MutexLock lock(_mutex); + _sessionID = sessionID; + } + /// - void setSessionTimeoutCheck(SessionTimeoutCheck sessionTimeoutCheck) { + std::string getSessionID() const { base::MutexLock lock(_mutex); - _sessionTimeoutCheck = sessionTimeoutCheck; + return _sessionID; } - /// For RTP stream - SocketAttr &getRtpSocketAttr(); + protected: - /// For RTCP stream - SocketAttr &getRtcpSocketAttr(); - /// Set the IP address of the stream output - /// @param ipAddress specifies the IP address of the stream output - void setIPAddressOfStream(const std::string &ipAddress) { - base::MutexLock lock(_mutex); - _ipAddress = ipAddress; - } + /// Call this if the stream should stop because of some error + void selfDestruct(); - /// Get the IP address of the stream output - std::string getIPAddressOfStream() const { - base::MutexLock lock(_mutex); - return _ipAddress; - } + /// Check if this client is self destructing + bool isSelfDestructing() const; - /// Get the IP address of this socket client (Owner) - std::string getIPAddressOfSocket() const { - base::MutexLock lock(_mutex); - return (_socketClient == nullptr) ? "0.0.0.0" : _socketClient->getIPAddressOfSocket(); - } + // ========================================================================= + // -- StreamClient specialization functions ------------------------------- + // ========================================================================= + public: - /// Set the User-Agent of the socket client (Owner) - void setUserAgent(const std::string &userAgent) { - base::MutexLock lock(_mutex); - _userAgent = userAgent; - } + /// + virtual std::string getSetupMethodReply(StreamID streamID); - /// Get the User-Agent of the socket client (Owner - std::string getUserAgent() const { - base::MutexLock lock(_mutex); - return _userAgent; - } + /// + virtual std::string getPlayMethodReply( + StreamID streamID, + const std::string& ipAddressOfServer); - /// Set the session ID for this client - /// @param specifies the the session ID to use - void setSessionID(const std::string &sessionID) { - base::MutexLock lock(_mutex); - _sessionID = sessionID; - } + /// + virtual std::string getOptionsMethodReply() const; /// - std::string getSessionID() const { - base::MutexLock lock(_mutex); - return _sessionID; - } + virtual std::string getTeardownMethodReply() const; /// - void setCSeq(int cseq) { - base::MutexLock lock(_mutex); - _cseq = cseq; + virtual std::string getDescribeMediaLevelString( + StreamID UNUSED(streamID), + const std::string& UNUSED(deviceAttributeDescription)) const { + return ""; } + private: + /// - int getCSeq() const { - base::MutexLock lock(_mutex); - return _cseq; + virtual bool doProcessStreamingRequest(const SocketClient& UNUSED(client)) { + return false; } /// - unsigned int getSessionTimeout() const { - base::MutexLock lock(_mutex); - return _sessionTimeout; + virtual void doStartStreaming() {} + + /// + virtual void doTeardown() {} + + /// + virtual bool doWriteData(mpegts::PacketBuffer& UNUSED(buffer)) { + return false; } - // ===================================================================== - // -- HTTP member functions ------------------------------------------- - // ===================================================================== + /// + virtual void doWriteRTCPData( + const PacketPtr& UNUSED(sr), int UNUSED(srlen), + const PacketPtr& UNUSED(sdes), int UNUSED(sdeslen), + const PacketPtr& UNUSED(app), int UNUSED(applen)) {} + + // ========================================================================= + // -- RTCP member functions ----------------------------------------------- + // ========================================================================= + protected: + + /// + /// @param desc specifies the Attribute Describe String of this streamClient + std::pair getAPP(const std::string &desc) const; + + /// + std::pair getSDES() const; + + /// + std::pair getSR() const; + + // ========================================================================= + // -- HTTP member functions ----------------------------------------------- + // ========================================================================= + protected: /// Send HTTP/RTP_TCP data to connected client bool sendHttpData(const void *buf, std::size_t len, int flags); @@ -175,22 +210,32 @@ class StreamClient : public base::XMLSupport { /// Set the HTTP/RTP_TCP network send buffer size for this Socket bool setHttpNetworkSendBufferSize(int size); - // ===================================================================== - // -- Data members ----------------------------------------------------- - // ===================================================================== - private: + // ========================================================================= + // -- Data members --------------------------------------------------------- + // ========================================================================= + protected: base::Mutex _mutex; + FeID _feID; + bool _streamActive; SocketClient *_socketClient; SessionTimeoutCheck _sessionTimeoutCheck; - std::string _ipAddress; - std::time_t _watchdog; + std::string _ipAddressOfStream; + std::time_t _watchdog; unsigned int _sessionTimeout; - std::string _sessionID; - std::string _userAgent; - int _cseq; - SocketAttr _rtp; - SocketAttr _rtcp; + std::string _sessionID; + std::string _userAgent; + int _commandSeq; + SocketAttr _rtp; + SocketAttr _rtcp; + uint32_t _ssrc; + std::atomic _senderRtpPacketCnt; + std::atomic _senderOctectPayloadCnt; + std::atomic _timestamp; + std::atomic _payload; + }; +} + #endif // STREAM_CLIENT_H_INCLUDE diff --git a/src/output/StreamClientOutputHttp.cpp b/src/output/StreamClientOutputHttp.cpp new file mode 100644 index 00000000..f10a4bcf --- /dev/null +++ b/src/output/StreamClientOutputHttp.cpp @@ -0,0 +1,65 @@ +/* StreamClientOutputHttp.cpp + + Copyright (C) 2014 - 2023 Marc Postema (mpostema09 -at- gmail.com) + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2 + of the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + Or, point your browser to http://www.gnu.org/copyleft/gpl.html +*/ +#include + +namespace output { + +// ============================================================================= +// -- StreamClient ------------------------------------------------------------- +// ============================================================================= + +bool StreamClientOutputHttp::doProcessStreamingRequest(const SocketClient& client) { + _sessionTimeoutCheck = StreamClient::SessionTimeoutCheck::FILE_DESCRIPTOR; + _ipAddressOfStream = client.getIPAddressOfSocket(); + return true; +} + +void StreamClientOutputHttp::doStartStreaming() { + // Get default buffer size and set it x times as big + const int bufferSize = getHttpNetworkSendBufferSize() * 2; + setHttpNetworkSendBufferSize(bufferSize); + SI_LOG_INFO("Frontend: @#1, HTTP set network buffer size: @#2 KBytes", _feID, + bufferSize / 1024); + SI_LOG_INFO("Frontend: @#1, Start HTTP stream to @#2:@#3", _feID, + _ipAddressOfStream, getHttpSocketPort()); +} + +void StreamClientOutputHttp::doTeardown() { + SI_LOG_INFO("Frontend: @#1, Stop HTTP stream to @#2:@#3", _feID, + _ipAddressOfStream, getHttpSocketPort()); +} + +bool StreamClientOutputHttp::doWriteData(mpegts::PacketBuffer& buffer) { + const size_t dataSize = buffer.getCurrentBufferSize(); + iovec iovHTTP[1]; + iovHTTP[0].iov_base = buffer.getTSReadBufferPtr(); + iovHTTP[0].iov_len = dataSize; + // send the HTTP packet + if (!writeHttpData(iovHTTP, 1)) { + if (!isSelfDestructing()) { + SI_LOG_ERROR("Frontend: @#1, Error sending HTTP Stream Data to @#2:@#3", _feID, + _ipAddressOfStream, getHttpSocketPort()); + selfDestruct(); + } + } + return true; +} + +} diff --git a/src/output/StreamClientOutputHttp.h b/src/output/StreamClientOutputHttp.h new file mode 100644 index 00000000..dcbd6b14 --- /dev/null +++ b/src/output/StreamClientOutputHttp.h @@ -0,0 +1,81 @@ +/* StreamClientOutputHttp.h + + Copyright (C) 2014 - 2023 Marc Postema (mpostema09 -at- gmail.com) + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2 + of the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + Or, point your browser to http://www.gnu.org/copyleft/gpl.html +*/ +#ifndef STREAM_CLIENT_OUTPUT_HTTP_H_INCLUDE +#define STREAM_CLIENT_OUTPUT_HTTP_H_INCLUDE STREAM_CLIENT_OUTPUT_HTTP_H_INCLUDE + +#include +#include +#include + +FW_DECL_SP_NS1(output, StreamClientOutputHttp); + +namespace output { + +/// StreamClient defines the owner/participants of an stream +class StreamClientOutputHttp : public output::StreamClient { + public: + + // ========================================================================= + // -- Constructors and destructor ------------------------------------------ + // ========================================================================= + public: + + StreamClientOutputHttp(FeID feID) : StreamClient(feID) {}; + + virtual ~StreamClientOutputHttp() = default; + + // ========================================================================= + // -- static member functions ---------------------------------------------- + // ========================================================================= + public: + + static SpStreamClientOutputHttp makeSP(); + template + static SpStreamClient makeSP(ARGS&&... args) { + return std::make_shared(std::forward(args)...); + } + + // ========================================================================= + // -- StreamClient --------------------------------------------------------- + // ========================================================================= + private: + + /// Specialization for @see processStreamingRequest + virtual bool doProcessStreamingRequest(const SocketClient& client) final; + + /// Specialization for @see startStreaming + virtual void doStartStreaming() final; + + /// Specialization for @see teardown + virtual void doTeardown() final; + + /// Specialization for @see writeData + virtual bool doWriteData(mpegts::PacketBuffer& buffer) final; + + // ========================================================================= + // -- Data members --------------------------------------------------------- + // ========================================================================= + private: + +}; + +} + +#endif diff --git a/src/output/StreamClientOutputRtp.cpp b/src/output/StreamClientOutputRtp.cpp new file mode 100644 index 00000000..660ff75c --- /dev/null +++ b/src/output/StreamClientOutputRtp.cpp @@ -0,0 +1,180 @@ +/* StreamClientOutputRtp.cpp + + Copyright (C) 2014 - 2023 Marc Postema (mpostema09 -at- gmail.com) + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2 + of the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + Or, point your browser to http://www.gnu.org/copyleft/gpl.html +*/ +#include + +extern const char* const satpi_version; + +namespace output { + +// ============================================================================= +// -- StreamClient ------------------------------------------------------------- +// ============================================================================= + +std::string StreamClientOutputRtp::getSetupMethodReply(const StreamID streamID) { + if (_multicast) { + static const char *RTSP_SETUP_OK = + "RTSP/1.0 200 OK\r\n" \ + "Server: satpi/@#1\r\n" \ + "CSeq: @#2\r\n" \ + "Session: @#3;timeout=@#4\r\n" \ + "Transport: RTP/AVP;multicast;destination=@#5;port=@#6-@#7;ttl=5\r\n" \ + "com.ses.streamID: @#8\r\n" \ + "\r\n"; + return StringConverter::stringFormat(RTSP_SETUP_OK, + satpi_version, + _commandSeq, + _sessionID, + _sessionTimeout, + _ipAddressOfStream, + _rtp.getSocketPort(), + _rtcp.getSocketPort(), + streamID.getID()); + } else { + static const char *RTSP_SETUP_OK = + "RTSP/1.0 200 OK\r\n" \ + "Server: satpi/@#1\r\n" \ + "CSeq: @#2\r\n" \ + "Session: @#3;timeout=@#4\r\n" \ + "Transport: RTP/AVP;unicast;client_ip=@#5;client_port=@#6-@#7\r\n" \ + "com.ses.streamID: @#8\r\n" \ + "\r\n"; + return StringConverter::stringFormat(RTSP_SETUP_OK, + satpi_version, + _commandSeq, + _sessionID, + _sessionTimeout, + _ipAddressOfStream, + _rtp.getSocketPort(), + _rtcp.getSocketPort(), + streamID.getID()); + } +} + +std::string StreamClientOutputRtp::getDescribeMediaLevelString( + StreamID streamID, + const std::string& deviceAttributeDescription) const { + static const char *RTSP_DESCRIBE_MEDIA_LEVEL = + "m=video @#1 RTP/AVP 33\r\n" \ + "c=IN IP4 @#2\r\n" \ + "a=control:stream=@#3\r\n" \ + "a=fmtp:33 @#4\r\n" \ + "a=@#5\r\n"; + if (_multicast) { + return StringConverter::stringFormat(RTSP_DESCRIBE_MEDIA_LEVEL, + _rtp.getSocketPort(), + _ipAddressOfStream + "/" + std::to_string(_rtp.getTimeToLive()), + streamID.getID(), deviceAttributeDescription, + (_streamActive) ? "sendonly" : "inactive"); + } else { + return StringConverter::stringFormat(RTSP_DESCRIBE_MEDIA_LEVEL, + 0, "0.0.0.0", streamID.getID(), deviceAttributeDescription, + (_streamActive) ? "sendonly" : "inactive"); + } +} + +bool StreamClientOutputRtp::doProcessStreamingRequest(const SocketClient& client) { + // Split message into Headers + HeaderVector headers = client.getHeaders(); + + std::string ports; + int ttl = 0; + if (_multicast) { + ttl = headers.getIntFieldParameter("Transport", "ttl"); + ports = headers.getStringFieldParameter("Transport", "port"); + const std::string dest = headers.getStringFieldParameter("Transport", "destination"); + if (!dest.empty()) { + _ipAddressOfStream = dest; + } + _sessionTimeoutCheck = StreamClient::SessionTimeoutCheck::TEARDOWN; + } else { + ports = headers.getStringFieldParameter("Transport", "client_port"); + _ipAddressOfStream = client.getIPAddressOfSocket(); + _sessionTimeoutCheck = StreamClient::SessionTimeoutCheck::WATCHDOG; + } + + const StringVector port = StringConverter::split(ports, "-"); + if (port.size() == 2) { + const int rtp = std::isdigit(port[0][0]) ? std::stoi(port[0]) : 15000; + const int rtcp = std::isdigit(port[1][0]) ? std::stoi(port[1]) : 15001; + _rtp.setupSocketStructure(_ipAddressOfStream, rtp, ttl); + _rtcp.setupSocketStructure(_ipAddressOfStream, rtcp, ttl); + } + return true; +} + +void StreamClientOutputRtp::doStartStreaming() { + // setup sockets for RTP and RTCP + if (!_rtp.setupSocketHandle(SOCK_DGRAM, IPPROTO_UDP)) { + SI_LOG_ERROR("Frontend: @#1, Get RTP/UDP handle failed", _feID); + } + if (!_rtcp.setupSocketHandle(SOCK_DGRAM, IPPROTO_UDP)) { + SI_LOG_ERROR("Frontend: @#1, Get RTCP/UDP handle failed", _feID); + } + + // Get default buffer size and set it x times as big + const int bufferSize = _rtp.getNetworkSendBufferSize() * 2; + _rtp.setNetworkSendBufferSize(bufferSize); + SI_LOG_INFO("Frontend: @#1, RTP/UDP set network buffer size: @#2 KBytes", _feID, + bufferSize / 1024); + SI_LOG_INFO("Frontend: @#1, Start RTP/UDP stream to @#2:@#3", _feID, + _rtp.getIPAddressOfSocket(), _rtp.getSocketPort()); + SI_LOG_INFO("Frontend: @#1, Start RTCP/UDP stream to @#2:@#3", _feID, + _rtcp.getIPAddressOfSocket(), _rtcp.getSocketPort()); +} + +void StreamClientOutputRtp::doTeardown() { + SI_LOG_INFO("Frontend: @#1, Stop RTP/UDP stream to @#2:@#3", _feID, + _rtp.getIPAddressOfSocket(), _rtp.getSocketPort()); + SI_LOG_INFO("Frontend: @#1, Stop RTCP/UDP stream to @#2:@#3", _feID, + _rtcp.getIPAddressOfSocket(), _rtcp.getSocketPort()); +} + +bool StreamClientOutputRtp::doWriteData(mpegts::PacketBuffer& buffer) { + const size_t dataSize = buffer.getCurrentBufferSize(); + const size_t lenRTP = dataSize + mpegts::PacketBuffer::RTP_HEADER_LEN; + const unsigned char* rtpBuffer = buffer.getReadBufferPtr(); + if (!_rtp.sendDataTo(rtpBuffer, lenRTP, MSG_DONTWAIT)) { + if (!isSelfDestructing()) { + SI_LOG_ERROR("Frontend: @#1, Error sending RTP/UDP data to @#2:@#3", _feID, + _rtp.getIPAddressOfSocket(), _rtp.getSocketPort()); + selfDestruct(); + } + } + return true; +} + +void StreamClientOutputRtp::doWriteRTCPData( + const PacketPtr& sr, const int srlen, + const PacketPtr& sdes, const int sdeslen, + const PacketPtr& app, const int applen) { + const int len = srlen + sdeslen + applen; + PacketPtr data(new uint8_t[len]); + std::memcpy(data.get(), sr.get(), srlen); + std::memcpy(data.get() + srlen, sdes.get(), sdeslen); + std::memcpy(data.get() + srlen + sdeslen, app.get(), applen); + + // send the RTCP/UDP packet + if (!_rtcp.sendDataTo(data.get(), len, 0)) { + SI_LOG_ERROR("Frontend: @#1, Error sending RTCP/UDP data to @#2:@#3", _feID, + _ipAddressOfStream, _rtcp.getSocketPort()); + } +} + +} diff --git a/src/output/StreamClientOutputRtp.h b/src/output/StreamClientOutputRtp.h new file mode 100644 index 00000000..bf6acd8e --- /dev/null +++ b/src/output/StreamClientOutputRtp.h @@ -0,0 +1,98 @@ +/* StreamClientOutputRtp.h + + Copyright (C) 2014 - 2023 Marc Postema (mpostema09 -at- gmail.com) + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2 + of the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + Or, point your browser to http://www.gnu.org/copyleft/gpl.html +*/ +#ifndef STREAM_CLIENT_OUTPUT_RTP_H_INCLUDE +#define STREAM_CLIENT_OUTPUT_RTP_H_INCLUDE STREAM_CLIENT_OUTPUT_RTPs_H_INCLUDE + +#include +#include +#include + +FW_DECL_SP_NS1(output, StreamClientOutputRtp); + +namespace output { + +/// StreamClient defines the owner/participants of an stream +class StreamClientOutputRtp : public output::StreamClient { + public: + + // ========================================================================= + // -- Constructors and destructor ------------------------------------------ + // ========================================================================= + public: + + StreamClientOutputRtp(FeID feID, bool multicast) : StreamClient(feID), _multicast(multicast) {} + + virtual ~StreamClientOutputRtp() = default; + + // ========================================================================= + // -- static member functions ---------------------------------------------- + // ========================================================================= + public: + + template + static SpStreamClient makeSP(ARGS&&... args) { + return std::make_shared(std::forward(args)...); + } + + // ========================================================================= + // -- StreamClient --------------------------------------------------------- + // ========================================================================= + public: + + /// + virtual std::string getSetupMethodReply(StreamID streamID) final; + + /// + virtual std::string getDescribeMediaLevelString( + StreamID streamID, + const std::string& deviceAttributeDescription) const final; + + private: + + /// Specialization for @see processStreamingRequest + virtual bool doProcessStreamingRequest(const SocketClient& client) final; + + /// Specialization for @see startStreaming + virtual void doStartStreaming() final; + + /// Specialization for @see teardown + virtual void doTeardown() final; + + /// Specialization for @see writeData + virtual bool doWriteData(mpegts::PacketBuffer& buffer) final; + + /// Specialization for @see writeRTCPData + virtual void doWriteRTCPData( + const PacketPtr& sr, int srlen, + const PacketPtr& sdes, int sdeslen, + const PacketPtr& app, int applen); + + // ========================================================================= + // -- Data members --------------------------------------------------------- + // ========================================================================= + private: + + bool _multicast; + +}; + +} + +#endif diff --git a/src/output/StreamClientOutputRtpTcp.cpp b/src/output/StreamClientOutputRtpTcp.cpp new file mode 100644 index 00000000..b2d4ab25 --- /dev/null +++ b/src/output/StreamClientOutputRtpTcp.cpp @@ -0,0 +1,137 @@ +/* StreamClientOutputRtpTcp.cpp + + Copyright (C) 2014 - 2023 Marc Postema (mpostema09 -at- gmail.com) + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2 + of the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + Or, point your browser to http://www.gnu.org/copyleft/gpl.html +*/ +#include + +extern const char* const satpi_version; + +namespace output { + +// ============================================================================= +// -- StreamClient ------------------------------------------------------------- +// ============================================================================= + +std::string StreamClientOutputRtpTcp::getSetupMethodReply(const StreamID streamID) { + static const char *RTSP_SETUP_OK = + "RTSP/1.0 200 OK\r\n" \ + "Server: satpi/@#1\r\n" \ + "CSeq: @#2\r\n" \ + "Session: @#3;timeout=@#4\r\n" \ + "Transport: RTP/AVP/TCP;unicast;client_ip=@#5;interleaved=0-1\r\n" \ + "com.ses.streamID: @#6\r\n" \ + "\r\n"; + return StringConverter::stringFormat(RTSP_SETUP_OK, + satpi_version, + _commandSeq, + _sessionID, + _sessionTimeout, + _ipAddressOfStream, + streamID.getID()); +} + +bool StreamClientOutputRtpTcp::doProcessStreamingRequest(const SocketClient& client) { + // Split message into Headers + HeaderVector headers = client.getHeaders(); + + const int interleaved = headers.getIntFieldParameter("Transport", "interleaved"); + if (interleaved != -1) { + _ipAddressOfStream = client.getIPAddressOfSocket(); + } + _sessionTimeoutCheck = StreamClient::SessionTimeoutCheck::WATCHDOG; + return true; +} + +void StreamClientOutputRtpTcp::doStartStreaming() { + // Get default buffer size and set it x times as big + const int bufferSize = getHttpNetworkSendBufferSize() * 2; + setHttpNetworkSendBufferSize(bufferSize); + SI_LOG_INFO("Frontend: @#1, RTP/TCP set network buffer size: @#2 KBytes", + _feID, bufferSize / 1024); + + SI_LOG_INFO("Frontend: @#1, Start RTP/TCP stream to @#2:@#3", _feID, + _ipAddressOfStream, getHttpSocketPort()); + SI_LOG_INFO("Frontend: @#1, Start RTCP/TCP stream to @#2:@#3", _feID, + _ipAddressOfStream, getHttpSocketPort()); +} + +void StreamClientOutputRtpTcp::doTeardown() { + SI_LOG_INFO("Frontend: @#1, Stop RTP/TCP stream to @#2:@#3", _feID, + _ipAddressOfStream, getHttpSocketPort()); + SI_LOG_INFO("Frontend: @#1, Stop RTCP/TCP stream to @#2:@#3", _feID, + _ipAddressOfStream, getHttpSocketPort()); +} + +bool StreamClientOutputRtpTcp::doWriteData(mpegts::PacketBuffer& buffer) { + const size_t dataSize = buffer.getCurrentBufferSize(); + const size_t lenRTP = dataSize + mpegts::PacketBuffer::RTP_HEADER_LEN; + + unsigned char header[4]; + header[0] = 0x24; + header[1] = 0x00; + header[2] = (lenRTP >> 8) & 0xFF; + header[3] = (lenRTP >> 0) & 0xFF; + + iovec iov[2]; + iov[0].iov_base = header; + iov[0].iov_len = 4; + iov[1].iov_base = buffer.getReadBufferPtr(); + iov[1].iov_len = lenRTP; + + // send the RTP/TCP packet + if (!writeHttpData(iov, 2)) { + if (!isSelfDestructing()) { + SI_LOG_ERROR("Frontend: @#1, Error sending RTP/TCP Stream Data to @#2:@#3", _feID, + _ipAddressOfStream, getHttpSocketPort()); + selfDestruct(); + } + } + return true; +} + +void StreamClientOutputRtpTcp::doWriteRTCPData( + const PacketPtr& sr, const int srlen, + const PacketPtr& sdes, const int sdeslen, + const PacketPtr& app, const int applen) { + const int len = srlen + sdeslen + applen; + + unsigned char header[4]; + header[0] = 0x24; + header[1] = 0x01; + header[2] = (len >> 8) & 0xFF; + header[3] = (len >> 0) & 0xFF; + + iovec iov[4]; + iov[0].iov_base = header; + iov[0].iov_len = 4; + iov[1].iov_base = sr.get(); + iov[1].iov_len = srlen; + iov[2].iov_base = sdes.get(); + iov[2].iov_len = sdeslen; + iov[3].iov_base = app.get(); + iov[3].iov_len = applen; + + // send the RTCP/TCP packet + if (!writeHttpData(iov, 4)) { + SI_LOG_ERROR("Frontend: @#1, Error sending RTCP/TCP Stream Data to @#2:@#3", _feID, + _ipAddressOfStream, getHttpSocketPort()); + } +} + +} + diff --git a/src/output/StreamClientOutputRtpTcp.h b/src/output/StreamClientOutputRtpTcp.h new file mode 100644 index 00000000..8318830c --- /dev/null +++ b/src/output/StreamClientOutputRtpTcp.h @@ -0,0 +1,91 @@ +/* StreamClientOutputRtpTcp.h + + Copyright (C) 2014 - 2023 Marc Postema (mpostema09 -at- gmail.com) + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2 + of the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + Or, point your browser to http://www.gnu.org/copyleft/gpl.html +*/ +#ifndef STREAM_CLIENT_OUTPUT_RTP_TCP_H_INCLUDE +#define STREAM_CLIENT_OUTPUT_RTP_TCP_H_INCLUDE STREAM_CLIENT_OUTPUT_RTP_TCP_H_INCLUDE + +#include +#include +#include + +FW_DECL_SP_NS1(output, StreamClientOutputRtpTcp); + +namespace output { + +/// StreamClient defines the owner/participants of an stream +class StreamClientOutputRtpTcp : public output::StreamClient { + public: + + // ========================================================================= + // -- Constructors and destructor ------------------------------------------ + // ========================================================================= + public: + + StreamClientOutputRtpTcp(FeID feID) : StreamClient(feID) {}; + + virtual ~StreamClientOutputRtpTcp() = default; + + // ========================================================================= + // -- static member functions ---------------------------------------------- + // ========================================================================= + public: + + template + static SpStreamClient makeSP(ARGS&&... args) { + return std::make_shared(std::forward(args)...); + } + + // ========================================================================= + // -- StreamClient --------------------------------------------------------- + // ========================================================================= + public: + + /// + virtual std::string getSetupMethodReply(StreamID streamID) final; + + private: + + /// Specialization for @see processStreamingRequest + virtual bool doProcessStreamingRequest(const SocketClient& client) final; + + /// Specialization for @see startStreaming + virtual void doStartStreaming() final; + + /// Specialization for @see teardown + virtual void doTeardown() final; + + /// Specialization for @see writeData + virtual bool doWriteData(mpegts::PacketBuffer& buffer) final; + + /// Specialization for @see writeRTCPData + virtual void doWriteRTCPData( + const PacketPtr& sr, int srlen, + const PacketPtr& sdes, int sdeslen, + const PacketPtr& app, int applen); + + // ========================================================================= + // -- Data members --------------------------------------------------------- + // ========================================================================= + private: + +}; + +} + +#endif diff --git a/src/output/StreamThreadBase.cpp b/src/output/StreamThreadBase.cpp deleted file mode 100644 index b458d161..00000000 --- a/src/output/StreamThreadBase.cpp +++ /dev/null @@ -1,250 +0,0 @@ -/* StreamThreadBase.cpp - - Copyright (C) 2014 - 2023 Marc Postema (mpostema09 -at- gmail.com) - - This program is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public License - as published by the Free Software Foundation; either version 2 - of the License, or (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - Or, point your browser to http://www.gnu.org/copyleft/gpl.html - */ -#include - -#include -#include -#include -#include -#include -#include -#ifdef LIBDVBCSA - #include -#endif - -#include -#include -#include - -namespace output { - -// ============================================================================= -// -- Constructors and destructor ---------------------------------------------- -// ============================================================================= - -StreamThreadBase::StreamThreadBase(const std::string &protocol, StreamInterface &stream) : - ThreadBase(StringConverter::stringFormat("Streaming@#1", stream.getFeID())), - _stream(stream), - _protocol(protocol), - _state(State::Paused), - _signalLock(false), - _clientID(0), - _cseq(0), - _threadDeviceMonitor( - StringConverter::stringFormat("Monitor@#1", stream.getFeID()), - std::bind(&StreamThreadBase::threadExecuteDeviceMonitor, this)), - _writeIndex(0), - _readIndex(0), - _sendInterval(100) { - // Initialize all TS packets - uint32_t ssrc = _stream.getSSRC(); - long timestamp = _stream.getTimestamp(); - for (size_t i = 0; i < MAX_BUF; ++i) { - _tsBuffer[i].initialize(ssrc, timestamp); - } - const std::array nullPacked{0x47, 0x1F, 0xFF}; - _tsEmpty.initialize(ssrc, timestamp); - std::memcpy(_tsEmpty.getWriteBufferPtr(), nullPacked.data(), 188); - _tsEmpty.addAmountOfBytesWritten(188); -} - -StreamThreadBase::~StreamThreadBase() { - _threadDeviceMonitor.terminateThread(); -#ifdef LIBDVBCSA - decrypt::dvbapi::SpClient decrypt = _stream.getDecryptDevice(); - if (decrypt != nullptr) { - decrypt->stopDecrypt(_stream.getFeIndex(), _stream.getFeID()); - } -#endif -} - -// ============================================================================= -// -- base::ThreadBase -------------------------------------------------------- -// ============================================================================= - -void StreamThreadBase::threadEntry() { - StreamClient &client = _stream.getStreamClient(_clientID); - while (running()) { - switch (_state) { - case State::Pause: - _state = State::Paused; - break; - case State::Paused: - // Do nothing here, just wait - std::this_thread::sleep_for(std::chrono::milliseconds(50)); - break; - case State::Running: - readDataFromInputDevice(client); - break; - default: - SI_LOG_PERROR("Wrong State"); - std::this_thread::sleep_for(std::chrono::milliseconds(50)); - break; - } - } -} - -// ============================================================================= -// -- Other member functions -------------------------------------------------- -// ============================================================================= - -bool StreamThreadBase::startStreaming(const int clientID) { - _clientID = clientID; - const FeID id = _stream.getFeID(); - const StreamClient &client = _stream.getStreamClient(clientID); - - if (!_threadDeviceMonitor.startThread()) { - SI_LOG_ERROR("Frontend: @#1, Error Starting device monitor", id); - return false; - } - - doStartStreaming(clientID); - - _cseq = 0x0000; - _writeIndex = 0; - _readIndex = 0; - _tsBuffer[_writeIndex].reset(); - - if (!startThread()) { - SI_LOG_ERROR("Frontend: @#1, Start @#2 Start stream to @#3:@#4 ERROR", id, _protocol, - client.getIPAddressOfStream(), getStreamSocketPort(clientID)); - return false; - } - // Set priority above normal for this Thread - setPriority(Priority::AboveNormal); - - // set begin timestamp - _t1 = std::chrono::steady_clock::now(); - - _state = State::Running; - SI_LOG_INFO("Frontend: @#1, Start @#2 stream to @#3:@#4", id, _protocol, - client.getIPAddressOfStream(), getStreamSocketPort(clientID)); - - return true; -} - -bool StreamThreadBase::pauseStreaming(const int clientID) { - bool paused = true; - // Check if thread is running - if (running()) { - _threadDeviceMonitor.pauseThread(); - doPauseStreaming(clientID); - - _state = State::Pause; - const StreamClient &client = _stream.getStreamClient(clientID); - const double payload = _stream.getRtpPayload() / (1024.0 * 1024.0); - // try waiting on pause - auto timeout = 0; - while (_state != State::Paused) { - std::this_thread::sleep_for(std::chrono::milliseconds(50)); - ++timeout; - if (timeout > 50) { - SI_LOG_ERROR("Frontend: @#1, Pause @#2 stream to @#3:@#4 TIMEOUT (Streamed @#5 MBytes)", - _stream.getFeID(), _protocol, client.getIPAddressOfStream(), - getStreamSocketPort(clientID), payload); - paused = false; - break; - } - } - if (paused) { - SI_LOG_INFO("Frontend: @#1, Pause @#2 stream to @#3:@#4 (Streamed @#5 MBytes)", - _stream.getFeID(), _protocol, client.getIPAddressOfStream(), - getStreamSocketPort(clientID), payload); - } -#ifdef LIBDVBCSA - decrypt::dvbapi::SpClient decrypt = _stream.getDecryptDevice(); - if (decrypt != nullptr) { - decrypt->stopDecrypt(_stream.getFeIndex(), _stream.getFeID()); - } -#endif - } - return paused; -} - -bool StreamThreadBase::restartStreaming(const int clientID) { - // Check if thread is running - if (running()) { - _threadDeviceMonitor.restartThread(); - doRestartStreaming(clientID); - _writeIndex = 0; - _readIndex = 0; - _tsBuffer[_writeIndex].reset(); - _state = State::Running; - SI_LOG_INFO("Frontend: @#1, Restart @#2 stream to @#3:@#4", _stream.getFeID(), - _protocol, _stream.getStreamClient(clientID).getIPAddressOfStream(), - getStreamSocketPort(clientID)); - } - return true; -} - -void StreamThreadBase::readDataFromInputDevice(StreamClient &client) { - const input::SpDevice inputDevice = _stream.getInputDevice(); - - // calculate interval - _t2 = std::chrono::steady_clock::now(); - const unsigned long interval = std::chrono::duration_cast(_t2 - _t1).count(); - const bool intervalExeeded = interval > _sendInterval; - - size_t availableSize = (MAX_BUF - (_writeIndex - _readIndex)); - if (availableSize > MAX_BUF) { - availableSize %= MAX_BUF; - } -// SI_LOG_DEBUG("Frontend: @#1, PacketBuffer MAX @#2 W @#3 R @#4 S @#5", _stream.getFeID(), MAX_BUF, _writeIndex, _readIndex, availableSize); - if (inputDevice->isDataAvailable() && availableSize >= 1) { - if (inputDevice->readTSPackets(_tsBuffer[_writeIndex], intervalExeeded)) { -#ifdef LIBDVBCSA - decrypt::dvbapi::SpClient decrypt = _stream.getDecryptDevice(); - if (decrypt != nullptr) { - decrypt->decrypt(_stream.getFeIndex(), _stream.getFeID(), _tsBuffer[_writeIndex]); - } -#endif - // goto next, so inc write index - ++_writeIndex; - _writeIndex %= MAX_BUF; - // reset next - _tsBuffer[_writeIndex].reset(); - } - } - - const bool readyToSend = _tsBuffer[_readIndex].isReadyToSend(); - if (intervalExeeded || readyToSend) { - _t1 = _t2; - // Send the packet full or not, else send null packet - if (readyToSend) { - if (writeDataToOutputDevice(_tsBuffer[_readIndex], client)) { - // inc read index only when send is successful - ++_readIndex; - _readIndex %= MAX_BUF; - } - } else if (_signalLock) { - writeDataToOutputDevice(_tsEmpty, client); - } - } -} - -bool StreamThreadBase::threadExecuteDeviceMonitor() { - // check do we need to update Device monitor signals - _signalLock = _stream.getInputDevice()->monitorSignal(false); - const unsigned long interval = 200 * _stream.getRtcpSignalUpdateFrequency(); - std::this_thread::sleep_for(std::chrono::milliseconds(interval)); - return true; -} - -} // namespace output diff --git a/src/output/StreamThreadBase.h b/src/output/StreamThreadBase.h deleted file mode 100644 index afc270ca..00000000 --- a/src/output/StreamThreadBase.h +++ /dev/null @@ -1,146 +0,0 @@ -/* StreamThreadBase.h - - Copyright (C) 2014 - 2023 Marc Postema (mpostema09 -at- gmail.com) - - This program is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public License - as published by the Free Software Foundation; either version 2 - of the License, or (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - Or, point your browser to http://www.gnu.org/copyleft/gpl.html -*/ -#ifndef OUTPUT_STREAMTHREADBASE_H_INCLUDE -#define OUTPUT_STREAMTHREADBASE_H_INCLUDE OUTPUT_STREAMTHREADBASE_H_INCLUDE - -#include -#include -#include -#include -#include - -#include -#include - -FW_DECL_NS0(StreamClient); -FW_DECL_NS0(StreamInterface); - -FW_DECL_UP_NS1(output, StreamThreadBase); - -namespace output { - -/// Streaming thread -class StreamThreadBase : - public base::ThreadBase { - // ===================================================================== - // -- Constructors and destructor ------------------------------------- - // ===================================================================== - public: - - StreamThreadBase( - const std::string &protocol, - StreamInterface &stream); - - virtual ~StreamThreadBase(); - - // ===================================================================== - // -- base::ThreadBase ------------------------------------------------ - // ===================================================================== - protected: - - /// @see ThreadBase - virtual void threadEntry() final; - - // ===================================================================== - // -- Other member functions ------------------------------------------ - // ===================================================================== - public: - - /// Start streaming - /// @param clientID specifies which client should start - /// @return true if stream is started else false on error - bool startStreaming(int clientID); - - /// Pause streaming - /// @param clientID specifies which client should pause - /// @return true if stream is paused else false on error - bool pauseStreaming(int clientID); - - /// Restart streaming - /// @param clientID specifies which client should restart - /// @return true if stream is restarted else false on error - bool restartStreaming(int clientID); - - protected: - - /// Send the TS packets to an output device - virtual bool writeDataToOutputDevice( - mpegts::PacketBuffer &UNUSED(buffer), - StreamClient &UNUSED(client)) { return false; }; - - /// Returns the socket port for the specified client - /// @param clientID specifies which client the port id requested - /// @return the socket port for ex. to data send to - virtual int getStreamSocketPort(int UNUSED(clientID)) const { return 0; } - - private: - - /// Specialization for @see startStreaming - virtual void doStartStreaming(int UNUSED(clientID)) {} - - /// Specialization for @see pauseStreaming - virtual void doPauseStreaming(int UNUSED(clientID)) {} - - /// Specialization for @see restartStreaming - virtual void doRestartStreaming(int UNUSED(clientID)) {} - - /// This function will read data from the input device - /// @param client specifies were it should be sended to - void readDataFromInputDevice(StreamClient &client); - - /// Thread execute function @see base::Thread should @return true to - /// keep thread running and @return false will stop and then terminate this thread - bool threadExecuteDeviceMonitor(); - - // ===================================================================== - // -- Data members ----------------------------------------------------- - // ===================================================================== - protected: - - enum class State { - Running, - Pause, - Paused, - }; - - StreamInterface &_stream; - std::string _protocol; - std::atomic _state; - std::atomic_bool _signalLock; - int _clientID; - uint16_t _cseq; - - private: - - base::Thread _threadDeviceMonitor; - - static constexpr size_t MAX_BUF = 100; - mpegts::PacketBuffer _tsBuffer[MAX_BUF]; - mpegts::PacketBuffer _tsEmpty; - size_t _writeIndex; - size_t _readIndex; - unsigned long _sendInterval; - std::chrono::steady_clock::time_point _t1; - std::chrono::steady_clock::time_point _t2; -}; - -} // namespace output - -#endif // OUTPUT_STREAMTHREADBASE_H_INCLUDE diff --git a/src/output/StreamThreadHttp.cpp b/src/output/StreamThreadHttp.cpp deleted file mode 100644 index e04b72bf..00000000 --- a/src/output/StreamThreadHttp.cpp +++ /dev/null @@ -1,96 +0,0 @@ -/* StreamThreadHttp.cpp - - Copyright (C) 2014 - 2023 Marc Postema (mpostema09 -at- gmail.com) - - This program is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public License - as published by the Free Software Foundation; either version 2 - of the License, or (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - Or, point your browser to http://www.gnu.org/copyleft/gpl.html - */ -#include - -#include -#include -#include -#include -#include - -#include -#include - -#include -#include -#include - -namespace output { - -// ========================================================================= -// -- Constructors and destructor ------------------------------------------ -// ========================================================================= - -StreamThreadHttp::StreamThreadHttp( - StreamInterface &stream) : - StreamThreadBase("HTTP", stream) {} - -StreamThreadHttp::~StreamThreadHttp() { - terminateThread(); - const FeID id = _stream.getFeID(); - StreamClient &client = _stream.getStreamClient(_clientID); - SI_LOG_INFO("Frontend: @#1, Destroy @#2 stream to @#3:@#4", id, _protocol, - client.getIPAddressOfStream(), getStreamSocketPort(_clientID)); -} - -// ========================================================================= -// -- output::StreamThreadBase -------------------------------------------- -// ========================================================================= - -void StreamThreadHttp::doStartStreaming(const int clientID) { - const FeID id = _stream.getFeID(); - StreamClient &client = _stream.getStreamClient(clientID); - - // Get default buffer size and set it x times as big - const int bufferSize = client.getHttpNetworkSendBufferSize() * 20; - client.setHttpNetworkSendBufferSize(bufferSize); - SI_LOG_INFO("Frontend: @#1, @#2 set network buffer size: @#3 KBytes", id, - _protocol, bufferSize / 1024); - -// client.setSocketTimeoutInSec(2); -} - -int StreamThreadHttp::getStreamSocketPort(const int clientID) const { - return _stream.getStreamClient(clientID).getHttpSocketPort(); -} - -bool StreamThreadHttp::writeDataToOutputDevice(mpegts::PacketBuffer &buffer, StreamClient &client) { - const long timestamp = base::TimeCounter::getTicks() * 90; - const size_t dataSize = buffer.getCurrentBufferSize(); - - // RTP packet octet count (Bytes) - _stream.addRtpData(dataSize, timestamp); - - iovec iov[1]; - iov[0].iov_base = buffer.getTSReadBufferPtr(); - iov[0].iov_len = dataSize; - - // send the HTTP packet - if (!client.writeHttpData(iov, 1)) { - if (!client.isSelfDestructing()) { - SI_LOG_ERROR("Frontend: @#1, Error sending HTTP Stream Data to @#2", _stream.getFeID(), - client.getIPAddressOfStream()); - client.selfDestruct(); - } - } - return true; -} - -} // namespace output diff --git a/src/output/StreamThreadHttp.h b/src/output/StreamThreadHttp.h deleted file mode 100644 index e9192863..00000000 --- a/src/output/StreamThreadHttp.h +++ /dev/null @@ -1,71 +0,0 @@ -/* StreamThreadHttp.h - - Copyright (C) 2014 - 2023 Marc Postema (mpostema09 -at- gmail.com) - - This program is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public License - as published by the Free Software Foundation; either version 2 - of the License, or (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - Or, point your browser to http://www.gnu.org/copyleft/gpl.html -*/ -#ifndef OUTPUT_STREAMTHREADHTTP_H_INCLUDE -#define OUTPUT_STREAMTHREADHTTP_H_INCLUDE OUTPUT_STREAMTHREADHTTP_H_INCLUDE - -#include -#include - -FW_DECL_NS0(StreamClient); -FW_DECL_NS0(StreamInterface); - -FW_DECL_UP_NS1(output, StreamThreadHttp); - -namespace output { - -/// HTTP Streaming thread -class StreamThreadHttp : - public StreamThreadBase { - // ===================================================================== - // -- Constructors and destructor -------------------------------------- - // ===================================================================== - public: - explicit StreamThreadHttp(StreamInterface &stream); - - virtual ~StreamThreadHttp(); - - // ===================================================================== - // -- output::StreamThreadBase ---------------------------------------- - // ===================================================================== - protected: - - /// @see StreamThreadBase - virtual bool writeDataToOutputDevice( - mpegts::PacketBuffer &buffer, - StreamClient &client) final; - - /// @see StreamThreadBase - virtual int getStreamSocketPort(int clientID) const final; - - private: - - /// @see StreamThreadBase - virtual void doStartStreaming(int clientID) final; - - // ===================================================================== - // -- Data members ----------------------------------------------------- - // ===================================================================== - private: - -}; - -} // namespace output - -#endif // STREAMTHREADHTTP_H_INCLUDE diff --git a/src/output/StreamThreadRtcp.cpp b/src/output/StreamThreadRtcp.cpp deleted file mode 100644 index 05f3cde9..00000000 --- a/src/output/StreamThreadRtcp.cpp +++ /dev/null @@ -1,84 +0,0 @@ -/* StreamThreadRtcp.cpp - - Copyright (C) 2014 - 2023 Marc Postema (mpostema09 -at- gmail.com) - - This program is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public License - as published by the Free Software Foundation; either version 2 - of the License, or (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - Or, point your browser to http://www.gnu.org/copyleft/gpl.html -*/ -#include - -#include -#include -#include - -#include - -#include - -namespace output { - -// ========================================================================= -// -- Constructors and destructor ------------------------------------------ -// ========================================================================= - -StreamThreadRtcp::StreamThreadRtcp(StreamInterface &stream) : - StreamThreadRtcpBase("RTCP/UDP", stream) {} - -StreamThreadRtcp::~StreamThreadRtcp() { - _thread.terminateThread(); - const FeID id = _stream.getFeID(); - const StreamClient &client = _stream.getStreamClient(_clientID); - SI_LOG_INFO("Frontend: @#1, Destroy @#2 stream to @#3:@#4", id, - _protocol, client.getIPAddressOfStream(), getStreamSocketPort(_clientID)); - - _stream.getStreamClient(_clientID).getRtcpSocketAttr().closeFD(); -} - -// ============================================================================= -// -- output::StreamThreadRtcpBase -------------------------------------------- -// ============================================================================= - -void StreamThreadRtcp::doStartStreaming(int clientID) { - SocketAttr &rtcp = _stream.getStreamClient(clientID).getRtcpSocketAttr(); - - if (!rtcp.setupSocketHandle(SOCK_DGRAM, IPPROTO_UDP)) { - SI_LOG_ERROR("Frontend: @#1, Get RTCP handle failed", _stream.getFeID()); - } -} - -int StreamThreadRtcp::getStreamSocketPort(const int clientID) const { - return _stream.getStreamClient(clientID).getRtcpSocketAttr().getSocketPort(); -} - -void StreamThreadRtcp::doSendDataToClient(const int clientID, - const PacketPtr& sr, const int srlen, - const PacketPtr& sdes, const int sdeslen, - const PacketPtr& app, const int applen) { - StreamClient &client = _stream.getStreamClient(clientID); - - const int len = srlen + sdeslen + applen; - PacketPtr data(new uint8_t[len]); - std::memcpy(data.get(), sr.get(), srlen); - std::memcpy(data.get() + srlen, sdes.get(), sdeslen); - std::memcpy(data.get() + srlen + sdeslen, app.get(), applen); - - // send the RTCP/UDP packet - if (!client.getRtcpSocketAttr().sendDataTo(data.get(), len, 0)) { - SI_LOG_ERROR("Frontend: @#1, Error sending @#2 data to @#3:@#4", _stream.getFeID(), - _protocol, client.getIPAddressOfStream(), getStreamSocketPort(clientID)); - } -} - -} diff --git a/src/output/StreamThreadRtcp.h b/src/output/StreamThreadRtcp.h deleted file mode 100644 index 6e663acf..00000000 --- a/src/output/StreamThreadRtcp.h +++ /dev/null @@ -1,65 +0,0 @@ -/* StreamThreadRtcp.h - - Copyright (C) 2014 - 2023 Marc Postema (mpostema09 -at- gmail.com) - - This program is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public License - as published by the Free Software Foundation; either version 2 - of the License, or (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - Or, point your browser to http://www.gnu.org/copyleft/gpl.html -*/ -#ifndef OUTPUT_STREAMTHREADRTCP_H_INCLUDE -#define OUTPUT_STREAMTHREADRTCP_H_INCLUDE OUTPUT_STREAMTHREADRTCP_H_INCLUDE - -#include -#include - -FW_DECL_NS0(StreamInterface); - -namespace output { - -/// RTCP Server over UDP -class StreamThreadRtcp : - public StreamThreadRtcpBase { - // ===================================================================== - // -- Constructors and destructor ------------------------------------- - // ===================================================================== - public: - - StreamThreadRtcp(StreamInterface &stream); - - virtual ~StreamThreadRtcp(); - - // ===================================================================== - // -- output::StreamThreadRtcpBase ------------------------------------ - // ===================================================================== - protected: - - /// @see StreamThreadRtcpBase - virtual int getStreamSocketPort(int clientID) const final; - - private: - - /// @see StreamThreadRtcpBase - virtual void doStartStreaming(int clientID) final; - - /// @see StreamThreadRtcpBase - virtual void doSendDataToClient(int clientID, - const PacketPtr& sr, int srlen, - const PacketPtr& sdes, int sdeslen, - const PacketPtr& app, int applen) final; - -}; - -} - -#endif // OUTPUT_STREAMTHREADRTCP_H_INCLUDE diff --git a/src/output/StreamThreadRtcpBase.cpp b/src/output/StreamThreadRtcpBase.cpp deleted file mode 100644 index 58b91907..00000000 --- a/src/output/StreamThreadRtcpBase.cpp +++ /dev/null @@ -1,237 +0,0 @@ -/* StreamThreadRtcpBase.cpp - - Copyright (C) 2014 - 2023 Marc Postema (mpostema09 -at- gmail.com) - - This program is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public License - as published by the Free Software Foundation; either version 2 - of the License, or (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - Or, point your browser to http://www.gnu.org/copyleft/gpl.html -*/ -#include - -#include -#include -#include - -#include -#include - -namespace output { - -// ============================================================================= -// -- Constructors and destructor ---------------------------------------------- -// ============================================================================= - -StreamThreadRtcpBase::StreamThreadRtcpBase( - const std::string &protocol, - StreamInterface &stream) : - _clientID(0), - _protocol(protocol), - _stream(stream), - _thread( - "RtcpThread", - std::bind(&StreamThreadRtcpBase::threadExecuteFunction, this)) {} - -StreamThreadRtcpBase::~StreamThreadRtcpBase() {} - -// ========================================================================= -// -- Other member functions ---------------------------------------------- -// ========================================================================= - -bool StreamThreadRtcpBase::startStreaming(const int clientID) { - - doStartStreaming(clientID); - - const StreamClient &client = _stream.getStreamClient(clientID); - - if (!_thread.startThread()) { - SI_LOG_ERROR("Frontend: @#1, Start @#2 stream to @#3:@#4 ERROR", _stream.getFeID(), - _protocol, client.getIPAddressOfStream(), getStreamSocketPort(clientID)); - return false; - } - SI_LOG_INFO("Frontend: @#1, Start @#2 stream to @#3:@#4", _stream.getFeID(), - _protocol, client.getIPAddressOfStream(), getStreamSocketPort(clientID)); - - return true; -} - -bool StreamThreadRtcpBase::pauseStreaming(const int clientID) { - _thread.pauseThread(); - - doPauseStreaming(clientID); - - const StreamClient &client = _stream.getStreamClient(clientID); - SI_LOG_INFO("Frontend: @#1, Pause @#2 stream to @#3:@#4", _stream.getFeID(), - _protocol, client.getIPAddressOfStream(), getStreamSocketPort(clientID)); - return true; -} - -bool StreamThreadRtcpBase::restartStreaming(const int clientID) { - _thread.restartThread(); - - doRestartStreaming(clientID); - - const StreamClient &client = _stream.getStreamClient(clientID); - SI_LOG_INFO("Frontend: @#1, Restart @#2 stream to @#3:@#4", _stream.getFeID(), - _protocol, client.getIPAddressOfStream(), getStreamSocketPort(clientID)); - return true; -} - -bool StreamThreadRtcpBase::threadExecuteFunction() { - // RTCP compound packets must start with a SR, SDES then APP - try { - const auto [sr, srlen] = getSR(); - const auto [sdes, sdeslen] = getSDES(); - const auto [app, applen] = getAPP(); - - doSendDataToClient(_clientID, sr, srlen, sdes, sdeslen, app, applen); - } catch (const std::bad_alloc& e) { - const StreamClient &client = _stream.getStreamClient(_clientID); - SI_LOG_ERROR("Frontend: @#1, Error (@#2) sending @#3 data to @#4:@#5", _stream.getFeID(), - _protocol, e.what(), client.getIPAddressOfStream(), getStreamSocketPort(_clientID)); - std::this_thread::sleep_for(std::chrono::milliseconds(200)); - } - const unsigned long interval = 200 * _stream.getRtcpSignalUpdateFrequency(); - std::this_thread::sleep_for(std::chrono::milliseconds(interval)); - return true; -} - -std::pair StreamThreadRtcpBase::getAPP() { - const uint32_t ssrc = _stream.getSSRC(); - const std::string desc = _stream.attributeDescribeString(); - - // total length and align on 32 bits - int len = 16 + desc.size(); - if ((len % 4) != 0) { - len += 4 - (len % 4); - } - // Application Defined packet (APP Packet) - // Alloc and copy data and adjust length - PacketPtr app(new uint8_t[len]); - app[0] = 0x80; // version: 2, padding: 0, subtype: 0 - app[1] = 204; // payload type: 204 (0xcc) (APP) - app[2] = 0; // length (total in 32-bit words minus one) - app[3] = 0; // length (total in 32-bit words minus one) - app[4] = (ssrc >> 24) & 0xff; // synchronization source - app[5] = (ssrc >> 16) & 0xff; // synchronization source - app[6] = (ssrc >> 8) & 0xff; // synchronization source - app[7] = (ssrc >> 0) & 0xff; // synchronization source - app[8] = 'S'; // name - app[9] = 'E'; // name - app[10] = 'S'; // name - app[11] = '1'; // name - app[12] = 0; // identifier (0000) - app[13] = 0; // identifier - app[14] = 0; // string length - app[15] = 0; // string length - // here the App defined data is added - - // Alloc and copy data and adjust length - std::memcpy(app.get() + 16, desc.data(), desc.size()); - const int ws = (len / 4) - 1; - app[2] = (ws >> 8) & 0xff; - app[3] = (ws >> 0) & 0xff; - const int ss = desc.size(); - app[14] = (ss >> 8) & 0xff; - app[15] = (ss >> 0) & 0xff; - return {std::move(app), len}; -} - -std::pair StreamThreadRtcpBase::getSR() { - const long timestamp = _stream.getTimestamp(); - const uint32_t ssrc = _stream.getSSRC(); - const uint32_t spc = _stream.getSPC(); - const uint32_t soc = _stream.getSOC(); - - // Sender Report (SR Packet) - int len = 28; - PacketPtr sr(new uint8_t[len]); - sr[0] = 0x80; // version: 2, padding: 0, sr blocks: 0 - sr[1] = 200; // payload type: 200 (0xc8) (SR) - sr[2] = 0; // length (total in 32-bit words minus one) - sr[3] = 0; // length (total in 32-bit words minus one) - sr[4] = (ssrc >> 24) & 0xff; // synchronization source - sr[5] = (ssrc >> 16) & 0xff; // synchronization source - sr[6] = (ssrc >> 8) & 0xff; // synchronization source - sr[7] = (ssrc >> 0) & 0xff; // synchronization source - - const std::time_t ntp = std::time(nullptr); - // NTP integer part - sr[8] = (ntp >> 24) & 0xff; // NTP most sign word - sr[9] = (ntp >> 16) & 0xff; // NTP most sign word - sr[10] = (ntp >> 8) & 0xff; // NTP most sign word - sr[11] = (ntp >> 0) & 0xff; // NTP most sign word - // NTP fractional part - sr[12] = 0; // NTP least sign word - sr[13] = 0; // NTP least sign word - sr[14] = 0; // NTP least sign word - sr[15] = 0; // NTP least sign word - - sr[16] = (timestamp >> 24) & 0xff; // RTP timestamp RTS - sr[17] = (timestamp >> 16) & 0xff; // RTP timestamp RTS - sr[18] = (timestamp >> 8) & 0xff; // RTP timestamp RTS - sr[19] = (timestamp >> 0) & 0xff; // RTP timestamp RTS - sr[20] = (spc >> 24) & 0xff; // sender's packet count SPC - sr[21] = (spc >> 16) & 0xff; // sender's packet count SPC - sr[22] = (spc >> 8) & 0xff; // sender's packet count SPC - sr[23] = (spc >> 0) & 0xff; // sender's packet count SPC - sr[24] = (soc >> 24) & 0xff; // sender's octet count SOC - sr[25] = (soc >> 16) & 0xff; // sender's octet count SOC - sr[26] = (soc >> 8) & 0xff; // sender's octet count SOC - sr[27] = (soc >> 0) & 0xff; // sender's octet count SOC - - // Alloc and copy data and adjust length - const int ws = (len / 4) - 1; - sr[2] = (ws >> 8) & 0xff; - sr[3] = (ws >> 0) & 0xff; - return {std::move(sr), len}; -} - -std::pair StreamThreadRtcpBase::getSDES() { - const uint32_t ssrc = _stream.getSSRC(); - - // Source Description (SDES Packet) - int len = 20; - PacketPtr sdes(new uint8_t[len]); - sdes[0] = 0x81; // version: 2, padding: 0, sc blocks: 1 - sdes[1] = 202; // payload type: 202 (0xca) (SDES) - sdes[2] = 0; // length (total in 32-bit words minus one) - sdes[3] = 3; // length (total in 32-bit words minus one) - - sdes[4] = (ssrc >> 24) & 0xff; // synchronization source - sdes[5] = (ssrc >> 16) & 0xff; // synchronization source - sdes[6] = (ssrc >> 8) & 0xff; // synchronization source - sdes[7] = (ssrc >> 0) & 0xff; // synchronization source - - sdes[8] = 1; // CNAME: 1 - sdes[9] = 6; // length: 6 - sdes[10] = 'S'; // data - sdes[11] = 'a'; // data - - sdes[12] = 't'; // data - sdes[13] = 'P'; // data - sdes[14] = 'I'; // data - sdes[15] = 0; // data - - sdes[16] = 0; // data - sdes[17] = 0; // data - sdes[18] = 0; // data - sdes[19] = 0; // data - - const int ws = (len / 4) - 1; - sdes[2] = (ws >> 8) & 0xff; - sdes[3] = (ws >> 0) & 0xff; - return {std::move(sdes), len}; -} - -} diff --git a/src/output/StreamThreadRtcpBase.h b/src/output/StreamThreadRtcpBase.h deleted file mode 100644 index 6ecaa3b1..00000000 --- a/src/output/StreamThreadRtcpBase.h +++ /dev/null @@ -1,117 +0,0 @@ -/* StreamThreadRtcpBase.h - - Copyright (C) 2014 - 2023 Marc Postema (mpostema09 -at- gmail.com) - - This program is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public License - as published by the Free Software Foundation; either version 2 - of the License, or (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - Or, point your browser to http://www.gnu.org/copyleft/gpl.html -*/ -#ifndef OUTPUT_STREAMTHREADRTCPBASE_H_INCLUDE -#define OUTPUT_STREAMTHREADRTCPBASE_H_INCLUDE OUTPUT_STREAMTHREADRTCPBASE_H_INCLUDE - -#include -#include -#include - -#include -#include -#include - -FW_DECL_NS0(StreamInterface); - -namespace output { - -using PacketPtr = std::unique_ptr; - -/// The base class for RTCP Server -class StreamThreadRtcpBase { - - // ===================================================================== - // -- Constructors and destructor ------------------------------------- - // ===================================================================== - public: - - StreamThreadRtcpBase( - const std::string &protocol, - StreamInterface &stream); - - virtual ~StreamThreadRtcpBase(); - - // ===================================================================== - // -- Other member functions ------------------------------------------ - // ===================================================================== - public: - - /// Start streaming - /// @param clientID specifies which client should start - /// @return true if stream is started else false on error - bool startStreaming(int clientID); - - /// Pause streaming - /// @param clientID specifies which client should pause - /// @return true if stream is paused else false on error - bool pauseStreaming(int clientID); - - /// Restart streaming - /// @param clientID specifies which client should restart - /// @return true if stream is restarted else false on error - bool restartStreaming(int clientID); - - protected: - - /// Thread execute function @see base::Thread should @return true to - /// keep thread running a @return false will stop and then terminate this thread - bool threadExecuteFunction(); - - /// Returns the socket port for the specified client - /// @param clientID specifies which client the port id requested - /// @return the socket port for ex. to data send to - virtual int getStreamSocketPort(int UNUSED(clientID)) const { return 0; } - - private: - - /// Specialization for @see startStreaming - virtual void doStartStreaming(int UNUSED(clientID)) {} - - /// Specialization for @see pauseStreaming - virtual void doPauseStreaming(int UNUSED(clientID)) {} - - /// Specialization for @see restartStreaming - virtual void doRestartStreaming(int UNUSED(clientID)) {} - - /// Specialization for @see threadExecuteFunction to send data to client - virtual void doSendDataToClient(int UNUSED(clientID), - const PacketPtr& UNUSED(sr), int UNUSED(srlen), - const PacketPtr& UNUSED(sdes), int UNUSED(sdeslen), - const PacketPtr& UNUSED(app), int UNUSED(applen)) {} - - /// - std::pair getAPP(); - std::pair getSDES(); - std::pair getSR(); - - // ===================================================================== - // -- Data members ---------------------------------------------------- - // ===================================================================== - protected: - - int _clientID; - std::string _protocol; - StreamInterface &_stream; - base::Thread _thread; -}; - -} - -#endif // OUTPUT_STREAMTHREADRTCPBASE_H_INCLUDE diff --git a/src/output/StreamThreadRtcpTcp.cpp b/src/output/StreamThreadRtcpTcp.cpp deleted file mode 100644 index 5e9a20a7..00000000 --- a/src/output/StreamThreadRtcpTcp.cpp +++ /dev/null @@ -1,84 +0,0 @@ -/* StreamThreadRtcpTcp.cpp - - Copyright (C) 2014 - 2023 Marc Postema (mpostema09 -at- gmail.com) - - This program is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public License - as published by the Free Software Foundation; either version 2 - of the License, or (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - Or, point your browser to http://www.gnu.org/copyleft/gpl.html -*/ -#include - -#include -#include -#include - -#include - -namespace output { - -// ============================================================================= -// -- Constructors and destructor ---------------------------------------------- -// ============================================================================= - -StreamThreadRtcpTcp::StreamThreadRtcpTcp(StreamInterface &stream) : - StreamThreadRtcpBase("RTCP/TCP", stream) {} - -StreamThreadRtcpTcp::~StreamThreadRtcpTcp() { - _thread.terminateThread(); - const FeID id = _stream.getFeID(); - const StreamClient &client = _stream.getStreamClient(_clientID); - SI_LOG_INFO("Frontend: @#1, Destroy @#2 stream to @#3:@#4", id, - _protocol, client.getIPAddressOfStream(), client.getHttpSocketPort()); -} - -// ============================================================================= -// -- output::StreamThreadRtcpBase -------------------------------------------- -// ============================================================================= - -int StreamThreadRtcpTcp::getStreamSocketPort(const int clientID) const { - return _stream.getStreamClient(clientID).getHttpSocketPort(); -} - -void StreamThreadRtcpTcp::doSendDataToClient(const int clientID, - const PacketPtr& sr, const int srlen, - const PacketPtr& sdes, const int sdeslen, - const PacketPtr& app, const int applen) { - StreamClient &client = _stream.getStreamClient(clientID); - - const int len = srlen + sdeslen + applen; - - unsigned char header[4]; - header[0] = 0x24; - header[1] = 0x01; - header[2] = (len >> 8) & 0xFF; - header[3] = (len >> 0) & 0xFF; - - iovec iov[4]; - iov[0].iov_base = header; - iov[0].iov_len = 4; - iov[1].iov_base = sr.get(); - iov[1].iov_len = srlen; - iov[2].iov_base = sdes.get(); - iov[2].iov_len = sdeslen; - iov[3].iov_base = app.get(); - iov[3].iov_len = applen; - - // send the RTCP/TCP packet - if (!client.writeHttpData(iov, 4)) { - SI_LOG_ERROR("Frontend: @#1, Error sending @#2 Stream Data to @#3", - _stream.getFeID(), _protocol, client.getIPAddressOfStream()); - } -} - -} diff --git a/src/output/StreamThreadRtcpTcp.h b/src/output/StreamThreadRtcpTcp.h deleted file mode 100644 index f5193fac..00000000 --- a/src/output/StreamThreadRtcpTcp.h +++ /dev/null @@ -1,62 +0,0 @@ -/* StreamThreadRtcpTcp.h - - Copyright (C) 2014 - 2023 Marc Postema (mpostema09 -at- gmail.com) - - This program is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public License - as published by the Free Software Foundation; either version 2 - of the License, or (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - Or, point your browser to http://www.gnu.org/copyleft/gpl.html -*/ -#ifndef OUTPUT_STREAMTHREADRTCP_TCP_H_INCLUDE -#define OUTPUT_STREAMTHREADRTCP_TCP_H_INCLUDE OUTPUT_STREAMTHREADRTCP_TCP_H_INCLUDE - -#include -#include - -FW_DECL_NS0(StreamInterface); - -namespace output { - -/// RTCP Server over TCP -class StreamThreadRtcpTcp : - public StreamThreadRtcpBase { - // ===================================================================== - // -- Constructors and destructor ------------------------------------- - // ===================================================================== - public: - - StreamThreadRtcpTcp(StreamInterface &stream); - - virtual ~StreamThreadRtcpTcp(); - - // ===================================================================== - // -- output::StreamThreadRtcpBase ------------------------------------ - // ===================================================================== - protected: - - /// @see StreamThreadRtcpBase - virtual int getStreamSocketPort(int clientID) const final; - - private: - - /// @see StreamThreadRtcpBase - virtual void doSendDataToClient(int clientID, - const PacketPtr& sr, int srlen, - const PacketPtr& sdes, int sdeslen, - const PacketPtr& app, int applen) final; - -}; - -} - -#endif // OUTPUT_STREAMTHREADRTCP_TCP_H_INCLUDE diff --git a/src/output/StreamThreadRtp.cpp b/src/output/StreamThreadRtp.cpp deleted file mode 100644 index 541c7149..00000000 --- a/src/output/StreamThreadRtp.cpp +++ /dev/null @@ -1,111 +0,0 @@ -/* StreamThreadRtp.cpp - - Copyright (C) 2014 - 2023 Marc Postema (mpostema09 -at- gmail.com) - - This program is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public License - as published by the Free Software Foundation; either version 2 - of the License, or (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - Or, point your browser to http://www.gnu.org/copyleft/gpl.html - */ -#include - -#include -#include -#include -#include -#include - -#include - -namespace output { - -// ============================================================================= -// -- Constructors and destructor ---------------------------------------------- -// ============================================================================= - -StreamThreadRtp::StreamThreadRtp(StreamInterface &stream) : - StreamThreadBase("RTP/UDP", stream), - _rtcp(stream) {} - -StreamThreadRtp::~StreamThreadRtp() { - terminateThread(); - const FeID id = _stream.getFeID(); - StreamClient &client = _stream.getStreamClient(_clientID); - SI_LOG_INFO("Frontend: @#1, Destroy @#2 stream to @#3:@#4", id, _protocol, - client.getIPAddressOfStream(), getStreamSocketPort(_clientID)); - client.getRtpSocketAttr().closeFD(); -} - -// ============================================================================= -// -- output::StreamThreadBase ------------------------------------------------ -// ============================================================================= - -void StreamThreadRtp::doStartStreaming(const int clientID) { - const FeID id = _stream.getFeID(); - SocketAttr &rtp = _stream.getStreamClient(clientID).getRtpSocketAttr(); - - // RTP - if (!rtp.setupSocketHandle(SOCK_DGRAM, IPPROTO_UDP)) { - SI_LOG_ERROR("Frontend: @#1, Get RTP handle failed", id); - } - - // Get default buffer size and set it x times as big - const int bufferSize = rtp.getNetworkSendBufferSize() * 20; - rtp.setNetworkSendBufferSize(bufferSize); - SI_LOG_INFO("Frontend: @#1, @#2 set network buffer size: @#3 KBytes", id, - _protocol, bufferSize / 1024); - - // RTCP - _rtcp.startStreaming(clientID); -} - -void StreamThreadRtp::doPauseStreaming(const int clientID) { - // RTCP - _rtcp.pauseStreaming(clientID); -} - -void StreamThreadRtp::doRestartStreaming(const int clientID) { - // RTCP - _rtcp.restartStreaming(clientID); -} - -int StreamThreadRtp::getStreamSocketPort(const int clientID) const { - return _stream.getStreamClient(clientID).getRtpSocketAttr().getSocketPort(); -} - -bool StreamThreadRtp::writeDataToOutputDevice(mpegts::PacketBuffer &buffer, StreamClient &client) { - // update sequence number and timestamp - const long timestamp = base::TimeCounter::getTicks() * 90; - ++_cseq; - buffer.tagRTPHeaderWith(_cseq, timestamp); - - const size_t dataSize = buffer.getCurrentBufferSize(); - const size_t len = dataSize + mpegts::PacketBuffer::RTP_HEADER_LEN; - - // RTP packet octet count (Bytes) - _stream.addRtpData(dataSize, timestamp); - - // send the RTP/UDP packet - const unsigned char *rtpBuffer = buffer.getReadBufferPtr(); - SocketAttr &rtp = client.getRtpSocketAttr(); - if (!rtp.sendDataTo(rtpBuffer, len, MSG_DONTWAIT)) { - if (!client.isSelfDestructing()) { - SI_LOG_ERROR("Frontend: @#1, Error sending RTP/UDP data to @#2:@#3", - _stream.getFeID(), rtp.getIPAddressOfSocket(), rtp.getSocketPort()); - client.selfDestruct(); - } - } - return true; -} - -} // namespace output diff --git a/src/output/StreamThreadRtp.h b/src/output/StreamThreadRtp.h deleted file mode 100644 index 47b66e01..00000000 --- a/src/output/StreamThreadRtp.h +++ /dev/null @@ -1,82 +0,0 @@ -/* StreamThreadRtp.h - - Copyright (C) 2014 - 2023 Marc Postema (mpostema09 -at- gmail.com) - - This program is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public License - as published by the Free Software Foundation; either version 2 - of the License, or (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - Or, point your browser to http://www.gnu.org/copyleft/gpl.html -*/ -#ifndef OUTPUT_STREAMTHREADRTP_H_INCLUDE -#define OUTPUT_STREAMTHREADRTP_H_INCLUDE OUTPUT_STREAMTHREADRTP_H_INCLUDE - -#include -#include -#include - -FW_DECL_NS0(StreamClient); -FW_DECL_NS0(StreamInterface); - -FW_DECL_UP_NS1(output, StreamThreadRtp); - -namespace output { - -/// RTP Streaming thread -class StreamThreadRtp : - public StreamThreadBase { - - // ===================================================================== - // -- Constructors and destructor ------------------------------------- - // ===================================================================== - public: - - explicit StreamThreadRtp(StreamInterface &stream); - - virtual ~StreamThreadRtp(); - - // ===================================================================== - // -- output::StreamThreadBase ---------------------------------------- - // ===================================================================== - protected: - - /// @see StreamThreadBase - virtual bool writeDataToOutputDevice( - mpegts::PacketBuffer &buffer, - StreamClient &client) final; - - /// @see StreamThreadBase - virtual int getStreamSocketPort(int clientID) const final; - - private: - - /// @see StreamThreadBase - virtual void doStartStreaming(int clientID) final; - - /// @see StreamThreadBase - virtual void doPauseStreaming(int clientID) final; - - /// @see StreamThreadBase - virtual void doRestartStreaming(int clientID) final; - - // ===================================================================== - // -- Data members ----------------------------------------------------- - // ===================================================================== - private: - - StreamThreadRtcp _rtcp; - -}; - -} // namespace output - -#endif // OUTPUT_STREAMTHREADRTP_H_INCLUDE diff --git a/src/output/StreamThreadRtpTcp.cpp b/src/output/StreamThreadRtpTcp.cpp deleted file mode 100644 index 6aa6d0ad..00000000 --- a/src/output/StreamThreadRtpTcp.cpp +++ /dev/null @@ -1,118 +0,0 @@ -/* StreamThreadRtpTcp.cpp - - Copyright (C) 2014 - 2023 Marc Postema (mpostema09 -at- gmail.com) - - This program is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public License - as published by the Free Software Foundation; either version 2 - of the License, or (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - Or, point your browser to http://www.gnu.org/copyleft/gpl.html - */ -#include - -#include -#include -#include -#include -#include - -#include -#include -#include - -namespace output { - -// ============================================================================= -// -- Constructors and destructor ---------------------------------------------- -// ============================================================================= - -StreamThreadRtpTcp::StreamThreadRtpTcp(StreamInterface &stream) : - StreamThreadBase("RTP/TCP", stream), - _rtcp(stream) { -} - -StreamThreadRtpTcp::~StreamThreadRtpTcp() { - terminateThread(); - const FeID id = _stream.getFeID(); - StreamClient &client = _stream.getStreamClient(_clientID); - SI_LOG_INFO("Frontend: @#1, Destroy @#2 stream to @#3:@#4", id, _protocol, - client.getIPAddressOfStream(), getStreamSocketPort(_clientID)); -} - -// ============================================================================= -// -- output::StreamThreadBase ------------------------------------------------ -// ============================================================================= - -void StreamThreadRtpTcp::doStartStreaming(const int clientID) { - const FeID id = _stream.getFeID(); - StreamClient &client = _stream.getStreamClient(clientID); - - // Get default buffer size and set it x times as big - const int bufferSize = client.getHttpNetworkSendBufferSize() * 20; - client.setHttpNetworkSendBufferSize(bufferSize); - SI_LOG_INFO("Frontend: @#1, @#2 set network buffer size: @#3 KBytes", - id, _protocol, bufferSize / 1024); - - // RTCP/TCP - _rtcp.startStreaming(clientID); -} - -void StreamThreadRtpTcp::doPauseStreaming(const int clientID) { - // RTCP/TCP - _rtcp.pauseStreaming(clientID); -} - -void StreamThreadRtpTcp::doRestartStreaming(const int clientID) { - // RTCP/TCP - _rtcp.restartStreaming(clientID); -} - -int StreamThreadRtpTcp::getStreamSocketPort(const int clientID) const { - return _stream.getStreamClient(clientID).getHttpSocketPort(); -} - -bool StreamThreadRtpTcp::writeDataToOutputDevice(mpegts::PacketBuffer &buffer, StreamClient &client) { - // update sequence number and timestamp - const long timestamp = base::TimeCounter::getTicks() * 90; - ++_cseq; - buffer.tagRTPHeaderWith(_cseq, timestamp); - - const size_t dataSize = buffer.getCurrentBufferSize(); - const size_t len = dataSize + mpegts::PacketBuffer::RTP_HEADER_LEN; - - // RTP packet octet count (Bytes) - _stream.addRtpData(dataSize, timestamp); - - unsigned char header[4]; - header[0] = 0x24; - header[1] = 0x00; - header[2] = (len >> 8) & 0xFF; - header[3] = (len >> 0) & 0xFF; - - iovec iov[2]; - iov[0].iov_base = header; - iov[0].iov_len = 4; - iov[1].iov_base = buffer.getReadBufferPtr(); - iov[1].iov_len = len; - - // send the RTP/TCP packet - if (!client.writeHttpData(iov, 2)) { - if (!client.isSelfDestructing()) { - SI_LOG_ERROR("Frontend: @#1, Error sending RTP/TCP Stream Data to @#2", - _stream.getFeID(), client.getIPAddressOfStream()); - client.selfDestruct(); - } - } - return true; -} - -} // namespace output diff --git a/src/output/StreamThreadRtpTcp.h b/src/output/StreamThreadRtpTcp.h deleted file mode 100644 index ac09ecc8..00000000 --- a/src/output/StreamThreadRtpTcp.h +++ /dev/null @@ -1,80 +0,0 @@ -/* StreamThreadRtpTcp.h - - Copyright (C) 2014 - 2023 Marc Postema (mpostema09 -at- gmail.com) - - This program is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public License - as published by the Free Software Foundation; either version 2 - of the License, or (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - Or, point your browser to http://www.gnu.org/copyleft/gpl.html -*/ -#ifndef OUTPUT_STREAMTHREADRTPTCP_H_INCLUDE -#define OUTPUT_STREAMTHREADRTPTCP_H_INCLUDE OUTPUT_STREAMTHREADRTPTCP_H_INCLUDE - -#include -#include -#include - -FW_DECL_NS0(StreamClient); -FW_DECL_NS0(StreamInterface); - -FW_DECL_UP_NS1(output, StreamThreadRtpTcp); - -namespace output { - -/// RTP over TCP Streaming thread -class StreamThreadRtpTcp : - public StreamThreadBase { - // ===================================================================== - // -- Constructors and destructor ------------------------------------- - // ===================================================================== - public: - - explicit StreamThreadRtpTcp(StreamInterface &stream); - - virtual ~StreamThreadRtpTcp(); - - // ===================================================================== - // -- output::StreamThreadBase ---------------------------------------- - // ===================================================================== - protected: - - /// @see StreamThreadBase - virtual bool writeDataToOutputDevice( - mpegts::PacketBuffer &buffer, - StreamClient &client) final; - - /// @see StreamThreadBase - virtual int getStreamSocketPort(int clientID) const final; - - private: - - /// @see StreamThreadBase - virtual void doStartStreaming(int clientID) final; - - /// @see StreamThreadBase - virtual void doPauseStreaming(int clientID) final; - - /// @see StreamThreadBase - virtual void doRestartStreaming(int clientID) final; - - // ===================================================================== - // -- Data members ----------------------------------------------------- - // ===================================================================== - private: - - StreamThreadRtcpTcp _rtcp; -}; - -} // namespace output - -#endif // OUTPUT_STREAMTHREADRTPTCP_H_INCLUDE diff --git a/src/output/StreamThreadTSWriter.cpp b/src/output/StreamThreadTSWriter.cpp deleted file mode 100644 index f66e037a..00000000 --- a/src/output/StreamThreadTSWriter.cpp +++ /dev/null @@ -1,72 +0,0 @@ -/* StreamThreadTSWriter.cpp - - Copyright (C) 2014 - 2023 Marc Postema (mpostema09 -at- gmail.com) - - This program is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public License - as published by the Free Software Foundation; either version 2 - of the License, or (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - Or, point your browser to http://www.gnu.org/copyleft/gpl.html - */ -#include - -#include -#include -#include -#include -#include -#include - -#include -#include - -namespace output { - -// ============================================================================= -// -- Constructors and destructor ---------------------------------------------- -// ============================================================================= - -StreamThreadTSWriter::StreamThreadTSWriter( - StreamInterface &stream, - const std::string &file) : - StreamThreadBase("TSWRITER", stream), - _filePath(file) {} - -StreamThreadTSWriter::~StreamThreadTSWriter() { - terminateThread(); -} - -// ============================================================================= -// -- output::StreamThreadBase ------------------------------------------------ -// ============================================================================= - -void StreamThreadTSWriter::doStartStreaming(int UNUSED(clientID)) { - _file.open(_filePath, std::ofstream::binary); -} - -bool StreamThreadTSWriter::writeDataToOutputDevice(mpegts::PacketBuffer &buffer, StreamClient &UNUSED(client)) { - const unsigned char *tsBuffer = buffer.getTSReadBufferPtr(); - - const long timestamp = base::TimeCounter::getTicks() * 90; - const size_t dataSize = buffer.getCurrentBufferSize(); - - // RTP packet octet count (Bytes) - _stream.addRtpData(dataSize, timestamp); - - // write TS packets to file - if (_file.is_open()) { - _file.write(reinterpret_cast(tsBuffer), dataSize); - } - return true; -} - -} // namespace output diff --git a/src/output/StreamThreadTSWriter.h b/src/output/StreamThreadTSWriter.h deleted file mode 100644 index 324fae65..00000000 --- a/src/output/StreamThreadTSWriter.h +++ /dev/null @@ -1,76 +0,0 @@ -/* StreamThreadTSWriter.h - - Copyright (C) 2014 - 2023 Marc Postema (mpostema09 -at- gmail.com) - - This program is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public License - as published by the Free Software Foundation; either version 2 - of the License, or (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - Or, point your browser to http://www.gnu.org/copyleft/gpl.html -*/ -#ifndef OUTPUT_STREAMTHREADTSWRITER_H_INCLUDE -#define OUTPUT_STREAMTHREADTSWRITER_H_INCLUDE OUTPUT_STREAMTHREADTSWRITER_H_INCLUDE - -#include -#include - -#include - -FW_DECL_NS0(StreamClient); -FW_DECL_NS0(StreamInterface); - -FW_DECL_UP_NS1(output, StreamThreadRtp); - -namespace output { - -/// TS Writer streaming thread -class StreamThreadTSWriter : - public StreamThreadBase { - - // ===================================================================== - // -- Constructors and destructor -------------------------------------- - // ===================================================================== - public: - StreamThreadTSWriter( - StreamInterface &stream, - const std::string &file); - - virtual ~StreamThreadTSWriter(); - - // ===================================================================== - // -- output::StreamThreadBase ---------------------------------------- - // ===================================================================== - protected: - - /// @see StreamThreadBase - virtual bool writeDataToOutputDevice( - mpegts::PacketBuffer &buffer, - StreamClient &client) final; - - private: - - /// @see StreamThreadBase - virtual void doStartStreaming(int clientID) final; - - // ===================================================================== - // -- Data members ---------------------------------------------------- - // ===================================================================== - private: - - std::ofstream _file; - std::string _filePath; - -}; - -} // namespace output - -#endif // OUTPUT_STREAMTHREADTSWRITER_H_INCLUDE diff --git a/src/socket/SocketAttr.cpp b/src/socket/SocketAttr.cpp index 7587901d..3afb01bb 100644 --- a/src/socket/SocketAttr.cpp +++ b/src/socket/SocketAttr.cpp @@ -36,7 +36,7 @@ SocketAttr::SocketAttr() : _fd(-1), _ipAddr("0.0.0.0"), - _ttl(1) { + _ttl(0) { std::memset(&_addr, 0, sizeof(_addr)); } @@ -87,14 +87,14 @@ SI_LOG_PERROR("setsockopt: SO_REUSEADDR"); return false; } - if (type == SOCK_DGRAM) { + if (type == SOCK_DGRAM && _ttl > 0) { int ttl = _ttl; if (::setsockopt(_fd, IPPROTO_IP, IP_MULTICAST_TTL, &ttl, sizeof(ttl)) == -1) { SI_LOG_PERROR("setsockopt: IP_MULTICAST_TTL"); return false; } if (::setsockopt(_fd, IPPROTO_IP, IP_TTL, &ttl, sizeof(ttl)) == -1) { - SI_LOG_PERROR("setsockopt: IP_TTL"); + SI_LOG_PERROR("setsockopt: IP_TTL: @#1", ttl); return false; } } @@ -182,7 +182,7 @@ bool SocketAttr::sendDataTo(const void *buf, std::size_t len, int flags) { if (::sendto(_fd, buf, len, flags, reinterpret_cast(&_addr), sizeof(_addr)) == -1) { - SI_LOG_PERROR("sendto"); + SI_LOG_PERROR("sendto (fd: @#1)", _fd); return false; } return true; diff --git a/src/socket/SocketAttr.h b/src/socket/SocketAttr.h index 421af0d4..167af20a 100644 --- a/src/socket/SocketAttr.h +++ b/src/socket/SocketAttr.h @@ -98,6 +98,11 @@ class SocketAttr { /// Set the Receive and Send timeout in Sec for this socket void setSocketTimeoutInSec(unsigned int timeout); + /// Get the Time(hops) that a packet exists inside network + int getTimeToLive() const { + return _ttl; + } + /// Get the file descriptor of this Socket int getFD() const; diff --git a/src/socket/TcpSocket.cpp b/src/socket/TcpSocket.cpp index 0f7bd9bc..7dfadd24 100755 --- a/src/socket/TcpSocket.cpp +++ b/src/socket/TcpSocket.cpp @@ -123,7 +123,7 @@ bool TcpSocket::initServerSocket( int maxClients, bool nonblock) { // fill in the socket structure with host information - _server.setupSocketStructure(ipAddr, port, 1); + _server.setupSocketStructure(ipAddr, port, 0); if (!_server.setupSocketHandle(SOCK_STREAM | ((nonblock) ? SOCK_NONBLOCK : 0), 0)) { SI_LOG_ERROR("TCP Server handle failed"); diff --git a/src/socket/UdpSocket.cpp b/src/socket/UdpSocket.cpp index 11ea553d..1ca712f4 100644 --- a/src/socket/UdpSocket.cpp +++ b/src/socket/UdpSocket.cpp @@ -65,8 +65,8 @@ bool UdpSocket::initMutlicastUDPSocket( // request that the kernel joins a multicast group struct ip_mreq mreq; - mreq.imr_multiaddr.s_addr = inet_addr(multicastIPAddr.c_str()); - mreq.imr_interface.s_addr = inet_addr(interfaceIPaddr.c_str()); + mreq.imr_multiaddr.s_addr = inet_addr(multicastIPAddr.data()); + mreq.imr_interface.s_addr = inet_addr(interfaceIPaddr.data()); if (setsockopt(server.getFD(), IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq, sizeof(mreq)) == -1) { SI_LOG_PERROR("IP_ADD_MEMBERSHIP"); return false; diff --git a/src/upnp/ssdp/Server.cpp b/src/upnp/ssdp/Server.cpp index f140b3bb..28cf425f 100644 --- a/src/upnp/ssdp/Server.cpp +++ b/src/upnp/ssdp/Server.cpp @@ -75,7 +75,7 @@ void Server::doAddToXML(std::string &xml) const { ADD_XML_ELEMENT(xml, "deviceID", _deviceID); ADD_XML_ELEMENT(xml, "ttl", _ttl); size_t i = 0; - for (auto server : _servers) { + for (const auto& server : _servers) { ADD_XML_N_ELEMENT(xml, "satipserver", i, server.second); ++i; } @@ -85,13 +85,13 @@ void Server::doFromXML(const std::string &xml) { base::MutexLock lock(_mutex); std::string element; if (findXMLElement(xml, "annouceTime.value", element)) { - _announceTimeSec = std::stoi(element.c_str()); + _announceTimeSec = std::stoi(element.data()); } if (findXMLElement(xml, "bootID", element)) { - _bootID = std::stoi(element.c_str()); + _bootID = std::stoi(element.data()); } if (findXMLElement(xml, "deviceID", element)) { - _deviceID = std::stoi(element.c_str()); + _deviceID = std::stoi(element.data()); } } @@ -158,7 +158,7 @@ void Server::threadEntry() { } } // we should send bye bye - sendByeBye(udpMultiSend, _deviceID, _properties.getUUID().c_str()); + sendByeBye(udpMultiSend, _deviceID, _properties.getUUID().data()); } void Server::checkReply( @@ -231,7 +231,7 @@ void Server::checkDefendDeviceID( SSDP_PORT, _properties.getUPnPVersion(), _deviceID); - if (!udpSend.sendDataTo(msg.c_str(), msg.size(), 0)) { + if (!udpSend.sendDataTo(msg.data(), msg.size(), 0)) { SI_LOG_ERROR("SSDP M_SEARCH data send failed"); } } else if (_servers.find(otherDeviceID) == _servers.end()) { @@ -268,7 +268,7 @@ void Server::sendGiveUpDeviceID( _bootID, _deviceID); - if (::sendto(udpMultiSend.getFD(), msg.c_str(), msg.size(), 0, + if (::sendto(udpMultiSend.getFD(), msg.data(), msg.size(), 0, reinterpret_cast(&si_other), sizeof(si_other)) == -1) { SI_LOG_PERROR("send"); } @@ -325,7 +325,7 @@ void Server::sendDiscoverResponse( _properties.getUUID(), _bootID); - if (::sendto(udpMultiSend.getFD(), msg.c_str(), msg.size(), 0, + if (::sendto(udpMultiSend.getFD(), msg.data(), msg.size(), 0, reinterpret_cast(&si_other), sizeof(si_other)) == -1) { SI_LOG_PERROR("send"); } @@ -353,7 +353,7 @@ void Server::sendAnnounce(SocketClient& udpMultiSend) { _properties.getUUID(), _bootID, _deviceID); - if (!udpMultiSend.sendDataTo(msgRoot.c_str(), msgRoot.size(), 0)) { + if (!udpMultiSend.sendDataTo(msgRoot.data(), msgRoot.size(), 0)) { SI_LOG_ERROR("SSDP UPNP_ROOTDEVICE data send failed"); } @@ -380,7 +380,7 @@ void Server::sendAnnounce(SocketClient& udpMultiSend) { _properties.getUPnPVersion(), _bootID, _deviceID); - if (!udpMultiSend.sendDataTo(msgAlive.c_str(), msgAlive.size(), 0)) { + if (!udpMultiSend.sendDataTo(msgAlive.data(), msgAlive.size(), 0)) { SI_LOG_ERROR("SSDP UPNP_ALIVE data send failed"); } @@ -407,7 +407,7 @@ void Server::sendAnnounce(SocketClient& udpMultiSend) { _properties.getUUID(), _bootID, _deviceID); - if (!udpMultiSend.sendDataTo(msgDevice.c_str(), msgDevice.size(), 0)) { + if (!udpMultiSend.sendDataTo(msgDevice.data(), msgDevice.size(), 0)) { SI_LOG_ERROR("SSDP UPNP_DEVICE data send failed"); } } @@ -427,7 +427,7 @@ bool Server::sendByeBye( "CONFIGID.UPNP.ORG: 0\r\n" \ "\r\n"; const std::string msgRoot = StringConverter::stringFormat(UPNP_ROOTDEVICE_BB, uuid, bootId); - if (!udpMultiSend.sendDataTo(msgRoot.c_str(), msgRoot.size(), 0)) { + if (!udpMultiSend.sendDataTo(msgRoot.data(), msgRoot.size(), 0)) { SI_LOG_ERROR("SSDP UPNP_ROOTDEVICE_BB data send failed"); return false; } @@ -445,7 +445,7 @@ bool Server::sendByeBye( "CONFIGID.UPNP.ORG: 0\r\n" \ "\r\n"; const std::string msgByeBye = StringConverter::stringFormat(UPNP_BYEBYE, uuid, bootId); - if (!udpMultiSend.sendDataTo(msgByeBye.c_str(), msgByeBye.size(), 0)) { + if (!udpMultiSend.sendDataTo(msgByeBye.data(), msgByeBye.size(), 0)) { SI_LOG_ERROR("SSDP BYEBYE data send failed"); return false; } @@ -463,7 +463,7 @@ bool Server::sendByeBye( "CONFIGID.UPNP.ORG: 0\r\n" \ "\r\n"; const std::string msgDevice = StringConverter::stringFormat(UPNP_DEVICE_BB, uuid, bootId); - if (!udpMultiSend.sendDataTo(msgDevice.c_str(), msgDevice.size(), 0)) { + if (!udpMultiSend.sendDataTo(msgDevice.data(), msgDevice.size(), 0)) { SI_LOG_ERROR("SSDP UPNP_DEVICE_BB data send failed"); return false; } diff --git a/web/config.html b/web/config.html index 6967e69d..92a92e2e 100644 --- a/web/config.html +++ b/web/config.html @@ -35,6 +35,7 @@ page += addTableLineEntry("Path to the Web-GUI", xmlDoc, "webPath"); page += addTableLineEntry("Path to store Application Data", xmlDoc, "appDataPath"); page += addTableLineEntry("Log messages to syslog", xmlDoc, "syslog"); + page += addTableLineEntry("Log Debug messages", xmlDoc, "logDebug"); } else if (content == "oscam"/* && xmlDoc.getElementsByTagName("OSCamEnabled").length != 0*/) { page += addTableLineEntry("OSCam server Enabled", xmlDoc, "OSCamEnabled"); page += addTableLineEntry("OSCam server name", xmlDoc, "OSCamServerName"); diff --git a/web/frontend.html b/web/frontend.html index ee0aeaeb..3491bf84 100755 --- a/web/frontend.html +++ b/web/frontend.html @@ -95,6 +95,7 @@ page += addTableLineEntry("Turn off LNB Voltage during teardown", xmlDoc, streamID + "turnoffLNBPower"); page += addTableLineEntry("Enable slightly higher LNB Voltage", xmlDoc, streamID + "higherLnbVoltage"); page += addTableLineEntry("List of PIDs to add to requests (CSV)", xmlDoc, streamID + "addUserPids"); + page += addTableLineEntry("Maximum DVBCSA Batch Size", xmlDoc, streamID + "dvbcsa_bs_batch_size"); var transformation = visibleStream.getElementsByTagName("transformation"); if (transformation.length > 0) {