From 748c48046db356ef9a2defa087e197c21c17c9de Mon Sep 17 00:00:00 2001 From: Jamin Hitchcock Date: Sat, 13 Jul 2024 21:21:55 -0500 Subject: [PATCH 01/19] Switch to using the From header for device ID It appears the From header is actually more meaningingful for calls coming from Asterisk, as the Contact header does not distinguish between which device initiated a call like the From header does. --- voip_utils/sip.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/voip_utils/sip.py b/voip_utils/sip.py index fde83ba..7d63134 100644 --- a/voip_utils/sip.py +++ b/voip_utils/sip.py @@ -86,12 +86,12 @@ def datagram_received(self, data: bytes, addr): caller_uri = None caller_name = None - # The Contact header should give us the URI used for sending SIP messages to the device - if headers.get("contact") is not None: - caller_uri, caller_name = self._parse_uri_header(headers.get("contact")) - # We can try using the From header as a fallback - elif headers.get("from") is not None: + # The From header should give us the URI used for sending SIP messages to the device + if headers.get("from") is not None: caller_uri, caller_name = self._parse_uri_header(headers.get("from")) + # We can try using the Contact header as a fallback + elif headers.get("contact") is not None: + caller_uri, caller_name = self._parse_uri_header(headers.get("contact")) # If all else fails try to generate a URI based on the IP and port from the address the message came from else: caller_uri = "sip:" + caller_ip + ":" + caller_sip_port From 85abdedc6817bc405cf86808134c82f28d18bd5f Mon Sep 17 00:00:00 2001 From: Michael Hansen Date: Thu, 15 Jun 2023 15:03:50 -0500 Subject: [PATCH 02/19] Working on calling --- voip_utils/call_phone.py | 20 +++++++ voip_utils/sip.py | 111 ++++++++++++++++++++++++++++++++++++++- 2 files changed, 130 insertions(+), 1 deletion(-) create mode 100644 voip_utils/call_phone.py diff --git a/voip_utils/call_phone.py b/voip_utils/call_phone.py new file mode 100644 index 0000000..486d86a --- /dev/null +++ b/voip_utils/call_phone.py @@ -0,0 +1,20 @@ +import asyncio +import logging + +from .sip import CallPhoneDatagramProtocol + + +async def main() -> None: + logging.basicConfig(level=logging.DEBUG) + + loop = asyncio.get_event_loop() + transport, protocol = await loop.create_datagram_endpoint( + lambda: CallPhoneDatagramProtocol(None), + local_addr=("192.168.68.75", 5060), + ) + + await protocol.wait_closed() + + +if __name__ == "__main__": + asyncio.run(main()) diff --git a/voip_utils/sip.py b/voip_utils/sip.py index 7d63134..24da285 100644 --- a/voip_utils/sip.py +++ b/voip_utils/sip.py @@ -5,6 +5,7 @@ import asyncio import logging import re +import time from abc import ABC, abstractmethod from dataclasses import dataclass from typing import Dict, Optional, Tuple @@ -64,7 +65,7 @@ def datagram_received(self, data: bytes, addr): """Handle INVITE SIP messages.""" try: caller_ip, caller_sip_port = addr - message = data.decode() + message = data.decode("utf-8") method, ruri, headers, body = self._parse_sip(message) _LOGGER.debug( "Received datagram method=%s, ruri=%s, headers=%s, body=%s", @@ -283,3 +284,111 @@ def _parse_sip( body = message[offset:] return method, ruri, headers, body + + +class CallPhoneDatagramProtocol(asyncio.DatagramProtocol, ABC): + def __init__( + self, sdp_info: SdpInfo, loop: Optional[asyncio.AbstractEventLoop] = None + ) -> None: + self.sdp_info = sdp_info + self.transport = None + self._closed_event = asyncio.Event() + self._loop = loop if loop is not None else asyncio.get_running_loop() + self._session_id = str(time.monotonic_ns()) + self._session_version = str(time.monotonic_ns()) + self._call_id = str(time.monotonic_ns()) + self._request_uri = "sip:user@192.168.68.75" + + def connection_made(self, transport): + self.transport = transport + + username = "test2" + + sdp_lines = [ + "v=0", + f"o={username} {self._session_id} {self._session_version} IN IP4 192.168.68.75", + "s=SIP Call", + "c=IN IP4 192.168.68.75", + "t=0 0", + "m=audio 5004 RTP/AVP 123", + "a=sendrecv", + "a=rtpmap:123 opus/48000/2", + "a=fmtp:123 maxplaybackrate=16000", + "a=ptime:20", + "", + ] + sdp_text = _CRLF.join(sdp_lines) + sdp_bytes = sdp_text.encode("utf-8") + + invite_lines = [ + f"INVITE {self._request_uri} SIP/2.0", + "Via: SIP/2.0/UDP 192.168.68.75", + "From: ", + "To: ", + f"Call-ID: {self._call_id}", + "CSeq: 50 INVITE", + "User-Agent: test-agent 1.0", + "Allow: INVITE, ACK, OPTIONS, CANCEL, BYE, SUBSCRIBE, NOTIFY, INFO, REFER, UPDATE", + "Accept: application/sdp, application/dtmf-relay", + "Content-Type: application/sdp", + f"Content-Length: {len(sdp_bytes)}", + "", + ] + invite_text = _CRLF.join(invite_lines) + _CRLF + invite_bytes = invite_text.encode("utf-8") + + print((invite_bytes + sdp_bytes).decode()) + + self.transport.sendto( + invite_bytes + sdp_bytes, + ("192.168.68.82", 5060), + ) + + def datagram_received(self, data: bytes, addr): + try: + response_text = data.decode("utf-8") + response_lines = response_text.splitlines() + print(response_lines) + is_ok = False + + for i, line in enumerate(response_lines): + line = line.strip() + if i == 0: + _version, code, response_type = line.split(maxsplit=2) + if (code == "200") and (response_type == "OK"): + is_ok = True + else: + _LOGGER.debug("Skipping message: %s", line) + elif not line: + break + + if is_ok: + _LOGGER.debug("Got OK message") + if self.transport is not None: + bye_lines = [ + f"BYE {self._request_uri} SIP/2.0", + "Via: SIP/2.0/UDP 192.168.68.75", + "From: ", + "To: ", + f"Call-ID: {self._call_id}", + "CSeq: 51 BYE", + "User-Agent: test-agent 1.0", + "Content-Length: 0", + "", + ] + bye_text = _CRLF.join(bye_lines) + _CRLF + bye_bytes = bye_text.encode("utf-8") + self.transport.sendto(bye_bytes, ("192.168.68.82", 5060)) + + self.transport.close() + self.transport = None + except Exception: + _LOGGER.exception("Unexpected error handling SIP response") + + def connection_lost(self, exc): + """Signal wait_closed when transport is completely closed.""" + self._loop.call_soon_threadsafe(self._closed_event.set) + + async def wait_closed(self) -> None: + """Wait for connection_lost to be called.""" + await self._closed_event.wait() From e1387e214850286c1a7302c0da98c1abd31c515d Mon Sep 17 00:00:00 2001 From: Michael Hansen Date: Fri, 17 May 2024 09:37:37 -0500 Subject: [PATCH 03/19] Make IP's variables --- voip_utils/sip.py | 26 +++++++++++++++----------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/voip_utils/sip.py b/voip_utils/sip.py index 24da285..1a43c44 100644 --- a/voip_utils/sip.py +++ b/voip_utils/sip.py @@ -286,6 +286,10 @@ def _parse_sip( return method, ruri, headers, body +CALL_SRC_IP = "192.168.1.100" +CALL_VIA_IP = "192.168.1.101" +CALL_DEST_IP = "192.168.1.102" + class CallPhoneDatagramProtocol(asyncio.DatagramProtocol, ABC): def __init__( self, sdp_info: SdpInfo, loop: Optional[asyncio.AbstractEventLoop] = None @@ -297,7 +301,7 @@ def __init__( self._session_id = str(time.monotonic_ns()) self._session_version = str(time.monotonic_ns()) self._call_id = str(time.monotonic_ns()) - self._request_uri = "sip:user@192.168.68.75" + self._request_uri = f"sip:user@{CALL_SRC_IP}" def connection_made(self, transport): self.transport = transport @@ -306,9 +310,9 @@ def connection_made(self, transport): sdp_lines = [ "v=0", - f"o={username} {self._session_id} {self._session_version} IN IP4 192.168.68.75", + f"o={username} {self._session_id} {self._session_version} IN IP4 {CALL_SRC_IP}", "s=SIP Call", - "c=IN IP4 192.168.68.75", + f"c=IN IP4 {CALL_SRC_IP}", "t=0 0", "m=audio 5004 RTP/AVP 123", "a=sendrecv", @@ -322,9 +326,9 @@ def connection_made(self, transport): invite_lines = [ f"INVITE {self._request_uri} SIP/2.0", - "Via: SIP/2.0/UDP 192.168.68.75", - "From: ", - "To: ", + f"Via: SIP/2.0/UDP {CALL_VIA_IP}", + f"From: ", + f"To: ", f"Call-ID: {self._call_id}", "CSeq: 50 INVITE", "User-Agent: test-agent 1.0", @@ -341,7 +345,7 @@ def connection_made(self, transport): self.transport.sendto( invite_bytes + sdp_bytes, - ("192.168.68.82", 5060), + (CALL_DEST_IP, 5060), ) def datagram_received(self, data: bytes, addr): @@ -367,9 +371,9 @@ def datagram_received(self, data: bytes, addr): if self.transport is not None: bye_lines = [ f"BYE {self._request_uri} SIP/2.0", - "Via: SIP/2.0/UDP 192.168.68.75", - "From: ", - "To: ", + f"Via: SIP/2.0/UDP {CALL_VIA_IP}", + f"From: ", + f"To: ", f"Call-ID: {self._call_id}", "CSeq: 51 BYE", "User-Agent: test-agent 1.0", @@ -378,7 +382,7 @@ def datagram_received(self, data: bytes, addr): ] bye_text = _CRLF.join(bye_lines) + _CRLF bye_bytes = bye_text.encode("utf-8") - self.transport.sendto(bye_bytes, ("192.168.68.82", 5060)) + self.transport.sendto(bye_bytes, (CALL_DEST_IP, 5060)) self.transport.close() self.transport = None From 336c1214fe3acfb5109b99dc8ee25124bedddb8f Mon Sep 17 00:00:00 2001 From: Michael Hansen Date: Fri, 17 May 2024 09:40:57 -0500 Subject: [PATCH 04/19] Fix call phone script --- voip_utils/call_phone.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/voip_utils/call_phone.py b/voip_utils/call_phone.py index 486d86a..74b6910 100644 --- a/voip_utils/call_phone.py +++ b/voip_utils/call_phone.py @@ -1,7 +1,7 @@ import asyncio import logging -from .sip import CallPhoneDatagramProtocol +from .sip import CallPhoneDatagramProtocol, CALL_SRC_IP async def main() -> None: @@ -10,7 +10,7 @@ async def main() -> None: loop = asyncio.get_event_loop() transport, protocol = await loop.create_datagram_endpoint( lambda: CallPhoneDatagramProtocol(None), - local_addr=("192.168.68.75", 5060), + local_addr=(CALL_SRC_IP, 5060), ) await protocol.wait_closed() From 5079d20de4fe6e19e45cf4c45f1a856e19659eb8 Mon Sep 17 00:00:00 2001 From: Jamin Hitchcock Date: Fri, 24 May 2024 13:04:18 -0500 Subject: [PATCH 05/19] Test script for outgoing calls This provides a test script for outgoing calls based on the work originally started by Michael Hansen. Instructions for running the outgoing call test script can be found in the README.md file. I tried to make the acceptable coding for the OPUS codecs in the SIP messages more flexible, but the number may need to be changed back from 96 to 123 to work with Grandstream phones. I don't have a Grandstream yet to test with. --- .gitignore | 1 + README.md | 16 +++ problem.pcm | Bin 0 -> 190976 bytes requirements_dev.txt | 1 + voip_utils/call_phone.py | 217 ++++++++++++++++++++++++++++- voip_utils/problem.pcm | Bin 0 -> 190976 bytes voip_utils/sip.py | 286 ++++++++++++++++++++++++++++++++++----- voip_utils/voip.py | 4 + 8 files changed, 489 insertions(+), 36 deletions(-) create mode 100644 problem.pcm create mode 100644 voip_utils/problem.pcm diff --git a/.gitignore b/.gitignore index 4398532..dd2703b 100644 --- a/.gitignore +++ b/.gitignore @@ -8,6 +8,7 @@ tmp/ htmlcov .projectile +.env .venv/ venv/ .mypy_cache/ diff --git a/README.md b/README.md index e38263f..227d27c 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,19 @@ # VoIP Utils Voice over IP utilities for the [voip integration](https://www.home-assistant.io/integrations/voip/). + +## Test outgoing call +Install dependencies from requirements_dev.txt + +Set environment variables for source and destination endpoints in .env file + CALL_SRC_USER = "homeassistant" + CALL_SRC_IP = "192.168.1.1" + CALL_SRC_PORT = 5060 + CALL_VIA_IP = "192.168.1.1" + CALL_DEST_IP = "192.168.1.2" + CALL_DEST_PORT = 5060 + CALL_DEST_USER = "phone" + +Run script +python -m voip_utils.call_phone + diff --git a/problem.pcm b/problem.pcm new file mode 100644 index 0000000000000000000000000000000000000000..887376687f79ab848226daa0034c7a77f3fa364e GIT binary patch literal 190976 zcmZsD1ymeK8*NqFC^HOh0RjP%5O;TXcXxMp*Ntr4-Hl}932|2v0wG9nhhcoCy@P_~Z$Os_-{`=rVd<^lGKi>$+c>DAB?*;r- zo~rz>BE9_Y(SLWzNc?w`P{me$e|aty`Bdyx+*6Uue>qj;E8&#?UHSj*{rCJoSIeL9 z=dXP4zw_mL6<5pOsXR@^wLiZVN9ET4?|tRRB;Lw@E8eUk-GBH0IWD)gBCkK?@aLZY zy{|lVd8&%fpC|o!&p)MHo(kfvymrX)gMZWi$>-1SzZd>*Dgyr^RDKV{_KW|%T}7@E z-mfV0^6!c=MgP`FMM;(CUHJz@Tk)P1 z?_P2B&wb_jRpeE%S8=txv@23nl&y>iTr2S3PkFlXzlw7Ivsa$FqCWn;`0sv2o&EP+ zVa@-xsfsfd-xcZpJoUflSL9b=WyKr(zxDRto0Qx5=jr9Y<@Q$m{b?oTxsGf(ca`v&^4cyxFCiAW{@vs89*6fT(g9GOd-+lM9|YxXp2Z&kZ1|iF zUn}nsJgzM}D#3ZVP$527o|hYb3j%-2^I~y&Cw>Zn{UHT-WXGv&hyfh_r~!*pKzzT1 z@3P}P8e2`_Cz%k5pCTe9K9c_ZF1MV)eO1Dq)f?}5;P3Jr>3{E0;P3MCVX#Fk&c}-K zaegLjkBF?O6y@UMa%;*^F)G3-7@z?~_!-6cx*q533G%Ux?l@NopS9ro{6Gj$VtYB{ z#P8#apIn}o4b=ca*lHu9fjg)I+5mriw?AkAI)jm*E>M7mpc@zhM&R^Lg{PGI5@dPy;Xvyg?1I#r;4bstF8W8M=w~fD-f(slX}p z2{i&eaLN3QQqd3m?B{4ZIta3n4`>Hsv8{DME-dAtj6G>coLFgZ#diO+fhCCmbm$Sl*aA?!#r zBRUh+iH<}Z5kh_@y~$o=2Dy$JLieF3Q7fswOb&B|*~z@4$I|(9O=dFFh&e&q$)ltf zIgvOFGtg;yxf~(alWL2v_?lccdxqV?p5oeZ-kgnX!7b&p_^*7pa9XrUrE*8~Mm{Mw zLH@WaG(^AT-STGXuGmlX6L0Wcx!Rl;*NVHxPGD!V9a%qiJUf|hD`fN2g%qKubV?3F z3*<7HLprb&R0n+!FK>`dQi6P2nk4bUT!9xtrR7qtcw5Zl4@zaI510*S0}*;s{po&6 zPeqFIf@+L*h#^S7MRS+(RqpcLRqbSh&e5lWPI?r1ZVA5@9UZ+dY*%2-cVRB=@P{K+=V{tMT#4`%?!bcT3%neW;KrX;RoNZ*Lx7e1>hNDl+_VAFn=0 z2PhxA?Q`?incSA?2D-m+i&j37s#+TqPb&?vb#dt&3gf5zli69>X?c-_jg6lyo-8L< zC!10!U<%41Gjv1!?3FH7Y7)@W=eoxwLleVA_bWQVZH#uMI-Xe}w{aLO1FhYi$8hPg zj~seU`rcY1IJf3RcZ@P62nP9N&{~aTBemURKu&^>aKWn_iW{{)G*u7-Zww0S>we` zLu>1*L{<4zjjHiJ`c?FiY74@~_?h)v6!XObldIrJk=9thG%mM#isAd!&(6=_`>0=g zGycg{7BnorZW?AAW7j%qskUmM=M`VZr-o-u_f$7OZJ4@1wOwhV{6Qb#m*c5%d2ahm zDhp-jX2)c2&F+$C5zpmCuOLYr2;5V|7dY2ZR% zljkb^Z1n=#1e!}ZTo30}OQh+Y(Oeo}w3jw7t8Kn)t>=il~9w(hny)-C2C#_-ZzCF6>_m!y?8H(PDq4%zh&ZxgDb4`2*AQl-%j zcJJ-=%PB{Y@GF=pi=>pZz<3gwJ+2bpRuk7)7}2|yyZDW ze@^YGs7eF)cdNz3{3z*2TyR z=nVBMeHYJaK7;*M2fYgOsumO7qT2K-b%LAt5At^NOw!la>XZ-Q3_iz3n|w=07f&g^ zP$HF%DO+M%hb>1Y=KkS6(G9;wroD+S1L#jMs`66um0^ zUF0arEBaa(T{OBxUv|m1#QBcfA&!xMko{C`_1+%sJyJa+uZY0z!M#F$geb$$*D7dn zzr*3y?scn2zK`r(t5^MN^%mDAtD1wJ>XOOb(n&{k)3OrExVG$C5taERVa%5vpBu+7 zNv)IHx|l4Z5>wscQ3dM?sG>O~&y7ygKFdC9xNVVrx@(&741Feh zDMFO73`rHj0^kN5@@%Q2FoWIcSYc^yj4Dlx%z&#!;b`O4>OM7GT9wzo%2tKoHZb=Njs(t27eP4mARy{a*y z(nQ^DYKYjx*05xBVdIj1CD!bn34eXK{`S^~+^;Va$EWYeTT=MGFsbOB@rc#ibxPb! zz0gnaA5`g}|5%T`nli>kb)*X!TJe~;$2}=qk=G~leA=Pp>c2K6H&3I}TcwXopPZ4D zRh;iu*3mTvhN^q&yLzjPkZUv@-hD9%m(@VdY;;nlfX|8botMra&rWmSurF-wb z&M?yO(BqI#Xi!+hxcbrUe{~zwVMD|C>RYRIt@*M3kmk=@ziKYkaP!}#oF}Q+@s3ee z#yr^AuUMOxnpPBF_HpxD`A~MV&3*#qBEO5$&_v`-5kp zdpB)g#bIh7y-~ra{!u1Vr^V@(YWX?8+om*2%gVY_u(xP;fj+N$&bS<}{I?}7?O{?^ z`ieHmBgS`SKvBTX07c-z;J4wgs`jiNRW&!PYhZ%sF}D%wH02k?6>1#n!acH0GHFWh z7i}$US-7q6b&+4GtE{^P*a*A9vDul-Y2*wzjw++RQ?p4C{E|;fj5I;4!C!W@b@a4t zv|Ke^GhQnFRyxOcqb$WV%d*WD=6LJ$=k(%eRE5yd6O^O1&^^+_*R!vumsdS+jo-MC z?lpcj-PC4hi^Fy8Q46Zvjf{)t>z-~zHdaAaPJw%hhKqIU1U$7caZeNa15&J+lXIi;M&{nhnV6?2vD?3(9!d|l4ti04PG9WisqLuwsHx>P zO?Ot8uXQOo;+wF+o?JGv^h@c-vQV>+xtZyXQ7*|VPAl1G8tiZh`EWO5P&>4(^*`Ki z8ML0`y|?+90))Wsfzke_yp8Uqn%asS@;BTEMEQ}pgUfT6ER)M}N}R>FN|qR}nNC@X ztaT$qc0xkGr<`mf#^i+CWcdY6{j`H zI=$hIA=&+fj?iYP_A5Iod*L^s6_Ioyp#^KjGwf`~J6nuxt^F=8tn}1aXP{1}r0snJU`Oo{0goLrcSo!~UtfI|ZQKqj&Mff;0Ke3*Hq*mxPt|x7@WOS39Atd=JDB!>A3+Jr#1><oWhsYdsT71Cyxd_K?n~%+5b+?7vIO`DW6w4!XTT5TtC1*XJ z69>tw73+Ja5IHssSz5E3S@`eAFL;%RoRASL8=I;>fIR(+_bZHZQH%qUTu{Wz~zS@{z zA0*x*M8$7SQ=M6NOV?F5Tqoto!3!O#7THic=7zPiR)=a>r0E}7Pt73NrDVwlEXf5Kyl_deep{>1@10}BEc_{aDHpOIdhJ?6L< zxQXgJibm8T@LKG|nVriVi|yTP8J4eRyJ?y!%5=%(W=XP+un%;!boO>VVEy<|;fzow z%n+5*O(|7+Aq|%jMZ55e2mB|lHb0iv@&uRRayV~0vvJ$4#hTff+(7OFyNWfjqL_+&4xA5*Z8|?!x}9cY;IB1W>M>DjTcs57C2A0 zlrfR}$apZHQ;Ul+aW`sG@Dt)J_XP9~{;HB3=t?kPUZ_Mlnq z3jIxecl`<7Pq&r2zYIscJNu>icJPXE%cQyqp|(=vh|(5iy(}B7zfDz&kK}&J8j(FN zZ%6Sk%TYE*7KmANGsP#>8Epsm6JCaZ7a@GOU&OYs-N9u6hy14d-1l1JRqXYbXNc|z zJxx06Dzgu@C)(>f2HQJYYnUdN_!o9BxLK5LEVP6=_Pe&Qr(8!Jz3hedYIuYc#UgnY zIwJ2B_i#U)OC4>U%h(tE86lNF$aQBoxbmH8PAwb59Tu|0C~2)UUd}@`VPhBv216SW zOg~{(D|#y@t14+4x&6>f9wy(MV4o;M?a&5w8*He3zglqB;F=x{uQwGNnQEybz6FeP zZ>`u4FUpUEACCUUTR8_(65^>ZO+M(}<-C3K;m+5i@m+uPj4z1SB`r)h6mGLN6&>Uk z#WZCj}2uu00 zLFNut(J`3sC7*_6bYt}(-4a8-m%)z+Y!UQ4a7RFy-x|MJzDK?5d8qY)ZhJHnl#hsA zq8F=jj&fw$1>0HcJ@fanyQMWs4iu|P=b3t1UACw8Mh;}ZW_xF?ZQtN}!pDjYq*!sI z5XWs~`>@BjsbU|r5Hv!?Vz4llPvFwIGeU^G6orFbU;uEJRD@N(>T5Cw{dJ~ zaH+nmhtXrJPW~{D;p^m4Qx8RpnX=-RuaFBn0&$@bp{)u~%`(U>ws>bvL z@S2w$DYk7^omFk?Ynx~J%SaYKE(|VK8!wqF+aBAlTYFm%SWB&kY!*jlE=KT?&Pp-j zeqp{Kh`$gI&k^Hb0qP4bf)D7p+(GIuHwMWV;kYM7O24JUavE4e%p!`2S7b5Si7KG7 zn0hLxS?{(>-^F`DNVjUuqauUf1`Ui1t)s6qr`FE8FY9I1U?PTvo(xR#EO48y+p5cD zO1Md7lL|E1ZPOBeO-xe#T=(Pg_p)yj;#z-UKYM*IO$yBDpT`t8Gb+u2_AsuE+?%+~ zRMqZqf9K)!IBn>zzpOQBCTewBMtw-}m{Nkpe3A3CeXg~UWv2DBBi=FIR?E`EQq4Nk zzMowsYslJ69hF&iL7AlpQ0M4|d%FUpzyrP}!+kyNuGIC^e#5ziYP+k_$TQ+@#~TZ8 zEw#^c6xuROIVG;bIR&ZtKk{P>#+HmRrCZ)wHko^xEandOo35dPT0RBB$r0o-Vjpfv zV+bo*Te(LwMRkdB;5fMo?L$H`hAw6{ss^jKDptY>IUdfY%4mbCm-?Zi3$utxWLSC! zJyJ1QQ|2));8q~*JHo5AkJ`UWU}2@5m0e*oD%(Sz1ZVmShI(!n-0W_p>IlVnavz4s zhLsH}Szd4^`$y)`ti_pqe>X|7C-wf>JaK!{{j}v-(YdC)nniU>FB!+11^Yv`rZkec z#^_ZCRjpK$R1MUFHBH?JT_@drx1QSF>f?&fR1fkw(SWQ%jU;)v6J<%SaeeQQ(&QSj z8_|yZP1U8lkpkRIc4zu2yp`W^v^A62K>j8+gC=MIo;%e;MN*v5jh*Psbk=diS{-&T z*29@>j&LyS0n=1-jw_V==CC-I$VTplbD3xnEUrz$c;be%QHW+Tpu1}jn5XbJ@)Ea)7#zp8aAt|Dswf%wKr7Nw0~(8s$t|<8Y+%a zB_u~|qjISX@BvPwIhm9zGi{ju@EScx`G_7#O4JU;KlF3>i29}IM1LZF5mUhzp^DH- z^cDy%*GV}}*wb*#cFOdZsY6+=@rQZ5b)6~DJl7g&cUn8S+HskVX~GSZBcGL?pm6ds z(So>2by5UUpNPAPm&^t7C4HXyKpmhxDR=rab(WY%-lyWIA8;;Jz(E40sIa@DW{QZKpOv4d5LHS;_2gb z2pCR2Vg4rVBun<8{D?{LEtGJ~epYHD8R&4SGanBpOOsuN(tTo|i*?K;TvCedlGF@t za&>ULBQHtsg#}_85GqshM5Ye!Vm~vfU<7Xf3i7P5LVQP=IA1nTOrmd^*770B-)vt? zfwTo~b@a6Xprn2pEpQiTZSM`^Fd8DmQ|wY^01Og3sD{%U`IRb%VwR*=tEkh&ITeEA z;ULW-YBk`L{ZJ$|Qo)OA*hl?Itd0;}LmG#&P!}dx=x=$VXyZPsBnZZ7>NrkVt7>mC zcT8b0M)gDPY5Du84{#WX{+j`x+B+tQRv5^ebNc#49z<}ksPbN z!fqFiY9fe5Vhzd(qL2h%N&85i_d+$ud?<+3#MVcvU;Yi1Bu#|l4Xs=xE%oWdok6;(KpSb5dLq&p(Tsjej zW&uwWL$HojnrOZeF^Qfe<;jf{h-fDUgSQGhye!PoOc%bA8u|cy$Ty*f0T&Smnu|_Q zN*K{&d82rqFc44d*OVt2VDW{s+!vN^p_jNFu%)7Ix+~atCB?qVjsQus9mn-=&}Z&1vlQp zE9cN5=$GSw*A1zQxwd!4W0DQ~&FzF{UPt5<3li_@(xpttNNsoNt@Vo6JUFFj z2(>_Sg+1xGt!b#(WXREeKSwcHPAvn z-espM17ESP^P$Em-gd+?9jKSWG&F+Q#UF!1$dyEQu-JW`qXcz#8zYRD)@g4OTZHPM zrh2}(iG!-@{0!K{vCa@KW}A+xM=>|7TZlH=O8gDy9nZsXL)knxptZPmT6BH~#jU1r zZMyQbX*wFEO}DP%CFKTgt!*pwjj@&bic@v@*2A{#^l0XmbED1SbxH1$-PPlgKBce@ zeB!m;@skaA+e6ld-jpQpUl_FEkF-M_MmWkWB1l1%`C%hy6B07OOVqZW*cX_-( zDyx7E+-B7TbfK&RnXBj_t(Wf;NEj)tr2pm)%Ja~5UI)C032?O7O}Hd(lz!stN1Opt zA^AhNDI66W5&IlVq*;o!+(C4Zv^q~adG{Q+)H0X)LA{fUga_I;XsW9t*+<<$)!BYP znWwzztg2u%*NMSoDLe=3(e;SRbU0LlFXTMp0nrh&IXz^HR07*#25%Xw=4UXcT)U++ z@)r(sP@pc$3on(|Y*U>V6>ZTC*GaGuy7&)53h`Dr%g!Xf%A3)BFbfSAC&=#TyEH`( z6&s`7Rrr!Qu)C_chNaf1d+N4P3+ONULT!e!g?7AhqH>X%R$rla zK?OaC=q&FduEP`jQT{m}$0qaXY*&YlrMZzVPyRF?!%k#(^JP-7tVb&Oyz~JqfL&1} zm`HvU_w$~3O#dWY;4ce0PRmjJ0xrj1+j-MrbF5*XI=tAAR)tN&ZxC-e2eDb=aF-x7 z2PC@A%@eAjUgBdo048%MrH5dGWRP^=Gup=05O0y2X*F?7T7ssLJ{W^tL`NugsG>9r z-OlKCyS3BzG_>^m;%}PH&2 z_Pi!qQA#!>TN2gLeO}3SbUk#&Id(ZBEwQC%N(PnAEjwwJaMYUWJS{39MJnme)Le#E zC%Sbrob>4D@yc-8!{iaj^{Z4#7e`1didY>Iq8|L z>!+$l-V$cmubFn3HW^11F}cmtpQj8=?vwH`%{P61R;9u-WtSb9{8f1`TuRHTXZnra zOu&mupMv8n`2@GDB=~>vUSt@q(`pJ8xzqrdB%WhiJL0Sn)>W3n=Fg_(=2O-&_O_0h z&VDYI?ZUt1i-ZQ^Pr-vf#kOTHvAvvcZQHFgED4smmJ8;1^AGbR>kV6+?U>^)?wB|P zsOe9NovPuQ`ugiWD0EgdUvG4yUya^3PH4h48c}aljYCzZM_sD&JtW5exM7&0k$BO% zyX19Vr3}ZfgFm+=bx7Ho#-sgdCc^B=e^PAAD?KSb6z(+Jv=`frs`ufzZFyI3&a3KOJ%$tm*kS1Tb)Md zCf8`!9A}clno384&yY{fUboxNjG9USOczsL@*mO_$26n4r6wC9(WIb z5&mQ?vM#lqp3Y2FSd<;rXVp8^3F`Tp+nCq9u4<*sV5ZU6G51#$o`OauT%-+wP!7(j)00`V%#pdPDkR zw*3Q9iHL#eU>azIXUv09bJP;W$@}FG@=wf^pOMY-S^2T7L{H>9a-w`tZXm1VIH{Sm zRMd&j1WK5}H{?HZ{kVEubUf#Tb}%^l2)MoKFrX-N;SEMq)2918V~o63d9iM0=tt zVT4KW8f<}aqh25Z&*(SF*Q83Az4sLB2=)21Tvcuno9deE(z>9loolS?oXdk<$X;Lx zPQyRoHA1Rj7onUhr=cF;Jm?93K!R9A+##M3b;!DyziUValIMwI_=zXm$}NH;uHD7 z!V{sI$cZXkj&-mer6bf5FNj@aH!6`DN1JHKl+kAT3EdUf$R)~~I!HFh(LoV>0BgdV zU@mT1&B0i(7wiKs!D#p%A~+JG?p4SIzd)KdPGJC#D7AbXMr2_6oIEx{0UP~IXP z7GGj-SBHPb4dtBd4fYHBn3dU$oHuX7Bg-lAu(Vokj`b|5U>$V9c?65+$CJpl_~S(e zkhw%tJlFdRM#4itk2N>9ks8k!Au{3iW|4Wh5n6=KqhDC5(h>~Aec&S~1V&scXTS-t z8Y^6K(P|We9?3JX+C!9LrOi?=sftujijwL|3-NIsthy+WJ7eWaZG3kQh{jK91~=f5 zeKDK~XTka~85{(Iu|_5X9YZ_OempA~gASoPSOH@}O~C=6htuI}*pN6td>~Y0G}(Y` zinnOeM7$xE6T!q?*Z|(bdYTxdL__5FxK~t?_KEFqOJPJ&a2H#P8~GuEqUuA{+_B;5Tp??8M5S5**D=LQPOLM4_MZd-;&Dn*3dUgpaai%z_{V(x4zjB1w)wUPz16x}nBsESiSapp&@GsXz-b593>pKnbXg z%j+gghX$et?kDGnOu~t4vzSQ4?fM|@L(Pd2xCb_e?{Ilq&<>nWG49Q$uwrHyW(%sz zb>%v8D|xbfT8@`lITZK(nK({ff~_2fMxkMtJE)5-NRm&;v*gCOHWQ@B(sk(uuEku* zQ|>Dt!+Mym=q~aAlfW}j6F(~x*2ewyI+09Jq#x;zKMK-Fd?Zd06No_K3tS1KaZlQa zHBh-|7ixtZ@=bY>++1elB&-#>DD9QDN^7JA(qw6@G(nmvEt3vP?=X)hNY$~Od*v6h zC^tp3(L?NWJA=(24!FUNa65bsvms6R5s^eR5rLm1;hK01FTn$FA?yM@U@3S3j)4`J zL28d{uMsZ8#vlNzyU2f4TIE_Z6V^r*p=^|nwNtmzR$K-hP$eYFN%BAPc6o~22U{6} zF&VpLmCV>4mFyumm1pBJ_%6GlK4>E<*I2a$>%eoYaOw!x!aLYw*`YhpkmyGACk7Ei ziII34jI~Y?go4P!Ht&I>U??t+3t%x;WQphr?mL~40VT)>bf_6)d!Tlsl#4!7i3+?U_uw*MNu!oPQMd9B6uIt(k-YTM!g` z9-}m@oKs+iwg#vJI)U-HUrz_iaeZwEyKy-j1slM6uoBG2XQ$zI(jT*ty}&4JOCQh| zA1}iE<5HY{GdP6H_$c@rY{fo$G)Co{fT~!dXvg-wLRWAJokf#zy{txE&_w)Eqv@D| z8;EW4$35R6FUS3RH11tB&{Uji4t|?`Sh<&qy;~Lv!5+qr>ry~WMjw>BMZAklr99TE)F$UumzH0@jheK&S*{1<4Xi z#Npx%_)gtS*<3!&Z(#-g9x~zn6)tZf4eIG)Eb%~bom4Z+=yB9=@}}aeoXjo}qhS@Y zJ=s(8bKEl3EInPa)B1ul3u@%#yI>A86l;;J#3LH(DqvMoq<$zz>&7Ub(}|!aby%@Q zQASoK%xIRJEnVO`2rHzP*b~>oV`Qn&mmMLD#WATD+AU#)CJcrK#-OaM45MstCGiG5 z$D^b>9YEZp{w8jtsc^RxDm-R)O25U$Xf*sRE$0<3iXSN};AME8NCbzVgiB>Q{D{Zu zS_-pAU;QWLSJYOXBcwXdb6KuVY^k&z`%V>nE0>`r;zAyZ4f(5LM^GR4#=gXE@)0?L za1d7sC0vF2%A3UHd?op{R0y(QEF1&tN-g;|&JJ7y`8!xaypw-Pn~(#2fN}IN;wO;QFeP-|%%ujb>$*6;==;L8<%$btOX;U#Mhw1CE_=6re8oGu@wCbp-d`Vg(I;4GI6FG`% zOw}j5!+c=IO5x_H0q!@qq zA#zo$fj%O=6?cirQZ8Bt7n9M zXNYG7g*Xn!n6&gm+#=2sSBP81ZK6tADs_=1JT7VR9IvPJOB^9= z*#h=Gdy#cxFS9kV#& zZqcFiJes3YaopJo$5{)gfr?|Q!J60F61ODx!=4Mg7x<+F)()K#{x;kvtZ$`U-&{ir z%}?qr8YcSipV;TlH?}Y4N@ev*$CWfMp-R6Pp*i2;vd*&Yv3<7hbUIl^RHJ-o$Md%F zWJ|b7rbNJZX4_#EZCh)yX^}CZxN*_9!c9dxN?MjV%?)jx>{soT9P1rjoIP2I|03lA zFS3Z-Kswg~r@Y*+p5;bAA_eFP&`OWn=AY9eIwc&ZF!ufs-h%+l9UTZy+K zR5w)C*&tbMfetIL61KHvS2;iln*`x)JL^;fF9^wi$7 zbVXjn%-g>Y{Whh4$g_m!j`$ZJEz-yYzAA3?X%+<+f?W-J&|L;1@Z?oPPsz4hWSRm zg0;{XsSInofRN4Ba8$S6b6g|F`s!-GX+Nv~_K|7hmW|IG)nrh9xBAW3M_$*~wS=bJ z|CsZt((8NgmVZ7Gzb1K6HY^?G=qEw)H*;38lQH5kY`fB`d+%L0;IQ924_zGyjGKko=11%^c?~&Dk)-;eeyzI5d?QAoB=N1F7jih4>l&_` zmG*Cr-Rwg?Oq?aevc67#XC6COlyR)m!x>@y#}sCcx16w3>?MAq)E)$psmvp_!mW$; zow7f58l?*jSiv^l99a6gASO2}Khxe>$JA=sb^6c`^~>G$mt*plRl|7hM zpq}HO{7%WWzV-fe;C8v zacz6&HoECM&Xtu)y`6UddQ68K<8J#s?fYd)#!c&Ka+TiUjeKkP<@+`EU+jCu^On?5?3O{fzekkBlpT2A}2uiPhUxW1?FkHA|&6a0fcZ>ZP6 zeXgseb8;^KzL?r0y>CuPVN}_4$7*RAJxDWDcTHcQo1mSq^r1R~MPggmAd9ASYEeni z=900-lP0V6sq2}z8&+lf)v;Q$_KZ4$Sq$Ha8IC6=N70zv)Qr_BN0VRW%;)F%9j`m7 z{jEMtM@P)Nwi>MtpVxnAzt&9EB|6a(me?=${k4XdI$Yg;+x|Q&E-G`dwHDdVV_3+z zh{!6{Lgxg1_iyCa&8xQdI5Au}>N@PC9X{rOg4p!BsRvS<{$7_pDt%n$f`UkEOQ}Dz z*zL06s3FV{YIx!HOYt`{+J(~OqB(`j^V9N*3oe#EwWSIlVLfKBTJQGO?Y7%x%~~c3 zH09In1oO|)0z82Jz}mpP_-sOhimr)j2KNt&d7>>Qi9EUu(wap!`4 z*{3pd@;=yQwJ9{O&g@o+ef%cYT%cb%d0ym%kOA)P9#kvUUNmn`jD9}#cFgt4F~{!C zf9m+KHf4dSD*45ItnX=mI;d5MM`&b_pVwE-RAxN2o=B5RxZ#fPmJ_D_#(-irPssAh zxRpL4YkhvB(vxPVJw|v#MZ487T-J-4&8k904=P1Ub>x;^Dw$bwy!1rb8FR2L(e*+4 zOzM<&7MEp3d`O4gV3HQqPxw7avd#Yb?ZVvlBK28L5lwE()J9W{kc6hql+M9@p$M zdH)*o+WX$?8}yA!x4a%~dwJ%2RNg3-p%PT>^gX;Cfipwe1`YR)anI0=ccV0`6mN)c z@^B%++1v7a%pn$?|V6W3N{t5HAnJ?$f~M_>Se0)s-~K6>S)Fv1PRYv zCdYlp4M&>ej&mmaoqsJQfNn%}xESq})Iu;f!FkB~!gRCjkjdBD-m#W-33pLH>YnnZ zrlwn(cDjaCU7-)*mKo!EZPk~JD7jTc6!gnU%Z$nGYMD$XdIg6C)&i}I`)5t8H%pv; zZNj#Z!v`GbP`j4PYqFGBRFZt+^N^R^<5drbJZ|*zz~>W5zcbqu?l!e$=fFwIvznS( zg`1cAV=s+gjNf_R6FvprhrL=EHfjJ>NeryBXcL!onAmM#gXFx+7n~&%P9kOp45;lh^Md^qX=u!O^jCZ;u^7;$YO4)9@aR2 z;@|OQd?jIua92>{dHiLOz;lkjq}$S6DO(yThu~Fxf5Wz9IPGFCE4!*4nAiKLOVBTI zx4X|UI1FPwc6%)MPOC1Xx?Hto_3q9jJ;JU{?;WqO;A1rtXFZf#gbnYNau!$~z z_62*Ki|1R2kECXJjp0xDo47)Dp-xdT)Fo;6DpbNj;0St%XHgr(#lj{&hKpsNxsY?ebG~z=vz@cObEz}eIl%S6 zWp*`V53w$`0oMSp6%^TGmSq9fQqSi^?l!+j7$pvs+RFxvZMVhISRzKWrel0@Cvr!B zVeBvyuZ4VyvAnUEPkE0PVC-WjtViVH7}A^SPK~6NQAcoDZJ}yX56Cd`ETJXl!$gca z4?;KatZ}luM}Cg^iy(|<;n)+Sa!MT8JLCbFMNSg6;$*>JsD+ixlf}-`MENOd3f~je zs6KRerkcX4IIg5s5vqo&o~oI6L~pE0R<6OA%NNCLMLN@p*-U?>s^B>-i*d>rj98xo z_3-?xANnA7l@p~!Qh@YK93=XP3BoztF7IKreY)^k*dq)UG?=Xp!%AN@*01W>cdkdS zA1)=^hJD5^=4SCTG0u}I;;2#%!wCKp{MJQy^=vR+h5HGkck40QJOLwNOEH4UqCp@V zY=b?CNV1eXMg`Ne>0S5}O7ExA$tZFv=G1w-Ue<|`ze5z%$A1C<8UbnAr|IH|~sQ-D@#NvtAC9ze}g3Ez&8;B#n{dpIrcTG?G( zN1hO#VP@J3BkBF*WQ=5-#>jIe&=m~Dxa1hT&B0jY1@Ikn9g{FtFq}vyhLG>cM$`e! z9r2WndP6OxRMf72xiW@04F|#+7)h&(Rh*0Aarh5Bg*9O!#w_39RjM`RDbj1PshA_& z#xt>xf}1#6ydvg_3Mo*Ekh~-)6^V&ry66;ZN*kpz+3DX20My4U*(#z5siZ6v z*4QylMVT^N^-R4$n2+Q!AH}`q4sz4ET3jJ}ik-%`WPS0%aL%P-tFisr zBe;L{l15YU(6)9s9X`)Lg1HMNn7B zv3L#PP0V`w5eb;lXo_+1iz^<5Ys2>cPgAMeg5b1%6o z+!-#G`^f>m20xwuh`sZCAyH_JM+-M;6=qKw;PoMKat+*XUSM2iGB^%mFb|-C-Y^hW zg*|YqsfBq00pow3m@62Kw~@I0xIr7{SM~vS7=n?iK=>Im27iNvn7zru+d0e)bi>}s z3*+G#ARlzVx%9!vR|IBg6Ttv@3v(Mq077@z9N6Sc@S1t0`dc{-?qeezO`P{#JB0_J zI;EkX317IjT#D;~cn5}4NyJ2AHTaF!NF@^jwVJuA@KP4i^N14|)n5*pVejx3mLYff zJ??cyVsmL5o;7Dn6Ge;oOEmJggjty1?TPt>o%sI>(8vx9WC7+%FX7VP1IK||a2M7! zU!+D+4anzkD)@o+5c|lEOc1kz>_hedGx1DqDnl{z>A}Pd@D-0?UC8|~0JW8V%ejEV zYwW+`vVSB*3&(_sxCc4J5hBH3as|0^SWd{0vZOP@IT!89V&CySq&=7mc_2>V-*M-; zdU!qb6fg+hkber#`37P$u%8%3b|yMtB!0AX1;xXz#CGa9IU8u?29mp67w)E-GXj~1 z*Euv1rpkIsV%}1pKri`*bPf?1neI*8hiVv&wNLZGdtxo{m)~M+au3`|3LdRRCo(tHKDyuT{XEWkPWBG<&G3s1 zm>zn|}4-gCVyo_jpM87}JDXv!2;iXnW^Md2yi*16l}Zt*Z>8%G;w8ZQ_R8><`n z(rU)ZvU z!O`>)HLrfEzO3G?4puKvJy1TvKIkm{4aZf3h$)~eMj}25EqIb!BiMOO{@(sBQUfKUQD#QG0Rp5rUW35&Ks0I(C z(Q*gW6*FW5!AH!`;WY-tR&pd!9dyTI?OUP%vjrP5-{-{WaUE197oyqNKcr&@w@^NX zHi3Rb0R2qiul}r=@0PEh;Su4r)63gS?YYR~i-(uz506F$sQ1I`_Wj(vHSLwX>86Am ziW9D}^BgU$nI@(zvb1ioSUA53mc*9yEeR`WS9-H-fF;US&CWRbJD;&eVX^!juO~$C zE2*G^>2xZLZb@&Ys*q>lQOsN~KzHRQSRL?PxQdktJA_i~hez;h`B6BIy2{gnAj}kR zh%wT0`3;J~EcQo?n9n3%QV;3+%tPje;<@sus-wD=`nGzErk=L9_KJpAbyhV}-BCVN zjH0iSo5;~5Btp;%akj8YSR)MN&N}bgW&1HlzP*8co!!^5)=|kh$T`zhotwxr!b{)FU-xYr>6S3#!0`+m>< z4@cJk9>>;(N9)bTZrG$q(j>L*+cvdr+qQda8@IM?8%Z16*Z%)Zf0i= zzVFrXIqKWbzq9{hU#)i=&!L_pz3O}VyZWg0@=vnHv`M(@XkyJYaaF6!jir3auac7` z=SvbxQcGHuPA%i~bVX!^d*y3Gg1MjNmZg(zm9rZkA@mcxftx#|Ls%83gEzSV=Kcn% zr%B>`q)aT6%)sAoh%)%=rs4|wi`~VIqFQ zKgSMxslBJ8p<}aMZXa*6TN&$Mi^f*XS;8U#Kb2Owv}K|hCaq>22)kK zsj+pE<*X^sJjii@tHted?sx8HH*gR61!9!6Mu_Fr!e?Or`{6dr73WD?#4xcJdXf%A z7{=8@>{kRd9=W6u?#SBY8LBqDk;)-Xkze2u*@!)vXL`y47Mtm;fzC>VN;HklXX|jg zFv1BatSX(2*q^M0t;Qv@J-B?-K?T_Dj^JG%Lrv37REi6w4B`eljTmAuS%-c_$J1%( zY`JZ(A3%dJ}gkR8~zJsP-Zh3)yETkE*E^jr9Er z{4yS-5a|UORVjUwM*dlw@iyl`{++Tf)=^>$YJ}p5TU);?e*3*1c%1i~=IQ1dqI^YO z5&Cfjjzg9ul`Bfr1)p-e=FG`_liE6^S6XRSt%A*^gQ~o2l>#qc>+1BH>^sl@Vzv4q z{e$iPgT0@6G!zB^5M;Qxi#=_7X+CcBs`^&`puAI6U(-yBzulKVLhV!9v#qCPXrRFkg)dTxd zqMy8<>a~l^OAJ^Rlpc`p>*x2?f2Hpvx4WwO@+?M2)?-&#JdD#3_tU=kYT>d%bzyEn z!y;Sh<4V%B)N(3at9v(wYSm zi}Z%xY%6ddZz+??=$h_tU$NQ0FlN$hN|H`yf-ls`Hh- zs+t&@8lRX1%YJ)DL_yt>(#W%Py!?SG-X+O3-(BU^(&r)Ws@%7e*JU?e>#J(P3==mx z%FI&?V=D;#2&|#j(h~iU%3lVD`G-A_KPa7|ek&H~&Ug;;e(k-<&p%KRkmx&7^_#7<&|D7^Da-XP#FqL^Q~3(Q$WW?ks(Z)Y=)wZs+#7N=7oB) zYO!*FVuoxzl_7bFwfTYUBS#+YRp`a zZIFj6PAcwWMO7$X$(l2>s6t|+bV;bgJ$AlyK6U=FTk#}sa<8Z{vXctNeRNn=OjXSJ z+MQ$jHks7yblm%}@W6KdcRi}fI@+~WdHRv1-wJwVZ_oIZxiDu!ZsXi%d8>-XmCE%i zD-T*nf`4vAY?STOwe@=J;pIBS^{TttZJDw$k-#-|(3TpNbm^U4u20+ zddmHno78h6MYzgZu+zlCxyiws8EVnl-r6@fS94#57KDOo2ItBWS(LmnDzg~b2_}jD zMLi@lQ1#^l@1lj}Jk75F*7X%Q*J{+QcepBU5}ytZw}7|szCshBE7XHcggH?1X~hZR zd1%0@VPAa)1R(+ae+Q^*qJbmSMo&|YnynpmlQz<&R97ZjHO6hOr=Qn0-$5Y@BG*Lz z8$LZu5&kkn=Rey$PP0hXN6K_;GOMbF>06dADIrRx6%!?=O23pf)VD4FTYs?uBFQwbu~pE?MZeP$8%=KP5VB3 zuD!D(!P%WVF3glJ6Ap3=6e3rdi_B%{ME;S@myMA%mras=#tu})Jf}}m|B&M)PvJTH z&Jm4OD8(|{QfA4qy4ue>ZnBKv6c2+Fd_?P@GOZ~;1|(>yVvRzs)T(k-*{IyMEA5J( z@|%pF)JWs_L}yRC-O|WB#5BrOVft@&A-h7hR(tCwd0+H+!X{`6s=z>_BPDk`YKYnOeq| z4k{}xcQgDpmYZ%_+p|4IxId`XvNOs^wNY8Ti*UHoKQOqN1 z3Hd{MDNF)ZwvM-PU7_S~6UqfW)PhgY(awUFs}He{XamjWe6lt<4(h-PDD<{Lfi{v@ zCG``}3+v!7+ynhgAfLpKhW1eoMQ9!9o0gD%R3WvE&O$%y#<ZGHrpWmeF_UiNJu) zQ}NKYxRYDaOZ~x2C=&C1I>|?@e(8+5 zu5Mf17rOOzF{u}+536R%_fwUG1x`_Sp(}R)s*tDbOGg~k&$qE7lv=Z_Z*A4=8*M{u zTkVUS2ie!`4sL>=MOPGuwWKL@p$VvnIrQ*7kk*ohH7Fh)5uS_X6QQNrA#8>2^BABAEP2_N8u9zVvxIo*B$EXR0x6nBGh&-3XeMMCvp2o+&`^!k}e$ zrx>a}H3;ZX1mz^l$x3us!^nJSE%TwtvO(245~@=xFxN`Kj#0A+Ply5n6)gPZ-=NRf zBAkQLCIVXF7_59bQYUDke-Sz;q?!Qzt4Fpa+mVgPc<5cHk(+@nF9#O5o?Haw=T)Sq zv`5y=Oesu?l6pW1HW)Z+H1H*!7=mXyhWbHSkihqZN=L3=47HH-BOSm`S4m%?MD2-` zyt8})a3`MI#P#ORaXLPPkK&K>(*&6~Mf60su$~-E3Di3}kr^i&40glHq%cjHmUKVr zDH%XEC5A|E#O-1N)N?cOx&roMIn)m4g;JnX4}?$XpxQu<94U4JIxtmi2kmQJF+wbd z*7)H6^}s!aD7bhA2(yH-NZY$8+ykcYLnwoHV}v*z3e-n`Zpv$#@cR7j2WN%spC&CUzO;xaFf>zXCa9OJ>(T&jQT~xYc@M-TgCp7yt%hkV? zEUJS(@|W~Vphg`eLg>S0I5s(w>|Jd!)}_`VwyCz?*0!bV2pn5@v zNHF!8Dd0TrF;|#<%o=7DGn4s;smTNaov(+lH3CxDgz;p4)4S+S*x}Yv6rPmQb@ z1a@R56vCGoRhKNJY+6QJO&pwOR**I6+M8a2Dv z4Lz$2>(FO-Bkn-ivJ}0XfvQE%f+wQ^5X|OuTbjp+4n_9jZF(HtnLZ77^j#opG4yO) z%~3c>>QU{G$@mPbkRF|4J8`s-#82d(!HqDJZO#U=CC&?YB{@mf2Y(yRzGeN;<1FNg zxT(mOq_76%36sHcD5bg3cdsM95x(TVBnicIM`{@Ln99d|S_OUiWoi>vA3a$D&G!?s zFGhVUI5ZwWr`rZE9q|%4(mbpsqoFI)LiIi!976(D9RoCGqlmBQ{le*VdNTUxZ}NqT z1&ZH_CrUxtUHL|lpnRfqD5}uyT~Ju%kupCfidj#0A$3wWIA6~4tJw8WkF{j`I%i;I zdE&h3OmysWw0B;C|K(ptrsJS94WF+8%K({h!yWekSC=ICfTfuOr@;%1(O@_L)=Py* z^k@Z^;w6y^z4j5HsdvFxw1JMW2UNwqpie#k6jMv8$d=>@Al6^OQ-o7vsl`B+uTpx- z3)*^Lx&~e(eV>{Mjd?M-5%(Y&`%5?En%!i8gojR6Yx zP*gxIJwV!x75N7=)#(_MwUJI6jqdm>l;01C1*DcrB(WcpU9et_B7L!EEhSGA-=uHQ z`@^|}_c;!%tR?(F2BE1~OUx4Tg{~M?Q@~WEi4^eHW?1z%OB=9zyv2II1%EySmEi)c zJ_Fz_Xbg>ZYrF#CcW4Jyxdc@3uVOr0N(IkVOA3`f!#R^Fs^FG5h+RktEp-Xzc|Bs=!{yE{fS$mO7P(?a!xiIOvHY?>N|$ppWDvc?%2lJ{#Y+ri>&Q! zvurzUlI?+gnS*wYa~1(}sKc!R8y1UNb)xV}2*dMT19!+Spx)~-GJ8@hsC)21z{^Va zq1VufV437hI5PoGtfx#mBZ1`#1H)Ba<|7jr11h`^%uZ$+GZFiTl6eI6-T>N)ai0hm zDu<`K0bI^8v4*%vNaOc|PbuN%am|56=dk~>2at2hvKdG^eZz(FuKZ}|iI0d`c&(Dw zV^=IBBFNw5JZb|qk~%?!!9z5Lj-tEMYw3gdb2LVgNR?0*siD}&%k&EFO2nND@ z6gvE3=-OLLAH-SUa>`K?j1+u?8>n*X^3gmCH1QZ#nJ?Ty><$@Rdww3j0K8Z*M*a)T z=ceLScuTbK1dWxhOYbq(ooVNLVFn^M>unM+~v)J*#G09P8KWo2de{X+nzmKZBjbpDP9lY)ZXLF!0 zQ#n01oA(4?+f+P^{p}?5!}Wn`{UW?^SL$Nd-UOEI9N3;hQV);aH_XsKz~uL14jv>g zk;n1Xmzc2?cxkA%xT{^MHsDsL;ZqI36P<+&ngq<*`uLpX`2MBXvq|z6cInzgj&uZ7 zKvPM8Bj_e(*fMb-oE0O*Q9ur-qxVUKGp__5n7=-Q|DUwZ)swNVPgPg)G0 z$A01(SfE^B<*$egf&)KRfKeCWsFk09OYeq$BN=|ji*VJ!#R1QAh9O5UuD09S2xR|V{l>Xrf{wsRh?c4%xFlwkV+;VWmd$_AyHma#8zB^{k zfBX-yj@41+Y=*Wq1!3UP;$ZkYPhce2#2UEI^H4WGhfn11Iz14($8Mm0$*AFi$WD0b z2jDu(#dwRs{F#hTeH@OkbC}crQM<8cPJ))X0p&wkF;>r^GVFr-Kbd{rStPo(?J#VFkkr_E6~XEwm8G!xID5jf%iIG?iM zfq8)bU@dm(Mff!Xu9-RT_H01suo-*VaeVC%`k3Pwsi!d(@8f-w!Sq+a(Gv>~&RpU! z_R%bKO5S+B1K|*y2li+^_N<}!q%Fa6dSDIB!)UyOG53zBB>XT#=92f|s_aS~M!f&D z|KogCIuJE{93x{=QQr)wP1G{VgE|d%bUz%4YcMOPi@9(Prt(9eU0KM5a39!}Y!@hD zLg3kmXS;!a-OWB{dA12Sio3{!?!a%uXpO{Jekr)Z<#1N45L^9!WW}Ju{)GBH0oD3@ zlEDfwgW7>!BAKeB?5L(mnxbvs1(K=v)OENW7hxS~kG+_t^6>qaF_OpPvo*qKQ;>GT z2+!AVaN@V|`F5d(7zmGB2r%KlZnizBfc}wUB~Q4vQpBh5tgRHsivM6W4-#EO63#vo zUJ^1O8sIrDgdgw|yq-Q#=Fh{r@Cvg)gT8JU#>yVdoDcA7rJ-lh18vE|y7L=r%q#r+ zAz~Ar@O1dRx}&zKkJbIJ!%l(q0}wBs@!vFk2?_6VtT5jHUs-DZ--{IoH()F5Z{6^F zJ7_jK;=c``C9Z=}9*FOyz+F|sz4a5mfO}XYF5>rhc=}~XTyIK@LB*3y)PQ&N66(QP zVEi}WZhfb+sWkWwpI{b@qrx#K58`?MAtr+tK7yX~G1k;d>|{Nlx4H*RemviWkH>D- zl<&rmf`{N7+%*Cp3zyVk;WPU8I^r;}m#;)UTz5^e25!Sjng~Bx2-eAQ@Pyq02M#tC zZsFv7WR!^Sd~LD7Paub+402EaqVB=#K9?VkZZI55i&^4wI0-kvd72>B7ysrc>4j|JkMIp&|A=(2M68gB@S(CoAbQ8e zaE5wd_xK7u+)m7e1l;o~vO3iPd+s{CmIAL>kCCySI)ZT#2;W8zRAf(3Pkf-SqsIwE zx4r^1Ydq8oZJ@`mA>F}Da0-`%wou31<`1IUq4`quQTMs^+%_(evvXl^$w+*Cpp#pL z9N;{qP^K&a>oW)ABo|fdAS6qy#{7ANb?c23j8^Nnr`ypZ=t*=YYK868eQG1{f|KYD1^PP^E>Bl1QSDUM&{Sy3waZ2X2#ffqoSfUr z&Sm$*1=bs>nRocZ!1dlqXTTnolBbavHj;^wU6+L;wO^xX2j(nD@lqZSZ{bUw(I`NbEJKzJGA`vA} zXejs#KQO`q;4i8}u0h^>DY%_UaP&Bt9A-ZD^+1K7_*X$IREqkFFN(*iCN5*$CC|lP z%e;no6F#fG(mmRHCV4(}CtO>(8eR8j_sdUGEs1a3e%m0+VRLokOL$pES6nNvfYP`W z`N}yZ0cEk}H+cpWe&-M+7xEb~Vm90vt z((>YMg%x1vHWW`U-BA9avTjwkDtT3~VS{;r(^HHlYE$*V-3G|sF^yz>WQ@$n2(s&n z_wsPMtJGAO&vkIzx0Trj;aP1l-?d~~yv(bN+l`$~m(0&>#m;{GNTEHl!m`LM^c`6P z#R=tM^*8Mh-5}R#t_iwG-5?#WOV9=BI=iS{c$YBO%`SCSPFXivM-GM>@sgur7-jZy2XSrz3$0-S09Lt@PSsz{}3`A#kU221!@(UrS4D<^0 zE}!Wz+Mnu(o?#4qgS?MbcemIV2?gF_J1&rW%&&!)Pfqlt_5mIJKzEY$U|P$H6tAJ+ zoTllj9jex;qqQ!Y5VfCXvf4#`M`cuRRjJhfXgX?VX#P_Ls&iE{Ra(_TlnDhK9y0*=jzTqZI!);Sj1*W0|UiIyFf1j`r80BaB11nW2J8KlYFvyX6OIF0O2 zZZN+BcwGamx}&lG>_SCB16S-N{wGud?P}XsD{ETBtUt8EAOUE1G~+axwxXC+~o_e|G}Ylfx=XcIwVk>BK;wEOM0R;uvQObY=5Eum3~QbW)-a! zzDg^|4$@SziVh(((s(#4*GprmCv*mp3|#*JwVTv1cTm^pkw0;YoIu&hBjRT4p_hrb zND}Cd_v{QN>nYU?^2g0Paa0?q(@~@ z0eyxNsSx3!132jnWYy&H+2RgvF!sOoTrzt6{ZPJj6hnksKw`fkC7=h?q>G@49fJAk zLB<1fNrRfIF6xS}#CJ&nRM!fu3HUtNH(q=~v?ZoO&3FMAXD?t<&BR8;Cn;4rNfhIB znn?8KZsbyUJ&!}5eh<~dZ73aRU{WuM0mKdJ7FIHW%n>hR9JA67F$vwDUi^$6r8P7# z^@+)-Isc|kYy#4Ml4u1ULxT#sB`T#s#8a>#f#gu)2rAe_VgtE`_(aYo7vSf8LJB}1 z@)0qaoDRhLI8=sJ@VXvFHS|ghB>mwtO_zQPeb9e2LelyPC@<2*P@*d;!kN-q>?3WE zV{;qm*+ybB?qe3QO^Ty-W1jhvU4U&Zf}`9GC*)+He>efYVI5Kec8WisE{umdQVUhg zD=`@kws-jNXQ>nV5Hq@sW$2b)149fT4oS12iW!L->padlnh!KA9q;uN*S7*46mk%y zL1Ks$Dft3rA0efQgYo++{QbC83>W5f)Bw@=^l8A?jOc@glexqh(w|I0T?lnEHIBHC z%y}(25zovMo%B24T%ROYAZ5ti#3yEue%@NTC{6>4zgoI2E+XEGeWmK;AZa|1gF2*) z7)W*?S|ClYoTx`WA@-Ab#0A2gVARvIp`SX5 zyp*oEizk6kUPaZ997Ck5;AYtJm)THfzCq6~CjUHWFFH~Mf zp`=ZRJ2(TqpPU$mPrV1I(@RY*m5t`>u&m%ts<(4m?z=O5y!jK}9WjIpyG zv!*8Q=@PIY=g5b|b|_iX&>z1?eclr@peA~vUc@-83J*}>je-xsA$sFeUlOy$GI4^m z7|N~P;%MB1-3X`fk`@tZa5WAku3!{UNUMm#y*P`jltZ1Jf(qFexetAaflz*J!YDtD zah{IXR3LSM;Nc?ve{PfrMcx_A=WgUO;9PrAng0Z?EraTo#T}@`Y?uU9(m7mXBKVfw zsQ-VWyKPHoF&b}UCa;DHKS6qjS^b~51X?mHyq2fMCt$p@fy8FubSESX!2Qqw7+)Du zJkA0~+JdT|!8-O0_jE1gMvW)pferu0b!>#5*prxs{(TTKyU#)O>VE_r#q2k35A>5kYRjb5z55?}nPjPwFI= z61&jdeg|WC0W9umalSMYf7TE|P(x5PkVATn}RNMFzi{2dXeadqBUS@NO3JdLOH9UNm5jOZ~);qWK# zB11C^Xwx{N8JU1=p}xQrJ%9pECFK}t)yWoE3-ffVq+PZD%*CHP$P{9pbejCaPlBejujqoco0WrP)*mUW>G=0D3&vR%%O46n4`)h}FV1A{%VMSZI~^Nptx3 z;(ydUDNEQX>d0!s0`V{tgLLlWoSs|@CESau`6=;w!fea>kiB)1pnIN?hRpfrY z6ubQja-vj6d`T*)EZ&!XE-J7yT@$KN^TgqlKlKMA?UrbhBFI(f_xtkIP|2PZx>NV0 zF~SgPulQD2DO|E2C9b$p^Z}x}=;Y2xi-9*MNI&F*h3#aTW(L#PS_22()fKkV%ZW6x zkJO%5IVSTfsX{J7yeD<1=hJ%eKiP4i7jcaarGC(l6<*Xu>5XDExsGd1xyjv$3&JI$ z9uP}2r4;4@DXQQfa3-1|#yHKQ-MI~`$qX>39A)C;f$n~iUNTF>5b`i8h9Ocrbcuub zlkm&b7WyNj;Tm?ea^Q0Bi3lbfSw6@bB3q+NYfH8#zo1haE_su=bR-#!-D(rou3+*g zStdOJGLtUulpdi6FNH?)2vLSqvxnG+bFohSB=+F{Jx&fmH@^To?s2TXz-Wo5zz1E3 zBs?uWI&Uv=KahaF*kiA7N4TAQkk~@_AwI;6h>>VvKC(Sp;)*8{b?NCs0cXOFLOX{$ z@328aBXKCN6F>9konLIrof3b}dD3a)=8FQcS&ZTaJ8rOuN2iS{8;p=q<48U^EGw_vLFBDqX-M-pocRuWOYVs#%VG%I?WX5 zO@ai@2`N4Q5Ma)I+OAQ-LA1$M7v+eWQmpm|Hs=ho`{+?ew9(wF{yMTURt!Afk3gd;9EKfYgPh_q3-IhbfSB8a#CdQVg>Bh>c(^YG# zRvU(!L`yoj;w_HL&JWIOUV8Yps-x@~N85wmc^gpi}UNZw~22OIb$a)HU zE4ya+{bZ6xWh~B>a?G{XF%K|Ju-@h3iA?Ad zJjk!YM4a@pN1Q{tAmi)^S(`{i4q_WI2k4A}ml3sP$Fw)x&$+eLE!Tc^S>|y%U|Nlp zb(+WYs?i{9Z}5tswxJIqb8D4Ebgy>b>#|Ezd0*m$ct$!XtZ`g7M^r8=nw1rv;hA&3 zAfaexQL`c<|8Z80tfd7~`2o`dYd8Bx+aJp+OO)f7@QG}|bd^OgLy({|AG)43q=;-< z17_e4zA=~W?7)uUK0uYep0DC+b6?nY++Lvvv5-;&&z(pQVh+pasJdxmTxx1#)V)-( znsqKO;n!@TJEJa>`7j%S3oMnTFhvy36?7)rci6|;y&d(~`OeqYj^-2QQF~GLv2C)&+Sl6|C&jJc?ywX)4*_*IxJrI4*wWunMO4RG2#v{TFz3T*q?E`y$agC? zD8DNID4r|EsvfFmY5Hq2)HBpIRNelbkfA)Olqng-H(7|RH8Tht$#TF{W-{lPKhUN9poc>}Zb23G2i?eeZan+I!P)NP44fRxLQ9y%VfM0g zvmCZewjQ$GwZC?h;=Gyn{6pcX=tT^IF6JP#Gl%ISnKK73iRr3Z0<>=?g7jd*M2mpXuUWVAZ#9#u5Wmq8;jFx%5+fgLJf0;&`N| zJrNcPy95Ewtx7PF7I@qIP)kOG^NEB$;T+PEqEQijLOm{kf4m1pPBCf5HFX2hJ{gGN zZ18p(sCEQ!d4KbzmO)w54>iRM)ITTj_x3v@N9*+(z>Fjm=8|0hVTKttY7Kfk;X@Gb31NK); z#nLnAjr0;Af^Kv&u)u9pKV-+H1C{#^IQAKI7BkSJ^0xWwmAFgFSGOxiGyk!%$x$A_BGNi-y=_R6YgIv zio|`WfbVV+dWCAF1*mK*!isu6O0r;Ac`t4TYg7S-cpI+zi0}m`?>xr!xT*2oik(kmeR4$vY#=2maY z9;nx@p$fQw-fJc9l0W(=6*`7QjE>EycI$z+Y6R7OIWXjGWDGtR(gZW^ml8PQeDHwt za1C$3v@-BObVq-*5UkWz+=nD^!NKSz7NRq{1a8wt7|4wd22>1?3x*L6nE(AU? zhdBVP!2z5GwUikJ^$5?=^|k)iYnn05k^GL2jg zux^112lF}rI+ka=k1!QKo5r)*3GAvlxfZk+Ft$ZExDoRw4SAwk%9D~)MPR5N zAc65cbQzzaC)$e{u?Eb@PW;*m24X$A3-!qf+_fd>`zNAL8;p6?5T4Z}U@psW=ByV{ z2+hcPC`EkHPi(+C&p=`FMmUQ55RT-hcff#e!a4o{tZ6aW;4rKW%fQtHgO$XoAD9_; zkUBUU@7Dre&v(#T22*{gHPkiiC3%z)iEmD1J0(I(v<3HLI@tLdR3(&|i@_H9V(#7r z8-uC={pCu`92K-E+rY#}Aph|-IHA=@sO&1#hb}n?KRF)xQ{#{gwq7_5U788k&=))U z12G3(Zxe8DC%~xqq4Qh`#oaHk;eJRc9f5oC6#m*2=SH*0&*J-LL)+&^(wIeA*q09@l`s@15x+s_vKccw7OdoBjM(OIu;vSIG4uDr$JzsT z$sO0$9M5$Ibfrh2`YJ<;=6tXd9+>q<(60w$RoU%Ju$6I)cf1gqyG-sdi>_;P^RtG=-56rVIz)0#sZM2 zgw8Ss`NX0BXRMmx3fqf)zz{FRYV#Dh4GE1;Jdl!2KyUtXxxrv9*I}Lch8a~0&!Gpd zY%sY1s*pJtGlwu<4&oY8aKF;92JIs|!?)TEYw}exA8T*>8*7G4$Ccofw*oCW zg*luD^@$NY+6=KeyjPpxnCXpv{}pCXbMdpl!1sR*dxSr5)*a$M=m#(3S{h^Y9mjq3 z5tDeHNYy>@>LvSV-Q&n)iybS)>(EX=C#nk@*m7H6>mwmT-as{2d5{VckMVijccM&| zrhLQ9APrIz^wR{uRg~KMB z@^)OXALf#f7uZ2Vs@%mbPM+;bUzd+oO;x24Q`v`(V^H%CqlPGNF(=u%)~1%`&ep;Q z@)%v4=nsT;5ib+3fjjTSK(!=I7W1W{jETBIK4aF({K&zWy~$!j>R;J!xgV7ZwY5?F ziCSnPbz11o*XQD-9O4vRPWiEoIP40N0t{3rd7nrp71CmEp_EIGM4!J1>c22Z)4dqfya8ZoAS38~z5J_NH=FFgmBb{srkS27Gf;YZR#q_-^~e^MtE)tF478dmdD z)KfZw`a@qLlo%f^fym9pel!aTk``c=5Amy<|FD;ZrKl+ulJAH~q5=&`i1dzjmDeE~ ziPeZ)%8Po4)Vmvs4zgSJk8FWFRk4_BjFXgVuuHkWN|$x~OtPa~r1G!_Es7~niR^Nz$w53=*{v%iWV-|W9$aU6fsFQT|G|D6LZNsBF#0Td3B1et@5J> zaD-DA<~6jqvHh6>}klcJ8O z&oof}QvN262_x9&++!h=n@QXh5~aT6X2$}X!akK7Poz=0+V zitLdzDp5X%elD-0T8_h<4~slegR^mYlCRK%4R$QxPl-9w3SpeXg)5O#q1c}<1dtPC z4e3z&9Nm=}ft-s}=+ytABF9zr_#j=3yXGfh#i-=X9Qra+PoD~Jx%2EU!3PSEXlOjj#MvB1xQR=omBa-6K7kU6>3_2b!B(_FY6!*4cn9)c!>P5TztmiCg)S<9 zN|R?O|5K*RqNojgE;~pPnAVEJDy=-2d?+nLP1u}pF#VMNDvPp)ycvA~I+77gveKZw zsOqX@nLb3N*pxViwEJ_+SlK9AL%ooeBYom;TK*}l?xQ3pZ*pF6^t4U0q}iT0f3v-~ zRn928m#w2+Tq{XcAn$TutS_dj@3A6tH6|R zvYG2ylkEY{{*K{Ji*v8Ni6evGO2=rtH9L@nVW-@ghsfyr$0bU;8yxQx_+73jUMLb| zHNk_QrFSTt&~~d7cgfXUU1GO)a_!$SQzLo@j`iE(yE>p@jrh8!>P@YkAF{}AmwQXa zQgJ`$B|wWujv^LYdQ{}+d!#%`>spj&sAHOAJXGmdF}74&l2WzK+7`(JBZVGJOT}&A zIyao8Er{(d)fTh)1a^TbuykKRYRN?`fBxaK1F40i9M zPE(wbH`UB_Yv`RE;N`PZ7oaF7mk24GUiUEOc&nh6m+G7hzaGj5E(kgmbESEk*4idF zq9z4y($Rv!=wm+N(9lbnL&9d0Tb@tiuPSz-(Bq}Cc+)s5-*Z`(Rid&6sn z^{sidslLnif7&$P8F|NNpFGV`R>2iUmCiDxTlyO7miNpV{G}4WW(N*`ry}4UI?QF4~77s~9pqW-dFxl}I8%o4n@|<{pl8v9 zwIj}TO>NXEc31r)t;2dP82YWx%~skde-B@NZ=wHp@!jLko=Gb*p5`WJ4@o)p+4`#O zhse~Im0HHrYhUo4$mE(-_#@xX+R-u|r<9G+jq=jD)ll@bW@YvI>i44Tnd4pR&-PhU zilRzN3ojH(MS&&5Dz~sz%DH~BTBWf>RK2i&e8#JfGk3^vVg&jevvA&4!x*lQFFKzW zn%A}XVWq)b*IsT5wmK{?j19~Ooo3!dZI{23vGV>*1@RhAvHE;dU;v?1nt02()9Qv( zSlU)?sthnVP3tNYr7dlzy>GS|KlIcS#hnxdfSG zl25>n{*L;GYkd!hbD2sv7rXG^ z!D7B-!%RzZNB`XS=FF4k&)&c9{ac^+s4~eq);W!>#my35(@wR{`&OvDc8@5o`YgX^ z>ZxL|U2T43*k=qf&Z+!ZSza-y{6BrCQk;}hp|c+5=92?uT^WwDOKtd5ToBiTF94Qq zqzvR6>5X%cCBrbQVw$0mWxe&I!)hIGxL7qvKSUp8+H7c1USXc5ZQlr1Kc&Vx?oIp{mST8l!JgdB=3qvf4b=7+86_e7vEP zeYE(m?76bGDqAs7c8K0cBn#cS8|+)Yjg*MhZI4aU=Ke{ko@C zGL?P$@ye2`6CYK6a!KBhnU?u3y-VuYv^fQ*EFI*eZb$>K1Z4w{XI;6zak9p0X zc9uJRg~QxgOYM@Jl%`)IUKySpel_>AGQF9;y5kn=%$rmV^e2;Pt*VFT*5I!Z!>ezs z_Q7Me;)k%^8do*DVo{aa_!OzXGfgiHK~)~*FZ3r24{Tq>!Ls{`m#XSY4_Rk=7`XOv zWG|>eXF`kmSh~%gv#m2et5{RsSU;p(RasimyJA*(pVEgV#pO$?`WR;!dY3ma2W!Q6 zyw*p{%U+mY@^yXAE$={&66+(y%C=sdm)w@bJFigq93-6~tH6`(Ec*_z5wy zGv7D;yygdyaxk~2zKi7nYlC7k0BGA>+N@pV8x-;_w0h7opH8mJmG!AdytiYP<(tWA zcCn9j)^w8AT2+_JETz>d^%gsuC*{C}7E4V)w>uf?$XP(uzA=3i-IYTXyU9w{-`d*H zvhr~GcKxk#HN!W8NoypuR0h>YHZI@hu%?*lg`< zPq8O(L#d0J4&GgZ&WEp#xD+M?eDXM>G04x->ycQf)?iL@BvzZ~XC9+x2@sO%;%^A%omlN6`)p2?nA80#cyj#_-vbelw`Q_5t#e<40 z`HA@}3R)Cal=l=3K1b`0=y<6|VUP4K7u$|%*`Q_9wy!#ebaU(2zwyk-iyr5wHO8cz zHAx4)Ui`B0oAZ0b&uhQ#Bu+`Xla%p0GJR~}6VpB7wAR(v9C9TxtfneL6Y@6Tm~Wi- zJ&%2^k2PjlKOxsNwd79r^3+ubT3Tk?x3F2l zQgV%KjB1%?m{z0RuMSsb%6l`5$O6Ha&9jb1`anp9Lw~odq^ysAr@m%+g}z#)#=3{f z_o;}k*J5ag^bUn>eOjJqabjpY<;7Z)TmqSjs6wto&r%dF*pBD@sEFg4Epss zX;AWolpZMy|13=G^eglC@a*>$8-*d7N!~33Zw8sGWe4zn`+djyy7~6l!tNyzrLJXWy;OD0)<}v~b@Yr0TpscuNhP9Rk_8AVFW2SREP7P

m(HIhWRM>Fzzx-)uZ7k@LAD(}*ph@wsGQQHo{K?)xh@c(H?Jlp}rg$WKZ1K2;G?%&V!#qxV zGF}TjI=S9bZ;(AA#`B`1o_(TilI^6em94&&v}`gBH4?^t#_J{3uY7`mQH;M(WK6yC|IoN;iDE2NpqAzqI{B5LJF_lZ7SYk4GFy)=TZl^IjF z?#Ftb@jYsd3;N;yNpXe9f`faUz0!Kb>~7eqzguL_+mq8GdwUk28IpB7+mx4Fe6(Vb z`ITc9Ujry!2HZ<3L6R0ST~t+ToF!wcYwq#nXthX&~OqNP*d0^SL z($8frDs~#;EFbK*xgSzKJyfAqU)9Xf9@ehVzSLfIneBSreTC;;&p+<|x)v&i=_&o> znzBvcaMUB`Xe=vpR9O5>WmUSWvMN_omZhP6f#Vnw6YtxeB4JZ*>tgTaoW->h{+^>U zOYnyZ^dwH7zratUd^D}ROM(|gy4N~Vb5P{c>haZAMwn~rV&2A$tt-WnwOv97``BIL z6pg6O;$%*AsBQgBe=6>lY%J)R>!1BNb5+LVj9Zykb7BhJ%dC~-&G&4jj(q2AxSX~K z!Q?twrK*j~72Q*pjq1CybHpKj99!YU2^nl1_K9PnZIpSZp+{v@#oUUIl?{zm=2BZT zc89=&^L~M}aIhFSiQUfi4$Shh(3~TyYgpQD1mV{Uu*9jBoFZ zw(T{4FxEFFW7q3z>1y3%jkm6_Y&ZLwKbVSfdf);}jE!`hbZWVs$glg#t>j|(Jz_&< zwM!4bOW_%{b7RC9*J!C0RqJLgRm_t3=mzEnPvbAvniAaFi_|KR=kOV)0w$TOs;28- z6+Os1ke!>cDQ!+lT=KPKA=Nc&U4CBaUPC9_Aa*W40$Mpi6INO@htd9rOB5w;)ZX2u_t4{(P2wK6~bjPfa!F2-G!T*nG@-}9M<@EP`3OjU4- z{;EBip1Ln?As*k|OI$x|Qd zzw>^5_{k*pNbZ_Fv~-v`luMCrQkhI=g+p~;Tk1N-bH0z!H_&&Jmxp_M7lo>V){1o; zGIPJGfQnx@q2OMbSejT8Q=DD6ywFm#zHEKfM5~jitm2+fcsNE7H495v=kDRNWHyulnocq??#Z=oEYxFZ6K*mI}b&d6e z<&1fmxre2JwUh0$?S}2BZL;lz?Uj9{a}ggay}(%|H;~gPC%i~f-obTdwHZ;38q{kV z+4OXy=?$d1E$U{(C&u51?-V;fDzmyFz~cIi60G~nX6Aj%Je)o?eQ5f?w71DKlTv?< z`MEUld-Cect_5a&SIZ^ggnYEF%yX|#fzJ)^2cE?qmp!k0=lFW~4fKw4JtB`2T3haw zw=Yi0kH}k+yE^w}?(^K(+}=5lvZHdg=M5>IUa7KQmx2{%wUKT$JYqecc}9C(@DjaR zdk1@;^IGWH&Hb|rrRqr+2t%DaZC|Wvn;DsNt8q5K8%qnE)GeBSTk@<6?Qb19&hPAP z?jCZ3=kiC{RX`^s3vGF89%?n)COY~#ZsU~H-?m4NFYF6$uCQM?A{~~UcKa6ECw^A* zq}IhPr#DS#FsAO;_>#I~8(gk$jGI-92=?+c%0eBV^yb`%jDJ&uQ}(8GPPL}INuKcg zYoax&Q%du!x<#|Awy=F<1-fD0XZ+s!U+_Qdzrp{kziWUjAlI+Tn{a=ij-j`+(Z*&a zRPMtJXPR63o%EoLjP$Iu->FPm&y1eA{YvH;PCNP%ot0NzA9*wW!~8q@HSpE=_VqjO zKPR9EqSbD@O;SH$I4Oxg>CCqYmRXj**4?%U`*GU^>mLhcEwS#j=Q_9WL6U&y{0n?k zq_~H#hNQAawqRS4ZMi+mR>RubJk&H&5JvJ=SH(S?2KA!Jg<;WFMB9f!iCS*Rze473^ zl}f#mnwvg0XKe8X!%F9RGEOzsP4YPu;PijtbKJ9&=U(q8zI%KVyw2(dD~5|}ES~y5 z`Sr6urq4{Ro5H2Y(wk=lrY}sPl82^JIo(T}nRoIz%rVUfx8|NP-phQv{CK}w0owxO zgW`jmRcqoab9=1JqXvqLIFoZP^vvrWi)`P_n~XILgR2@C-kWOJzj589qsTrCfcESK zxDvSEz=U)lehb66P>0@9rA**Ox=j_UFC7v@CiZIO{ zm)2hSAv5bVY}Tn&{bm>IkBz+?+rRFQx{u;p)hVg@F>JWs8kY>R)cRiEEx$$f=Ik+f zs=_)2qjPFxTug11F3)*Y^lxRpZJpFvan?oc-oj&|dxh&rSH0^?_l91by?s0zxNK$; zxMCAq*1OC0Z6bin(Yc7`LZR zfk_7ML+nMK;&0^U%@iWI^Y;Fh(+0L;Xt_pzTkl!^U&WZJXv110);z=B^hr2LO_RH; zc%_GOmAaaT6mq`Kt%lDV-K_T~RvDv@Y7%`n`b+eHs9QDUVFCW{bZe+Bwt5xcN^B)J z%bu3Y%BPq7o8K{;%N(8kK2Kc|Q{^3kF71Z1B8{9m>RM_vX9Eb|8aB{ z&`~697j7S)i6_K>5S-xd?(XipxWlrzFS@w9yR*2v2X_d>h-ZA-yZ`(BhXaQkIGIj& zRdv<--uqlj*`QaU2O~QcF-L9<$+pItBH>RM1@(A7^ow>qUP%zz`*(Ujd9V2wiyhRB zdJwvQ?V*(2q0fYif0mw41W}RXpK4RFiT{fy#a-aK;xracDyUoNaK(D=yJxz4dq(<- zise;a-%2@{@9Zw4%kVGM_Rk#?i#AAVShaJ-C8h19&X=iN{z19-Wd@dwDZ9MXsp2_B zVuHHS#{!}=)LqekDiH3SUr;2sX%?Mv{nyZ+Q_}8aPjmg?H>g{oB(%zr!e7!Vf@fbD z&ml=*yS2C}lwPOE{2~7}ZyWC`Ulw+KS?*5xt#h_!cgp6ocIVVDyzYA>Zj;k-O1z_1 zfTr^e{nWVF8e?B&&vP_&%(ebBVEAlF#@h> zE3q3r#6&$EDpurcDQ)D1q7>Ner+nkR8{C(i```#Ugw;ZI-gUL|oc2HB)5Rnu94RG{ z#5Ppvqq${F8kJ(07B(hfemP$mOX7rte@dp8D_5ah`ETWfa_`HREc-QKW05YluGBfD zH#`ep~ZkOe z`Z^Uv|6}S`WOK=!(vM1vE>4u1R_#en? zd?R;g!O9#meZ;p>pU!_)f0W4hnbXvH*q!bwT{xt$nQy+_f{NiPncF$O22;T?wtYq` z*P7|b^n(v5jlEAakj%c>uEhndb5CY<%4(C7lwYQBSYc#gOhL_pk%gx`iDDPM3Ehti zGp)CXmJa5%re)^0)_x8uI4!86W3*+afnfL2U(m6CMO=sOc?@)S5pq?b4PQp+F0GXd z8tbL4BqEs~%J+qfRl>%`+FKP54Rt82G*X&mI|Lb3Wu}6kIN_7ThnK<+aPVs5oQ5G{(Hl5^SAj`DA>{ zoida#wK0`7B+^^8XF^wRJ!gvoOF`XyBCl8Of!sNHpK`n99LQ;rf7w;uKT*7(J|TXS znN%ybmhq@5(mc+5*6OlPb?mdBwA_SptD508=VNEFJ(;;w9Jx<_s0~+#$c@4KQR z^#W?HX;aX+@RCIgaZ`$pC>C6FP<)l*S4u4^U%tZoGNlr8iq?xc6!yvX$e6*^tz$tby4bazV$-|CV<~BH;IMHL=jwuz;u6SU#d6NyUN?jGut)HsTRIt5(3kxU+Qvd=G1ZSqQ%}k> zq#@w8bPy);CHO{xrM?HAzuiCFe|c^GA%T9#GAJs(m;O|ysXetR`WNyLQ;YL(@!Tcm z7rln@8h%=S+S=L5SjXEIJFW*U4SMV#f-8qc!yi~B{B5Ws#1Ztwe!w=~df9vhESX}4 zV746jOWBM(-iD${d<<>lWd5bUx?k}v@KyBA_bm3d@y`z&4Xh7LN2hST--gi|kNv>~ zu@Ok#t8ofCDMu@RD)yLWne9C5M^gBTn-=5q{rPFoT zG;Xu8pLwp;;dm0fJS-;iT9M+h3*$<}KaFoz^hJExxPdWj^t7nd@FO9DW43K5xVvST z8q_O2U#Tli7ET9R`09H^SB&dL;nad6;7gCepA`#?h1rEeaBhC%GI%1rkGuzc*Ze;N zI?swuai(+>XVrkTRSr{T!V9_pB>po>6(kJqhHh;pa@;18%PAXZClhHM$pTTBCui8@ zY$E#uO3S@)rDoGN!BZ*;-N10DU1WGCg3$e32S>s3nv80E~QIw;ihrc=%C@D z(Gl&U#zx#!@)eGKQQzlm?B&g zzJQU_1D}2oz3#D6j?_cmC>ueQ>#ok!{5newV;*sXO`j~W_DMm$kmT@9QH!I0#Qcsu z6lac4i5nOGDQVro*2h=KNH#j+lUigRbZxcM=1`u3<4p159owMGp*UlNTr-_inL6zUa-YEmIR#)z8jJn zdNZtU__FZS@Zu4_!b^mA2%8YvH{^FvO~=2scb0%D(%6V=#l%r2qAqk=sZxS?k{=yN z^!vSTPn@T{dx9&=x!d`tv#PV4bGq}H)8rcD%5bf7CwT69R(l8f%KB6N*8)5Fu1J76 zDo&J2gRC|N-t)a`DQHTEfSoWOG>?1aO6Yd4(v6ur;7RWVcXKoMjLYJp;dLEoC~3&# z4uYTQVP~*9Gm?2h*M+{qOf@725Sx+G*h9MpMd3n)2VQW^o7fGE*;g~rM5B_Fy1XY1npySxfw&f}qT!t~mFQB(RF?BFs zHiujKS(aJ8SsGhMBDO#Z3j|u zmdNX*abgGL0nG`V^k4Gv-U;43&rDAVWD`DiA9Y`K=euir4tc70o!;ZV;r{x8cKjd0 zXmPSMQ=Y4gSGz&C(SV46iW)ov=u*!!)!1`v5pE;;@i3sIQa>`OM3o66kL3W=jeu^paZCFuxgxBKLV%1>pAYDSKB zX=sb+!34gl`eS9vp9H}OE$-&Tru12lkFg&bJ z!Qqjikgo)W=O`sc`7U3Vhs#Oehu;TR_aO2OZb)C?nr@E$#80`SvJaZ4jkr6V0|nv@h?6hjrpp4?(+f3df;K~LE&WUGbo2~gK`$?i&Hhx_pI=AM zX8%#m-khw*s7W^vQiS*b5txtK^i9po6s3CMgxOSSL)EsGx4mMfK|{2GJ7hg$-bY<0 zYOrQY4NC@>K&{npGZ#3k{wI?{9Ys23F*?%lPKT~s+oHVFpax_L$n^>(Ple~`9qQ4Y z^wC-iWuSIKX^kfqDs178in-|cbd*503=9*xDdnj+@uX5s>nlx@v$f7tI_OvXlro@B zW|313*-RtqD|rvj(vxfwOVF{*X~TJ@7`+r!w`6V~*Ahgzi_`}C8hZnrsH@}~Z7^|= zA?Q1x8f}L^XgYC_nnt{YHutOAS8GD`C#q;uWJyZZE0a6Gx*DW5Rq89d)l*t4)elF< zbJ?yAhnM7sx(2BVN%Cn08U}3yl#6z4z7kBh>15JDH=ypq5qb%$@=dA+J%rSVH*9%S z;HQurdkJdCQ)C@*a9qfWZict_ehoRHI9YF#mnaXBDYHQNqKwxDsmtUwN>#9c-pV(n zoyZ~Ht2ER0g8A763dN))ua2^xp_U0jv4 zWRPqYlHEX;t3cL6UXll%oO|$Rw4i>{f3WA71=J(@Cv^gJm3!bU9HtVOSdd{hk>lZZ z>U3|jTw)J=Ud7(#pCKFm|5>2;K6=q9w%f2!H?S@6T! z$Sc(kAT0!I8)ZCAeCk#yUn0O6xG%@+mEkDpt8G$!aA40O70p5>f$`!;jddv82;0d| z(BroOZLlJ_j{XC=Lr<|XwgDTb9{C9K*@#~M8h8vJ5NYHkuxrW?BnkBfaZT@~y@2lY z3>*+g!MgcRFMzhYA5I;a&{Vh7f1x_v5lJ0gl>cRccL5vXwj3${&&RL;b(9XuNOidO zhq_0uuMX5iWOtX;`svB=rnV&y!%6-CtfW&!YkCD}qSN6dSwN|5UAh`nldI`M`Wh8a zx1{P*6X^%kI8byhll95D@Uzb$%INpt>dsTE6aBTis4Uqvi}nezPbwZ%(R0N*cES5AE_(hH@Sz5jpph_C}?Ad-`a9?Lg(rt z8G&oF;}a8+3|T-nM3&$aun{X$wP~3;Pd%VIGozuNolae%m*5KbQ&xHqSqr0iD$$-g zt|t>4!KEAke%${uD$c{PkgHC{t|1+t`$P>>x`U##UfHEQ##{P_QeW??+Tii1`v1P| zJD{d|h+1H0&>)f?BId!jArT9qY;FQt(thx!6G7VhMb@J0!3lnc2!=;|82k$?l!F4C z4o0q=Y&2PDq-2g7?>J^%VRH zPGu@ixV=FDq2U!PuX?pl>K=U@740V8x^u~apbp(5eB@Z1>rM1|l0)6%3iX|w zMQsANtq;b^D6BP2sfy$u)L)<@ZzmhT+qw%LAqVkN`->E`mC$_S4XB;c<1~-jT{mmB z;gv1`?>Pjc`VGi{Z*&DSzbf1VhwvPS5nVJtaZ23;8jb}2{~4_em>Nr|IQaXX6LFxm zwINx08;Rr^G9B}*5%n8B2AP}(f7vvwG2_8u=nm3#1bkTI;NIwollOISc`9r7^iCip zJR}CGM|27mzWUHC$HMRa13amJ^-5YiboTx9Kh=G3zpsLKArzdprCKlDfK~WDu1(d7 z!XtbDGocGH0v_^L`bq4Y_UZM}Q+Z2vBMQlNga!JY&G3~h(^H8Va8Hb&50S%AbwuBb0B?a5{EvFt z5`C)L2xI*)5d|i}VSTPv2S4p1oT-xGmnU(r_95GDGg$+_YwO_@4Tjt+_}(>g6Nnd@ z-U&N~47i)a$pX02o)Ay|#|Y5M5syIT7z?sYCGt9GIR`*Ntcu#kAmV}g7BsP3RDVl@ z342z%qmR>gFe8?Ok?|d#wOBa&c=*V^!+lc^qi&l3{eS;fCpfP?9exWB0*pT4F(6ZBX+Yl zu|t}!ufvHNEMPJmz8)i7d9R6<`f%L26mktRr}o3gl8dL3M*h;DkjdH+q$X5?n=T2| z?)`doq$r-%HEloEngw8tc~DWW0rG?&o|DaRZSRG{=WnRlH>$wa>eq<6dQJFrDrz%` zY?T4={2#p{bq&OqGPtIxT9#fF-v4w^8H$ikwOt^&5Li2Uk-Nz6+7NJ`-f4$1YO-)Q zXOqET0fN?myLt&snFV@z%=mr8U-0Xd(s|UTM`=0OQw}Clv~NToZ6tp3*PxAb)duKi ziKoO`IF?>%x3RB!fw@)kJUvrQF?*z}}9LCED?T5Y! zSF;8#$TslY!4zCX4MdbNAGVwTvEru zW&NUE*WDy&&YEs-tZHHKul3h@t4*~s z`UPZpZP6ED=UJfqi?xx{cEZ`Jf+NyYzkvMP8E^sJMOUyk5~}9Ic~%SGDN%{h4-wVD zOiET4fN+_NdgwjST(b0wa1^#8E~2aYzxQe_JomF$5f*9NL6Nzx^#((RCniv_%oG;X zXwykcYx}VvXGo8*PT?QI&x98Zw}g!h2@49c)i$>>%%pR4Qk^Ot;&=GJc?EY<_aj%L zi*;3Sjc~no-FEl)tn(c4n*3xSjgObs%O$aE&L^r-gTO9+iqmf>To$o3hf#3^*ORC2 zRW$j4JV34`&yq`lKsiTgj(2b*R;%)OYfJ_IxE4Ja6@}^yi4)g)>>w{wk3m#)ffKBQ zU$aiDsMS=z%hj<9e6O|9cd9S&W-o~~p*HrVJGG_ypYWD-!oKIKBB1K^7l>`|!MW}$ zd`D7i8Y-AMAl8=<-U|*fNJ^2+%AaZ?_T}xFs|K5;tK&fEzNp6W2_+IsS1xzCLYs5V}So&Me zX7f`EN4p34Y6&Bi5ky_)o`JADw>@zD3`z)|74*Sg&zfVL%^oBNtD+F)ce=Yddlls8 zP0xFpcQHS`V21OJyOytXppvj#s;QcYj#Mx+n=5N-ZaHW>;3yV6ETm89yU>%NF`>7D z*Ezy$tIf|1cNrDy;v(gw)Ihw#KM4#96c4;X3WVGL%U>2L5N!h0kww=b5F99luhxL{ zy*zLjIlmowCtqDSgeqZ%H~^JPpS(r652e^Z^%LB|32>pF0NKldk&{SNr9LvVj5TbF zLgqzHD_XTwkqW1(^sHI7Zr%DF>u<07qGsnRbIVmsco_AD{&B(QxNmeyOlr4`k6D}YdN_-Fjr>A+G!e`8Fm<;z41N^WFY-o|C(0ak zJDdn9YkO??LUxgR`Cb&X&3>BR;aAF!>)(Tad{0SDeU>>UcZ1XH?=5Z7|6?YaR@iL8 zsi6ZR_D2nk?jQ3hCL;D-j1+yj$gjxp;eFxs8e%Taog;gyCBy{(eRm7z;Q}rHdw$n~ zafK1+BKP!N47?I%OX;#-d8m$s|F$&FS_XBLa#nr}j=xt3@Jam2K$^d!|AnuGuY>Qn zuZ2J0{}ssR?cy?tRR*gcvA@3#zSRnxb_TJ1xmw1#7H`m~$ndzO2}8{3~UhlDlY5+pHs6#K8g-CzN4&^Wfl0pKP@`XURdMAy3!T+mZ(Up6Jv`%~d#b~i7Jo{)N?(01>A~K; zKdP!j7$4Pz>`6rHFQKC@)DF_cOtCZt59)ylk+bt2bQnCPo2hG-I9 z)3Pz-VpOBJ?ZvJpJWFU-tYl2JusfEzR7s(EVb{z>KVm-Jc>C~mpEvwF^;7X5?b9db znmtRzc0?X~#cXlJg`SS+UxbQ@i~Sw@B5r*AtoQ|S{bRaBy$G`h@3)pV2*f9;t$&v* zu^=b+cFxkAZMhu_Cc0|`awU^~jf&vPo0eD>St;ve^JwD;t}{bYHS{LRDsdd2<==tc zY#a9gXJJ81!R7pa^DpEx1+Id7&Vim>|9o+$vQ#fcr7-aZ#b7j^FihbdGW)5y1g%$B zCrPXM!Tz4Ud)_6UKJK0Fqeuoclb3Cl*pp@aRZBN)&~ACpkNx8M*?MJm{@v15yMNiQ zMGl(g3EA0aeoXl2d%gbo-;X~(tng^S;{#9bJSCnldr|9EsrS3SRmoiFtS0SbO(7TK zbIVSxO4iy`>qd2{;;m9+VjBmIqbCKr=C=D)@VV0apf`N-sO0^xroDB3*!pGvj|OSW zvKAKX^V!rqc8T2?QLgCLQkfN6SE*NRR@LT}!pcRJ7!W-q=oGtF&h~uI8~6KrTHVxE zsjt)aWsc9eS#T8kiyYyZ3b&H6yR}r%p|F}oj>evhA6N84e23Uekxa-7OB&N$ZR$@i zkh8w03%_doyqhBa9FX>J=7gO83hbVb{z2jdbvHSWRSn}!Q!UqRT^*erKWql;MU#oE zNN!Rp3q!p5aJ(G&J^Od$@6nmJGD~GA@jMJ9g4?v2?Gdu2{_A! zydi%N?A2pjyH$;PR~i~;cJyZs3eKGK-yeMt-#$qm`DEn%pu1J>@V8Ih-Tt`k>ndMH zq*)5zsGaS_V&0XgUoNX6SLH3;C-vN2VP5yyN}R*DYTp zJ{j=n-DC5Mfp7o*_Uv~*PXl$Tu|!z8_|u7U>7`}&lwDOOvefQ`?(tiSybOEcm~39g zJXQ+=+gw+3`((zXswwwUvVZ=S);r5osCqvL6j9$69eXkHzmnfdW|uvYG_m~SL~neb z=<%Tq%wy?Ta*H;SKVGo=ch!uMX=KWvFC#u*|5oLvo_Z(ixciG7MwX)8h6avKVFN=A zL89GnA8U0QLf9l`H))Z-d9ORW70k(A{%hSA^<$II&%f0EUOBaW_AjT~e@dP~eqx=* zDDzSC70V@io3IVhok|ARG`3#b?N-l^y?XZkr)!{DnddhSMt}-VZTTD$5Y?TI~|E3S)ooQu zk1I?szqj|J@?yEi*1T_f$5OOPYZfI~&8!KgAZR}$E zGyX#jvFX!#70M4vG?cQI7#{OEGPTHxsE_tw(`=j5_E(k|&6$SSEJ-NLLx9}3h*hfTEi{e6eSZ$_fhJOtExd-$it%R7)j};#XJG>9` z>Sl!h?3z+3EiJo_v$wase+)lU-au?+42I9f59ZglZXv%Tm&crmjt~E7n`219n$|-p zA;k(S{VuP?*VtFq)21*pFFOBv;eBtGWTclF&ztX?4_cz^LQn?!R<3Y4DlU3jkuQ;! zh}588h9!DwsSW?i_tZ1ceZ=`D|6WdP)~Db7v)R1ig-^Y2r5@xkaBY)KH7)HetIhMx zBQ340vSqKim(j~KBVJ0!0vCJ@e4~8_y@Q}5>+ZYnyYFr14f3rEoD+8`#lf+Q(u<)+ z7leGC@k(uZFfy&1OMmcN{pbC>zo-9=f4WdxIY-Y3Z(fmXu(Q^q((_7`DZj9aqgraM zX-$7Mo>K90OxK87p?}kqYf*OT{NDK?zjvn{O1b*J?j!BighxpqD`ZT~YwP;U-#~07 zN9dJ}H-aigq{S>qXjFPfscOZGM%A_5Wol97=n2$GwX?r?-mYJ7K9BkE{sX*pUs`@& z|LbWci~P1H`M=#2gb{kIF)lbJqEf`juzI1ZLt2Kc2`L*oC!~!d0c$`6@l2U3b`5;= zb%K(3mjAk+;dk<9_$YCo@|>8#1h_v;r7aJvs_m=os&$ohPSCyZ`BB3o)(5|^TxIW| zLX`|+$wt*8eD%t%C@{N)Uu&#HO5=qxye-hx_uE|;+}~tZ8TUkYE;?ct+|+|wB7!S zO;Shc%gO73uUP}rPN&WMe)Mg(x0YYV!lc6R-=9-wrgzJ%mpfeOZLDdVWa@7$w2rs` zu-12+37Zu0Hu#zSoITBQnrs~S+dbc1*4@L|y|8?Kql^<@1D`tm7?ANG`%wNQ*Jby5 z*M9d5zMk%6yIEvMpU?%Ne~0V~X%u!jym5ph(jW08w1mB(X#lr}E(1zj1>%g_T9o_= z{$;*Zz6AkUd;oX-RfPqkv8J|y>}&4pIBL_8(fI*ssWHaMj_JW|EhlNPc)@xbrgR{6 zVyRq=-xJ7!68K0UQR*n4mqa-oSvue3*YX&U*^Utfl!f_B*3udx1MQ+V9rc>-+H+~S zP{_X)T;gYOwlF7<5U9$ZfD5}TdTUL@KP8V+5?LiXwQ;B-E>^avZFM8DQnP|q-Cyn? z?~rt{55Lh9>sz3|4(?dgQEYhFUUWR4M((SztjUntcgpW9PDOtSA6ooH)s|K2#56Eu zaT^VGwWepMFHxvk=t&!&5uEkq>y_urUVlk%Qg|n)TjtE)N7A3Cj?Z_IpKKmOTVgt? zvR%2ZrbeNsqC>++nKsaC>Bf{_`>1cC`sru=cM1mPRn1MxUXb&qFwcFmAU&&5*2&y) zg|9shX)JiF6QLsrCQq;jO!MveAp=5>IW}9nSjXA6+s6cL3@H+F&i1FFK7D}d!n{JF zSr2w9)kgIQorFB8Ht0YjkRdl%?krs37fZiXLATTYGMnh%&`R#oGuU3%Gmahh+Q!~s z1@5A@7>j`*KacgP4)M4!68dtaw5#FLp}=Dw5$Mg26RwH@shk`xRY%6vGI4|SNoff_ z>@@Y4bQYAq-O6R{mEKm{Esqe!^0kChQYNa&E96JQ3BGaQpTIbwr8HC72p)S$rJQtD zs3>k#il72toI3;HO{inMzLT9+m+FS| zowm0$CQ{Q0mPs^jw^;0btZSJ?3Mn5@T1aF4OZ>})$AL<&YWXkof^+v|M-)`?pXQC; zHO>m|Q@)16B#q#18@I5L^f@-(Jk5I8J|!d}EFi5Vj0= z4cU)0ox%J`&X7BZdD0rGz4%ReN)047@SS}##Mjy%`fIAU!N87F|4~ZN4-MtHew@Q} zfeRrCU8EW@-$A&ULzN_yE}mMkv%)`u}t%x$b$){xW{6znf3@)I?>WGVc(( zNH@XXSLFwoZBR!ehrT599F(v!=n!vXda)tgKWqhNGP<${srGbnW)(VeHNd1gME7Kx zF>%ayrXP|I>aoAMgN7T1S7y!J-?})sPUM=1Wc+NqLNdd*MT{#lDQ0iPFUuHH6QllTyHK28ximoKB4c6upTlJYru>4B- z6J%POJ^}>d_DC<2iJDXv=xp6+ifKX@&_h@s`-;h65)74%Zji)x83q|@ayD+S@rQ9f zr!fzqKWTw(O$w+U8^L70t!`0rHT3yX%mOl8=#txmUfA%2x^BsK(Q&Ek%7=3^P-7LqT)FPYB2*i z%cIEy$Ww36EMUIT<&Y45j_%0ZXX|o#$WDD~XlW=9RqrUS5xanEYP@ay$i1X1Gh?}N z+zqy>;UagDoIvPwZ}OVni9X9sr3T2mR33FLuX0G!wDXEf&eQf&%k(4iEH#y|f$wmY zv@%VReO!quq$d*3wTWZ_6;1pNMM^7euG|v(kS9`EF<*Et#vt2lvFMU!O2v>kULF1a znqZ-+P#)Y?8fo{ziMEns_5X-2R06sc|D))}fXA`}o#Qv!d-WPN{m2B<+` zDD_3xzLS&n3RDPaOYex1ND0^tPFP267gAyg(o0wRA2W?T zN2Ny#82WD)cewEPZhk8fi0P58DB0^2kMu41@EI&fBJ-8-F zVq9^>7IqC6_jcie+Dr@8m*55PLvq zs$FN+(mUi{+*A61zo%Zu+)8Yu^f#}?y7V601BWs}TFGqCqScbjHSB7)g6T3*{71V( zFj_VB1vyJKOV`kGSt~u)>rs~oq+yV6L8ngyLGnLlhc;do>GSAGui^%1!T zbKFoMZ6;OIGr0sG!+oT))uQJ4gg@Xk`I$9h9qe63=oO?(mfqHz!Vr*}BE0d$Ci^0B zDc6}ZD6t|#ZUFa6;#9FA^@NQiTS&*8M@+lb3c^&oEJaHjC_5SLOQt2N3a=5*ZF9*d zfkUP_@_W|-tIP0^XTrKtO?j{4W*5n2mA2+wtvmW}9oc@uc+XGr2UA(R2X5#SR}vX% zJQirCwPcZJp_}O@+zxrZ{ughc{KRH?xs_Ai2J)%aWFl`d`Jt?7N*q%V1}`7bI*|{V z@w{as;s*o`t`q$#gt7 zN9aq`RpZ11#4z@^w=vhq=<^NKUelMEBH~K*Crcn<T`-wLJbGv$ibd32uF zM{zcVZ|;f?Kck!y-*FB@KRrgApf3fz`J|j^sfbR&N+OcEh&SIW$8RmnKa~9=R4Bad zz7=&-49{8;%2*Z@9AOE|4P}*QEO(ul>uqh?Zwez;2+dh=__7b03r%31;Dq$n=}_m; zo#l0WvL0z^M2_Hh8hgqlK%4D^D0+c0nXg4nFzxeCqC?ffKxykBZ6uw|g-JgBA`=t% zVu+%f2qoz{##;0QF<@Auz7ejFNpu=9oW5lE#a{uf`y#PVuBPrcH4;Zt|EdqTJY|$G zKrN%Q)VW$Ia9{4y{nQ9y81#f~%;ozUUhB`H87`xyDy5i8Y9==nddIHDqx_!% z=+Cqc;uPerXrht#noEdh(92w7n?cm{F zgPd9PT{h!aqDQ)o!Wrv)+6eBL#d2O5955L-Dc`+o4Y8&@1;y*jnN77BLw^Gs|Db1APrYN^8wFMZ7i|GFj^{<&p6)r#w)kE zf3!F$kFKGARX0!{iFB>6ERjd(aat$up`gv$Aj09KctGF6Ba`^@2-+#`cIsvTBzN6b7>M=pX}-PSSFGZ zpTm^YYX~_UE!5`5G7IH1`YF&kKX|qpjuUC`*A2V4Sg(uS1=8Ids-wCYUCX)9jt`|eg4JkL8t6840{si5 zsL6~?o`wvRU($G@Az4v4W2iw62hp*m8m`wQ%MhiJ5wVUufW!rjo=qQ=N2%%5WqBh# znyaiN6GPdzBBk%*?#M~{HSV~ik(_b4w411hu6s}E2$N*k%C}|4(l4c%>O%HA@@0mz zDO9jLmKjQgOFxxNq9^r2+`?5RCW(J>bBO*>FUM0h<&r*@Er}}VOC%YDVXYFiYYKLR z$R4mU2lNFJNs-zFX&JK|>ZWYQ8sXe&-z74;p1V(O7v*oX~mVF7<-EqL$V~;;6tfNwizM z&rBgAv{z(*DpUEJ6y*ffW~ilF=qgkt^(nsd46PP=)a8gH=+_lzkaDL~(BDAEIG%h@ zE+vd~K&_?UAV=yA$@XeRy*@J;iM=1`X-LbuMeR~!@%DVK4$#u5n}iW8`~#R%WpD=1 zB-&{%;vRV!8k>GpKDt<2p}c#B?shFA9+@oye!662^}W`sLA`eYj`)ZAeWfa;5+(E% zWD$HHq!2*W(M<0S<&TprMcAPUn-BWi31SWPw{{abr}d%K$ilh?UOfK&uC5a--Acc% z-iB)6v(k^~!<5ll600e&CNXLrBXNE*RBi*c`bak@1qJFeFhRS3OSfr0q zZ0LyVN~*q-wh_}5ufA8?Di204ybaVcFTnYCLw~qRovISh4IC%Zsg_7_Ys9Q!`mkl0 ztLy~y2yCWyrnQDn1_w@O)tSan5??1)p!c1Oe(PcBneY(VuU&+?!ZUs${0j4g_u>@k znAA{Nh`YO((8wB8U+N%Th`!DvCKGwwmypk$1m)E+=<)gy4DQ`i?U6c5wZLg*Rc_!^ zQAfFg-G*P8trh)WY6&Q!b)nu^4Nr*?s>pOory8M?Yliah5h%`Upyj%aU2!t9DzFoQ zDq;>)D{YV$vlUv4M^KHehJs8(Ketdjqebb#$SO(Fi|H(qCdz`cngc~yp0*R&GqN@x zo$|`~%|YEV75dC*q-e~7{$e!paL$5HJRa(dtKiwr13UH>I`DtsPY1LE3z7V(<4%7@ zlA(p@jlFtzXd6C5M{`zJKxJKo-uW^pm1gOF^rF8*Pf?q=g6sPZO@bNPhWhx7ImjQW zhm6K=`UL1Rx*}a>E7C%L;Qw4jjtP?Vkp6fK%7pXS)t`hyWE^ruReV1RS6K#{f_hL; zw}6^r6G+@=p$nJ+Jwyv!@dlzTl3{ld&50h!hfPO^-U{7E3O;$Q9!%_m2I3pi22Nx zEX9WLn6AXi52cp!RA~`%yK}++bc11g9l6ub(dqqD>koBm4$h*_kXHK}YM-gdCGA8Q zz&b8ZuK{uNGJ1c#m;+#<4`35HFW1LV1?_d<(_>P(e zuUC>Un1fTppM)NaGfx0dO%7a$8$3b|O6Oc@K9eE{pp$}J~>9c`B z{0fSeHbek9v}^U@_|*nlwmh69uYr%eNLvU!lpWftS^7|X=iAU)g@VPs9CxiUi0Dno z0Z0*|NCQ6o2k{oFpE&5l=IattZC*j8_yg2$PQQT^#hplb(e%D#TQFjS$auKaB9VGN z2c6{8NUE+x-$5owp4JEd@2hqiO6sHVl=N3SE8CF$H%Gn=jpYt~9z7o!gT0Uf^$e`w zC*&g3LKY$wayNNiTc=!=Oj5cuQI1hS?~~4m&xQTMVxgDlK)PX;+(s=4edc4eEau-K zVl-s{`+l_{!PLz>+xpHn$u`W^&>ri!;s^?w>`1p|S$w7l<40&!ml9jR=3J=^k%B=F z+3lO*t?fPJ?dn^J6u7#9b;u4MC0>+TK|}1*)5!buMdm4EgY&8<7sWkh`?60Njn1Ur zlbwlbS}UZoO_QVK!{St-1l(pnq0$&5d=wgpbER!cS51e`D?=Ya9-`jT&*7*LSPEW~ zs)l5)KYI{fg(gTe?1?JK7IG_A_(MqGPJr*luH07Q@kX1V)>e*!q3uL|<`$$+Y`|%L zA_%+hh~99sY@%v|_n(e8S8=$VszZO$iZr9@cY-)VE+cf+EnmdQi;YHnH z7&!p>#8J#$V{7X|bF#64>AZ2Ad66Z}`qsYMQrbdTQ;e_Krc`@qgqMKjJW}J7ZDM=j z48M=R=nwIY_8$yP7K%x3q*WLB11G=00 zT1Rb$k}XAv4f)yrr~Z?CO;p@+g%)B-ajP^(-lvkN(`VyYCfv}*GS(b!U2LsvDQ}6km9%rVUzQ|eFZhczbk`Q@ z71V&d6Qg^$IGFDUqQG14GGA?PhUcm0vUh}kf&W9`4qqowHZUGskw?&LOjIX8p&YE2 z!TF1T|Gj?V*M-lUZGRu4CgyrFgMs+jBIc3?p>w5wxmek^~OLl-SSckI(fx?+Oz zDM9Wjo-`J~C((|I#5y&FjMZ02Lk!FLRpNcBDDh2J%ukfz`~+);+E_Ev{pAVv9C0)e z6a2ieAJvpCi5-<{s86H|^T8SDC-_HPle6&gTnudl%`9 zdtXp0vBF!Et!e8Mu#3soRIr@w17F( zdav-8m>S$pZOWfCwxK%-2Yg>`d-bDIH?9}8PWq*6v^Mp1lRMi6_&L3d>AXy8bE&DK zg(;@3fOhqqdcb&GDe&*%su_lQ2GJ9YCxw402OH%XZp$RBu4?9bw5o1Z>af=}w{nx} zslyo|-eW2gO|;9*G)>Z*k++1GOi!|>6idg^@1dK&rVLPS>1P5f&7tx#^)KV#z*V9m z`^CSNEKMy#^2!3DCOuTjWfIlS%n4EAc5-)x>cnSe8xf;yrT#Q_;~#5BnRqRfnkd~e zTp^ONhSW4f`FazFxL3+JZ8uIwE@3rP|1;z&-t^FF{&ixIW4mx!?!c`lYkKZl?twk= z57XSZDR7XeWGKqNW+sCo|AKY-O{C9!#Iu}X$>#nal*{nZ6V0rq{roU4PP}a<1Sh$Q zX`^wzeuuEDQm%LlcQOn-4D8$vGh zyta3j4dQ9TKV(s@iCkLUXWJ&V7u1j|{;KjrE?%!Kcx;b^cXAtBNwE=CK{#YSh@DKP z^@w&bKww_0{3!GAKs)+6=XHmgW|`=~RCTh!6L_kH+Us~%lMyVT1qH_2tMX^PwZkOI z;NBU$Rr#y1V#FO^5nlysbJ|}}CHSX0#pAO6;>QrTwJ!v?(n>!(-5^7%^Q3hN_bmT# zM2A2VX@G^s&f=MQzVKa}XWk>+AZsye_}c6wc_unEvkE(z+tQ=FnZzX<=RU>FCFd&! zGDbN;$7_#-q4ay>Y}aMeKXO^EH2saJ=1=CPaCISq}P{HZC!a}#s%HYH(3j0U9Qfg5x?{g{-Yrc#3kOOV579(muMf!OwHaH z{I6|$b`A3#HpqJmuE3s3ZSFEv*6R;?!GH1f2ntfK`mb@B%xzzc^||^^@dT&)6R$iJ=twZXd9(~izC4&qm<7sz5r$NQ>e>ch;<`RnKbE~Apo z)jU~b&yePx1OD(Rqj#iewTz=T32mvH+%9puoMU{ZofZRhs-cANSxU9m^etzD(2aZHPYPcsiU+ z6ieu>Y%lV^vo7QGKrzyyM{wz$ijL31ZGNk+G2>E8Ci?Nz_y- zY3t0Z0yT|e{mroYywZ9T`}_4wW$Wz1C3>si55AS! zTV@Q=N4RO+DDI$~aC$5?wJca|?W3hhcZqK%Ml2#$wP(6l8t-WB<-S^dlOlVCilNzg zE-pq<=x}aZ;kKY_$_*)0|IHbtt7Km?FTmNCKz(q>^q2ZTtY;roxX0L-E9JXFgm3}< zGWk`kO_XuW%I;$fnDeBE!YspleF~8;*U*~Tg1iJ(%UHqxp1#g(4@@#`ky}&6#9w4b z<4s`+MoH1YTfLOEX?_v&JUW9+cjs9bPzzlJ>~LeDRGi;oeofZquWS3v`}ODkU*vN7 zliZz~PL>jiut(@Ifh+&Z+|t`gy^LMxsex&R)oLSuC3A|pgl5%y1kJJh7qW~NXDlVJ zR}I$kGU-hVDdjUshwQV7Q69}&Ppv9VHW)qaZTE=Af#b&e#yU9}!8v?qZ3|sT>qQkI zHxQeZWz-gbQfNfpY6EMI@qIETX;$$&{eelyQiFRqre|-WriWB@jpuLtA4g{y9YxZ% z;jZ@axZ*4j2ni6}eQ^oyu8X?`cUjymxVuAecQ&|%kPw&gnbzw5p7+~5`(qCWm`u-9 zchz&>*A-sZUaT)P)gl@ROK8q)bd=Y&2giCD|5IxMFf)&lpS89R8G`gI0QfL!;!*dePvb=J|bC1=# za9TKz-iWJ1Q{S!ZWFGn38?X8P&TH-!Kq#Bjk|hd)AwNnWCk!KKC*)eC#f#pNr^S=)5~ zJ@?AMn%X`8bi;MEsl3MA+*b!O9F>?1$tJe6-Ew_pL!pbjiu_Ca;aAv8L>4}#RUj)H zS~}WT=6Jg?t;ml=1@$&(SBmf_<2QeEZaO^gKc|-3<~xGe3`2M48+o$Hj(t909T>+k z2R$6qmNijPJ;9zD2Do z^kBD6E;VfdF~Ke4GIb02#hzw9!TfPrO?6E*y|3hbhI85~xsaK`o^p*~BWyvAfsz!C zd=Gsaj4{kJ`JQjSc`0$o|AX0!nrUa1LSh3mLn)^|HVn|PYZ3F9_bGpgkJwCYr_aMj zvX}e=h_3W{VH7!mIjIcRIug0$4{aqHNqm(W>H*{ky#?Q1?j?RQ?NYiZMO+1Z)mw!g zZJ8k6C#Iroe=<>@Y>z4t;8d3ykO6!ZVGO#fC(2RGKh#h13tFV~mg_T@h;MLRH)%$- z3loe?a!ERsoGheL>tPO;B*p3+^H@$+DE=&U${(xMBB$VSWA!_#|$ZlHcLFPP>09&;Vr^1#NyE5n$`c_pfrd=q^odTG@0617XD zMx{pe2+In1VB2DeGsH3>k=uAPwf}p&C z*}>TZvyWwEXHU*OpZj+~|3XiGRM9*)?GyYPr2}FfK8^mPe1_AOieb*u_bXT`8Y<8+ zBdcDo-Mr!LCYPHxZ`7xD_ZrS>v*Q+2&aF75TtQTPU>Z|Z{m1vnxvzM3;jf(gzdl2^ zqTp@6cg7DZzT|#u|HJe%H*E?K03X_Kdrm30$;zC~+|Z;NS6Dv{KVRqKS;?RkB)Gj`@x?HoAP}!0JP53@nmyp1k}?zyJJb`Rif&wO?C)mCIQ4r+n`C z{D=Ae{5tlp!c+Yw|HRaZTgR<8%GSJ4d)Vuci$VFe8hQh z2Q-0gV!UW9Hm8_7SmxMBTY{NoZv!o0GjSU`rS_i9MUx6pLDxKUPNzS^{xr$1miVySrNY<_ov|XT|4AAW(Kq#3TF#9I-pVKo&~0P$xleeyRRrIXMFaOtmxl2(gvjO$=LMg$e&3WLo>ubB?~Tjno3=jC2BK#UoXRC8LFCE znoC*=ERwaAc{}%+oClpFE|{HPoI5Z3SJt1LOF4l#rE|mbOBB~} zd%PRHv%OCLA?b`#9q1_=i67((bVu)oUJ`r2c({&iOs$93^-iKMsZ+PfENC;gpsND8 za=FP8xHu#tVqDaWQl-mmE`70lUTjp2yx6!3i^`Y!E4;!vxMGHqXM>m84q2`mpMnD% zOS(|mJIL)Qo|!x2&yS3**^6?&W&ij?XLib*o|9j|7ngI~b;Ni+2~CwMc$>OJm56iP zZ>|$(V>STO=^b@~9!;*s9*L7E*(!#3=Q{frpDG;dGPq~kUlpCot6x;c-N#+WHOYIx zQ`NIrY_3d_i^Qu^GgTl4z)y7#W=k?z&+vjvWC$=k&fsjZW%9|I<50X>dCX}237`INz`#-bZ=fyL*E7n4{TE$VinlmE7KRjeay4@w@&4oIJp~@W zV1~qbCFsLfqh7N&`BTue?QhAp3^gydjW9Pe=Npfi##)PEchcJ0*H&Q6rz?~3;I*5@ z<^_~w!sJ`TRdRzoQQyuD1E)_IA47*oAzBG&_b()5_7%U%FoT~=Eiu+Kec}@XgF~=& zfyH4vYrSM#0)P4(^Ir2dUgq!6W%M+h2Cmli$|+^LwApvvTh%+nb=kGuJ7xH@LanMCyXi0^c=AA5O;0qaoAMiP$V8$Yu2_$~7flA1QWH z&#Hd;g)&YaBwvymlXsOHL=W*Ou|b@vRYK(ij{2chWOhrl$plCYSd?5g#?V8lWjjTO zD1FqOf#Zq4)Ujd1`2@Kmdnxd)A6jzJZtA{Q2)JmhCb!j^1mvqHq+zU!9>YFzPvGuy zcf8%mg)FPuz%aN}`$I}(AAN#)N}kTt=1uZyrI2+HH{pI8#og9B0-16qHZ2YFt;t2A9>NO`HC3bl;A>S zkEmk%2#?=-n;cnGKrb}@mcO_IO-reVxhv(HmM9S*ynJ_hwj)aP;PE(G_qzI+-+P-8 zPqZ*xMYxJS8X3nr!**sb_rjUXEjKSJI>DiUnd%U(1oKp^hOSc=$@9Rc3gzA?pS2-m zC_3-4t4X%UUOO|7_zs!II_z#tvJ=5y+0>}3lc^`ZctdslyeGnZ#W2)4g<1iVqf%r~ zUkQ_0U!tgTlHm>gG4Hw+X663BZB3O$ih*A&pO?4Ld6qV=E2xFxmUpT7o%ax{`R?(H ze0xke{xQldcr{nJO75P<4UQ_drcx6vQQBhJONJMnG#ku^oHwPBrH%s|K_1PV#YcEhq@xZwk?Nqmb6qhX zW$FuHej_%C7ujiaqPmi7$DIV~N^HPy|5&XZ+kt9Hmy!(uWqh*MB%+aLhv>KM@L!>J zur{VUP)PD|KWU-uQ1Ki~d#=#gi@Jec_+ArLw7SCIh6QkDbev!mtNTSjIaevEyQQD| zym-M-BsP<)F)bY(ja8_9Vj>+U?bn-{W9;|26Cs&-r{&bBqw*Zbck5E~08gw?J**pX zT3C#(n}X$8!hq;$j`>Q9@K42Ol#9Xn;!6J%%M+PnLhy2BGnXz<)M`$X*UCTHXXHQr zU&IY-MDb`Y5Dg)#(UHzT<19T2_3^#7dL@Tgl^=?2^c~MW;sN(venk9B)=<_Mh88q3 zr<>Tq=X?<{P_wW{6yBR0(9u6rX<#@=2MbSRqt&Ng_T-r+)0;PNAjA z=AW#0GAbn{+fI=JJ=h`%;uBjgKCkXvN})g z#)J?Hv>wzf zbMa^Vh3W#+8CMNO3|{SQ?N1Ma=9qu8DNo%3=9Yy_kn&t>z+tVmP|a{bFN=S|ENj36$J!+hXET(8T0g#;?r^_0Wze~~y8?^#!9u!x z*<1%LEE*k9S7fAVG=+loec%J$A-=b)bb3$&!;!*db2+Y!hF*nkOJh3O|BOgr-%8QW=@HR_+4;e?S4;J*VN&U#-rqz!c9~EWJ!4ntvBehx zj*}zZ>*>qPL6|Gu32X12h0jBtF+)iq7nqOPzgVZ>cHXgOKanOTP$GL=3?^=HwFF2T zQ6V%T#go9Lh4hgdPFl7qucRc7WX?Kz8)`GH9g)_-)G1GUE}!H)Zvz`E%RDJTi-eCv zea0=uQ4Vsewn4gN9i|xy2L-le2G|#X*W-fIXoz9*oGcq@tme9}CtG};Qqb!7iPmZV zYIDdK^ijF5$|hMZ_RHq(;6)s43W5`#`P6v2pA^7DD~TM${FGvdTI9ccq`josMlAHt zGY^qd<>g!-ATezO(tkbJ$<>4$=^AzbCglE96dLJ2#7&2|Ndt zA<`kaHjQooujLUnQC+BQL)D?HQ5ood4}og+0&-vN@C~&Fov%H{jo|xOlYFfe0#D>7 zG(Ijvvn2zyLT){Z96=2sz7i4SJTy*U2z-@`dRypCjMa8R25AZo0Xt_Pkd3zJxA1V_ zup|N9=O+;jNuiFYEih`nLXs(;s0+!FKhPuiPGo{BIv>&*HiUq|Qj-`3o^2V-)^qhW zU~Au|57*a${e2b~T-}gFdJb8XHjohd5BNGVP@nd~)5%LnHGR;BLIy?ChY{z&7~TQ; zCtG29cLmsBETo#ILW(O6xJoko{RmvaLx5$q7Sc+M;kE1{#sbY{6VU=D*lXbL=O9lN z3KW}My(#3w*6S^Z3(#OO6Fnfibx|J*NkTWIwPph+lq5vR6a53cF;yQ3xu^C(C)ow* zsUm$GWKO^9eIUJb9rz#5^;X1vphE=$GbR_j)O&Q`2f|PIk*EyR9*15HJ_+$UgXY7p z+=Zk~2gvK)1Xjy1{SLTB(nR^9U$X+oeuOHPaIuIYv->okWy2Hc^e|-PxP3T?5 z8MuWUq8(HxS{?|A${kCzT1Fg87aDoOEab~g$)j$ptWfMpHuN)e_B@nY1$-k{xzqhetTk=-ed+E?rX%EHZv@M+?_|@p*-Q@UgOPFKPlW_*0zZIBxAK2Nz1RqJZ^MQWH&^ z@I$9hT50&eTv0Z-J;DsOB~M6Wo!S0=$j3F+7=JryIy6qI2?E+_D8Q^YQW(Q*Fs#Ib zJv)5ks78D{W|O+j9V=#$-?>@bCVoCwku7cL8h9e;Fn5f78;Z-%DU%iuXif+^8Pp|k zaS#ruXWGTwHT-4iL2Pi2w!igPRe1jvXK#B#L3r-8yy}HL^IzmVFFfV-h!)>($353T z|9`Tg&!b8+Ga+SLo0GUqIK#X^w)h|CgB=P?)_b^&x?YXOrcQ z;xx4wc;GkG4@z^bGqM0JZz*+|-C-DIJj+kuE&(mMrSYU$06XABW3aKVv8);e&J*K(=iBKs_zrmIL4W=SoU85j4HagH zZqXqfmFG*b(p$v_cdwbi+~R;LT>XEkWX*~5@mNU4S5&eEPG~9oBW{&fiPeSY-kP3< zzGSVsd4BM)z#his)^$-yrGrXNE!DWHSkF_>SncIsHOk7Rj+Ev8>RWzsiPu3p%^un& z$2r;-OfF2ePq9zR3;aF&OYVpMpL%@XlKwdJZf@zK#lYh}UzF&ydmkxMU=Q`@BS=_I%n*EDA&0iU;QGQt! z-$)+qIXQx{@C{AJtwq*mmWJkP=2~WK9Tb!j+$HdXg*E+cwDU>qY^Ex+jvd9lr5h5L zm40Fq*$3*ZqKr99lgp{J(1E2B{Xd%Cl2dj2)nA9MrkxwB3ewFB|tx$IZ zMc9HrL95`d;siTYxbR7^ikl$&cSGis4)P_j26S#_N@mCxe#AHMb;!5=QY0k_%+zLJ z)V>jTw|Y7wxC_iB^1rMg9X21LwX^aR_<;GwoD#*x-uQKif5E3vEOiSngl6Jxjk zHKp{isJMvW$T!h@qQ?X~xNqb>VyRNf%h`7nRWG`bKO(c;Gws3Ct0{aUgug5B`s8sWl-| zfD(99+X`IJEqaO`33G=3kqT4M3#ON`vgMqm*j&ZBDrjPOo#^w?n@ZL#lUz2m%=!{v zqTfcfi<}b?6MjA<*ZPTn#%!l1>l@`0!f^i^?wEi43v}PHgaouojgRI zFP8@zf41twvmpiLMPE@ru#7EY_AsZIDeO9~9Djwa3oS{+l%wuKS~h~bsGETfdQBDO z&cL$oBMCxZAxD@lZ16| zqb~wQyfagW&1W~U4cRH|akdTnnK{QSVlwD5^i`@J)rCw#Iq-bF5(tdBxHrD0#;F;~ z65t#c$u^~hk_$Apk;)FmpsokkNdZ2omD0--uZXH}jrNhtq18GAIv_`=0aP-T3cio= zU})$-9tOteIcOF<0KQ;#t*ka4k5=n}LFS24Mv>$$N)=^`d<5*HFO_}DUdV{t1upJq zbtVpm*49!;rEi2r%maM^B;oG>k24P(1TJX1I0-j&DCz>Iaing7PKFL`j7;qnkVlsS zEA$a?o8y4O&#@)>X2x=+2=fPPeqhJo2fQ=#{q|AsI} z=qu8Yysjr7gj9J?Y{lJhTWvKY;}z|bu7DN5p&x+P-h-F`DgGtU&NvGl^%!IT7H$Ee z$Wdf4b)RDCadc0}k0%0;pXKIqL%3nU!(YZFaB1vaxL%)_GVl%ZQbwvNxe?h=9fE~c z_j52#xs;yD2f49)R9YgfmKI8#qyf@N>5b%-M#>(!D}0v|p<(eaaPtm8gFP8`R{N=pD!{lXh0#K|;;MR|ZdCwmB6qF{`!L;W+I0Mq~3>*(Wp>b;S|M_s$ zpUMlcXN9O$)FJSizN*0(7%F%qd=Dak#QPiiH9=?*a-%uWrRhq2qt<|1Xc?VJw*)sp zb*4M4#o^3kx;8zP{sujbJ+Owo0Alw4_PKTS(O?3|!#pmheuue2GvzTbEOyEP@>i*( z+)8F-qudDA;1%)#Ib5luv{wFAJm5!IsXhc&!8G7_m(Uh!Sz2@GteA*J1dmoD9bQKP z*^T;-YC&&xruPqVGSjr9#)Srqe-UPQ;yDO3x{qq<;q zSV7JMmqRDA9yu5$%oE8Tu-^70Lr4#LkLJV7a6i!;_TQED)xe&vi?^s|bu+N~kIGf$ zROzrZS6U+tl@>@Z!Kv0$UM_zJBF9lB7R(c7JQAP7wSgS3YHi_)eu5o*CwS*y!8%_8 zbwV@XJzRxW!hc)g`E@&5i29@2C>RyPnz9;L^f3eleX8T|IZo8$fb&X$8AOB}H4DuB zXn10s3E%6_aApxlj3SN@A7F1?1DZ9<(IxZ~`H%^oq??nS$<|~O_{rkQDqxE+kXh&k z+JhFubA%Zh7zc>)L^Cj|K88Ol0T{|@kPa9N#N=?`kv_)9@mf3w568Wr8&w(;7^_BX z!y-__o$$<_r}|YIu44%FxrgHwVA=SBOTzEIq`81ceH|KQQ@~}|8tnz{^$7AMw3yn# ziu{?vz$ocRPk_%0&}is+^bq*J>R=jj0^4*R6;I`m2gpSDOrL^8m%+1cgOGrd=nT( zAAwTKXkTGXiiP!fIXvg)!ZTMWe4aMKnzR*oAy{t){l%Zq0yLq{XeZhT{QFmMCv8H8 zgE3$Ubk(-N{i_j4As?`Nhv+7|{+mo8f?S(HPo!4^TN`H{9dr0r$Bo{ND4(Oq3#@>Lp-z$D$rE-`R}n<7sr5 znu+qE{k4#IjZ^dj=yqh`jX)0FsrZ2L*Z?=yt145W+j$5&7wdt}+YD$(N3~+;3U&q_ zNOipnxj?6phCXU%;8Z1#Oam_WXW|&DK=dbrP;H&1hid!aZ0h{~-_QOf*Xf_&nOH+N z;Qri?x`neSH~yr*CX2KV#B!vmOHry`5>xb1B@#se>mZZFY8RYC4pFATy>Pt}3a|Yy zwKn+!nzlX2(~#GR*KX=d^qvH-zl3JuC;0q$P`VaCebqPO`*bf{4t1g~YG;WH)G)OR zEyC&C7N8td)n5?PNvC>=TK&IsNR+1!(!Nr^)nBM8+N-`onCveO*L?PbI@}OW^6}lKapvr0G;QbW+_A`}40xM{%a&k#CtJMn$^{Ex?pbaUk%vs)FY zbJ8a6Bwh;~@vcCE*{Zc=KB*^(NOcYMN~uS*rY6bFsQr2;Je58ovDIlGTQ6EAc9{P7dO-)P2~G5ODhZ5?sZLw2@>e@d0zd>K!Ux zp~vf~atl6G>Pem?CaNC#q->>M0-t4>))CKTW5qm!&2K{InLhGLil-u^L(DDoNW8>m z5?(x%Wc9^3iW!AxQ1#$b_5{`k$f7DybPFOMvuHZgUiu7#`isO|jU!5OJAKiHlqgOxju&`hD)k0i^c`eHJroC1MbM&rtj(mVV_7~4Y3|0TnI0}>aj%sp z#6$83?u1Lwlomqtpgs#GZYk;@95A?~yTpHVth|A0tbAr_N-Xz9nMxo!K`?SRl~L#@ z^Im)dZjk3<7W~Q}J&QW3j)l(cO;`)Z!n%DK_agsRYfw7~RjNQQ(fv3SQiI8QM}G!i zT}j0^xT|6jn+$V4Kh>9*rEa6*v|Y+;<9_cQ$imTT8kZ=SQ8h!1JP)|sE7=Wdql{QKk!@2Qqe>G+p-@<>D+a}l2E77CWOx4b&Q)|3$%z^%#k0&7Dsb??V%e6_w z3gQLXU)@JcAmjDb%6*;?e-q>BjdBgPow}IyIjUIhfL-zyq+p%_;r|*H>*{8^=6gz1 zG2U=1rd*|*IK0s{IG zXFXMo{k2IzF6yQ4l{N*G_09F$gB`w3>J`?H8pEWyi|;T$00Sf2G|@BNvd{Ss-;qp} z4!~Xevs{Pis1KAUu#fx~`1#-wnykzV>|J=AC^pp=!uXrw93D%nw9?!K={EYshO1-c zLS1ELxfBZLa(pi0C_PuIq@|;q^m@_AHDR;;tLc;Od;BL}cMJ?1N`(52@YCI=2l_|_?+V?Wy)2Z`s+#MG3F;(zkvfx7=$YOb)LCmn{#7z1u&jF{ z(?ut65<#+6-M>x4h$Ppgu*_l~Wr7*bXm}_y${oZ`w%nqqprhVSdJ6el;Z5hfodW6= z9pQfw7Ehz_A$BL#nENQ!)v9qrz-d6qzTRG-EvK9TlW;AhdJEe-`_R#wz$;M zIBcpToSteTg->XnI3jSO{TW??eyJ=%M>Uf{6H=&+dO80#ZaR*m>!5uSB<1`w$kUQ! z>Z-2y=Y-yJ48*ws{}!jAM3YC`VecI|!!1ZsAe%cnC{V8<&7ps=LC(1Wi9QkAjdt%V z`V&)8jfAG=U4M1cS5IluZ#wUu&c7qS_`_7mVlCpy5|KZ0TAErBC&l&jDC&i$jwzfz z?4M=4;a_X2(_~VWDT_m}Y4N~vJv?YkHDbJKTvuXMstuI@` z`<-u~o`KBqLg6qwSWi^*_^U!RT)BD5Pj0fl)LYA-DYZ~L=C+#5sYTsQ)5z8G8)0xz zoI^A>qf&A`5fdHBVEg&oD7kVOi7s~kZP+RPqK_a}E+iMh)6Wd1ow!Zu$$eH&O1Fb9 z0f*XZ>p{-OSd8LN`K{DVq~bQV6D}M153<3o>Jq(++~(#3+sMapB3h_jrmKjJ*b_=a zZiKjl?F#O}^=v!e3G*QD1CG;F;wsQlPH4r7-P+LAi)l|>m3d=Xp(IYVioVO*Sv7|} ztQ}Ws80-56P~E6f(gDt;b@l$_oa}tn4V~1PQnB`uOv0QY)3uBVG*0t0F?{#-W-6g+ zLbf$X3ed{x6OAdZZF~|+^!GDRLQUg9a)+~|^%PmvRom9Xw;K7_K%p*`XzJ>@K(;2* zP(y8++?RbtCd)nK2US-YahcZritLg95vGk85eh9QRZ`-m=i1OP4?+d>4#7q-eduO-qWet8&`1 z7(Y?puo-HMew%OZIB)39Sv|9XBe_fKtXSyNN?E+v)KnaXEATqL~O-)q>(4Ap#@|G?QOd%&(ow8{))fH5L`huDX+4V4b zq&OF*k?V;5=)RmvaZ~}3MRMr6`@Oc9KdB!U8RJ~-lz$rc0bTQbVuJ8~Z&*OEJ|Ab( z6@;WNykx)0G9$A`7Lly

^2YQ2FZR8JSw&SWMzQc0kD=`YC! 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

F8I1MUVN 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 T5FkK+009C72oNAZ;FQ1zURYHG literal 0 HcmV?d00001 diff --git a/requirements_dev.txt b/requirements_dev.txt index d9522fb..c6eafa1 100644 --- a/requirements_dev.txt +++ b/requirements_dev.txt @@ -6,3 +6,4 @@ isort==5.12.0 mypy==1.1.1 pylint==3.2.5 pytest==7.2.2 +python-dotenv==1.0.1 diff --git a/voip_utils/call_phone.py b/voip_utils/call_phone.py index 74b6910..68b48e4 100644 --- a/voip_utils/call_phone.py +++ b/voip_utils/call_phone.py @@ -1,16 +1,225 @@ import asyncio import logging +import os +import socket +from functools import partial +from pathlib import Path +from typing import Any, Callable, Optional, Set -from .sip import CallPhoneDatagramProtocol, CALL_SRC_IP +from dotenv import load_dotenv + +from .sip import CallInfo, CallPhoneDatagramProtocol, SdpInfo, SipEndpoint +from .voip import RtcpDatagramProtocol, RtcpState, RtpDatagramProtocol + +_LOGGER = logging.getLogger(__name__) + +load_dotenv() + +CALL_SRC_USER = os.getenv("CALL_SRC_USER") +CALL_SRC_IP = os.getenv("CALL_SRC_IP") +CALL_SRC_PORT = int(os.getenv("CALL_SRC_PORT")) +CALL_VIA_IP = os.getenv("CALL_VIA_IP") +CALL_DEST_IP = os.getenv("CALL_DEST_IP") +CALL_DEST_PORT = int(os.getenv("CALL_DEST_PORT")) +CALL_DEST_USER = os.getenv("CALL_DEST_USER") + + +RATE = 16000 +WIDTH = 2 +CHANNELS = 1 +RTP_AUDIO_SETTINGS = { + "rate": RATE, + "width": WIDTH, + "channels": CHANNELS, + "sleep_ratio": 0.99, +} + +CallProtocolFactory = Callable[[CallInfo, RtcpState], asyncio.Protocol] + + +class VoipCallDatagramProtocol(CallPhoneDatagramProtocol): + """UDP server for Voice over IP (VoIP).""" + + def __init__( + self, + sdp_info: SdpInfo, + source_endpoint: SipEndpoint, + dest_endpoint: SipEndpoint, + rtp_port: int, + call_protocol_factory: CallProtocolFactory, + ) -> None: + """Set up VoIP call handler.""" + super().__init__(sdp_info, source_endpoint, dest_endpoint, rtp_port) + self.call_protocol_factory = call_protocol_factory + self._tasks: Set[asyncio.Future[Any]] = set() + + def on_call(self, call_info: CallInfo): + """Answer incoming calls and start RTP server on a random port.""" + + rtp_ip = self._source_endpoint.host + + _LOGGER.debug( + "Starting RTP server on ip=%s, rtp_port=%s, rtcp_port=%s", + rtp_ip, + self._rtp_port, + self._rtp_port + 1, + ) + + # Handle RTP packets in RTP server + rtp_task = asyncio.create_task( + self._create_rtp_server( + self.call_protocol_factory, call_info, rtp_ip, self._rtp_port + ) + ) + self._tasks.add(rtp_task) + rtp_task.add_done_callback(self._tasks.remove) + + _LOGGER.debug("RTP server started") + + def end_call(self, task): + """Callback for hanging up when call is ended.""" + self.hang_up() + + async def _create_rtp_server( + self, + protocol_factory: CallProtocolFactory, + call_info: CallInfo, + rtp_ip: str, + rtp_port: int, + ): + # Shared state between RTP/RTCP servers + rtcp_state = RtcpState() + + loop = asyncio.get_running_loop() + + # RTCP server + await loop.create_datagram_endpoint( + lambda: RtcpDatagramProtocol(rtcp_state), + (rtp_ip, rtp_port + 1), + ) + + # RTP server + await loop.create_datagram_endpoint( + partial(protocol_factory, call_info, rtcp_state), + (rtp_ip, rtp_port), + ) + + +class PreRecordMessageProtocol(RtpDatagramProtocol): + """Plays a pre-recorded message on a loop.""" + + def __init__( + self, + file_name: str, + opus_payload_type: int, + message_delay: float = 1.0, + loop_delay: float = 2.0, + loop: Optional[asyncio.AbstractEventLoop] = None, + rtcp_state: RtcpState | None = None, + ) -> None: + """Set up RTP server.""" + super().__init__( + rate=RATE, + width=WIDTH, + channels=CHANNELS, + opus_payload_type=opus_payload_type, + rtcp_state=rtcp_state, + ) + self.loop = loop + self.file_name = file_name + self.message_delay = message_delay + self.loop_delay = loop_delay + self._audio_task: asyncio.Task | None = None + self._audio_bytes: bytes | None = None + _LOGGER.debug("Created PreRecordMessageProtocol") + + def on_chunk(self, audio_bytes: bytes) -> None: + """Handle raw audio chunk.""" + _LOGGER.debug("on_chunk") + if self.transport is None: + return + + if self._audio_bytes is None: + # 16Khz, 16-bit mono audio message + file_path = Path(__file__).parent / self.file_name + self._audio_bytes = file_path.read_bytes() + + if self._audio_task is None: + self._audio_task = self.loop.create_task( + self._play_message(), + name="voip_not_connected", + ) + + async def _play_message(self) -> None: + _LOGGER.debug("_play_message") + self.send_audio( + self._audio_bytes, + self.rate, + self.width, + self.channels, + self.addr, + silence_before=self.message_delay, + ) + + await asyncio.sleep(self.loop_delay) + + # Allow message to play again - Only play once for testing + # self._audio_task = None async def main() -> None: logging.basicConfig(level=logging.DEBUG) loop = asyncio.get_event_loop() - transport, protocol = await loop.create_datagram_endpoint( - lambda: CallPhoneDatagramProtocol(None), - local_addr=(CALL_SRC_IP, 5060), + source = SipEndpoint( + username=CALL_SRC_USER, host=CALL_SRC_IP, port=CALL_SRC_PORT, description=None + ) + destination = SipEndpoint( + username=CALL_DEST_USER, + host=CALL_DEST_IP, + port=CALL_DEST_PORT, + description=None, + ) + + # Find free RTP/RTCP ports + rtp_port = 0 + + while True: + sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) + sock.setblocking(False) + + # Bind to a random UDP port + sock.bind(("", 0)) + _, rtp_port = sock.getsockname() + + # Close socket to free port for re-use + sock.close() + + # Check that the next port up is available for RTCP + sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) + try: + sock.bind(("", rtp_port + 1)) + + # Will be opened again below + sock.close() + + # Found our ports + break + except OSError: + # RTCP port is taken + pass + + _, protocol = await loop.create_datagram_endpoint( + lambda: VoipCallDatagramProtocol( + None, + source, + destination, + rtp_port, + lambda call_info, rtcp_state: PreRecordMessageProtocol( + "problem.pcm", 96, loop=loop, rtcp_state=rtcp_state + ), + ), + local_addr=(CALL_SRC_IP, CALL_SRC_PORT), ) await protocol.wait_closed() diff --git a/voip_utils/problem.pcm b/voip_utils/problem.pcm new file mode 100644 index 0000000000000000000000000000000000000000..887376687f79ab848226daa0034c7a77f3fa364e GIT binary patch literal 190976 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

^2YQ2FZR8JSw&SWMzQc0kD=`YC! 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

F8I1MUVN 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 T5FkK+009C72oNAZ;FQ1zURYHG literal 0 HcmV?d00001 diff --git a/voip_utils/sip.py b/voip_utils/sip.py index 1a43c44..7ff7290 100644 --- a/voip_utils/sip.py +++ b/voip_utils/sip.py @@ -49,6 +49,63 @@ def caller_rtcp_port(self) -> int: return self.caller_rtp_port + 1 +@dataclass +class RtpInfo: + """Information about the RTP transport used for the call audio.""" + + rtp_ip: str | None + rtp_port: int | None + payload_type: int | None + + +@dataclass +class SipEndpoint: + """Information about a SIP endpoint.""" + + host: str + port: int + username: str + description: str + + @property + def sip_uri(self) -> str: + """Return the URI for the SIP endpoint.""" + if self.username is not None: + return f"sip:{self.username}@{self.host}:{self.port}" + + return f"sip:{self.host}:{self.port}" + + +def get_rtp_info(body: str) -> RtpInfo: + body_lines = body.splitlines() + rtp_ip = None + rtp_port = None + opus_payload_type = None + for line in body_lines: + line = line.strip() + if not line: + continue + + key, _, value = line.partition("=") + if key == "m": + parts = value.split() + if parts[0] == "audio": + rtp_port = int(parts[1]) + elif key == "c": + parts = value.split() + if len(parts) > 2: + rtp_ip = parts[2] + elif key == "a" and value.startswith("rtpmap:"): + # a=rtpmap:123 opus/48000/2 + codec_str = value.split(":", maxsplit=1)[1] + codec_parts = codec_str.split() + if (len(codec_parts) > 1) and (codec_parts[1].lower().startswith("opus")): + opus_payload_type = int(codec_parts[0]) + _LOGGER.debug("Detected OPUS payload type as %s", opus_payload_type) + + return RtpInfo(rtp_ip=rtp_ip, rtp_port=rtp_port, payload_type=opus_payload_type) + + class SipDatagramProtocol(asyncio.DatagramProtocol, ABC): """UDP server for the Session Initiation Protocol (SIP).""" @@ -286,13 +343,14 @@ def _parse_sip( return method, ruri, headers, body -CALL_SRC_IP = "192.168.1.100" -CALL_VIA_IP = "192.168.1.101" -CALL_DEST_IP = "192.168.1.102" - class CallPhoneDatagramProtocol(asyncio.DatagramProtocol, ABC): def __init__( - self, sdp_info: SdpInfo, loop: Optional[asyncio.AbstractEventLoop] = None + self, + sdp_info: SdpInfo, + source: SipEndpoint, + dest: SipEndpoint, + rtp_port: int, + loop: Optional[asyncio.AbstractEventLoop] = None, ) -> None: self.sdp_info = sdp_info self.transport = None @@ -301,23 +359,29 @@ def __init__( self._session_id = str(time.monotonic_ns()) self._session_version = str(time.monotonic_ns()) self._call_id = str(time.monotonic_ns()) - self._request_uri = f"sip:user@{CALL_SRC_IP}" + self._source_endpoint = source + self._dest_endpoint = dest + self._rtp_port = rtp_port + self._request_uri = f"sip:{dest.username}@{dest.host}:{dest.port}" def connection_made(self, transport): self.transport = transport - username = "test2" - sdp_lines = [ "v=0", - f"o={username} {self._session_id} {self._session_version} IN IP4 {CALL_SRC_IP}", - "s=SIP Call", - f"c=IN IP4 {CALL_SRC_IP}", + f"o={self._source_endpoint.username} {self._session_id} {self._session_version} IN IP4 {self._source_endpoint.host}", + "s=Talk", + f"c=IN IP4 {self._source_endpoint.host}", "t=0 0", - "m=audio 5004 RTP/AVP 123", + f"m=audio {self._rtp_port} RTP/AVP 0 96 101 103 104 123", "a=sendrecv", + "a=rtpmap:96 opus/48000/2", + "a=fmtp:96 useinbandfec=0", "a=rtpmap:123 opus/48000/2", "a=fmtp:123 maxplaybackrate=16000", + "a=rtpmap:101 telephone-event/48000", + "a=rtpmap:103 telephone-event/16000", + "a=rtpmap:104 telephone-event/8000", "a=ptime:20", "", ] @@ -326,9 +390,10 @@ def connection_made(self, transport): invite_lines = [ f"INVITE {self._request_uri} SIP/2.0", - f"Via: SIP/2.0/UDP {CALL_VIA_IP}", - f"From: ", - f"To: ", + f"Via: SIP/2.0/UDP {self._source_endpoint.host}:{self._source_endpoint.port}", + f"From: ", + f"Contact: ", + f"To: ", f"Call-ID: {self._call_id}", "CSeq: 50 INVITE", "User-Agent: test-agent 1.0", @@ -345,7 +410,7 @@ def connection_made(self, transport): self.transport.sendto( invite_bytes + sdp_bytes, - (CALL_DEST_IP, 5060), + (self._dest_endpoint.host, self._dest_endpoint.port), ) def datagram_received(self, data: bytes, addr): @@ -359,40 +424,197 @@ def datagram_received(self, data: bytes, addr): line = line.strip() if i == 0: _version, code, response_type = line.split(maxsplit=2) + _LOGGER.debug( + "Version=%s, Code=%s, response_type=%s", + _version, + code, + response_type, + ) if (code == "200") and (response_type == "OK"): is_ok = True - else: - _LOGGER.debug("Skipping message: %s", line) + elif code == "401": + _LOGGER.debug( + "Got 401 Unauthorized response, should attempt authentication here..." + ) + # register_lines = [ + # f"REGISTER {self._request_uri} SIP/2.0", + # f"Via: SIP/2.0/UDP {self._source_endpoint.host}:{self._source_endpoint.port}", + # f"From: ", + # f"Contact: ", + # f"To: ", + # f"Call-ID: {self._call_id}", + # "CSeq: 51 REGISTER", + # "Authorization: ", + # "User-Agent: test-agent 1.0", + # "Allow: INVITE, ACK, OPTIONS, CANCEL, BYE, SUBSCRIBE, NOTIFY, INFO, REFER, UPDATE", + # "", + # ] + elif _version == "BYE": + _LOGGER.debug("Received BYE message: %s", line) + if self.transport is not None: + # Acknowledge the BYE message, otherwise the phone will keep sending it + ( + protocol, + code, + reason, + headers, + body, + ) = self._parse_sip_reply(response_text) + _LOGGER.debug( + "Parsed response protocol=%s code=%s reason=%s headers=[%s] body=[%s]", + protocol, + code, + reason, + headers, + body, + ) + rtp_info = get_rtp_info(body) + remote_rtp_port = rtp_info.rtp_port + opus_payload_type = rtp_info.payload_type + via_header = headers["via"] + from_header = headers["from"] + to_header = headers["to"] + callid_header = headers["call-id"] + cseq_header = headers["cseq"] + ok_lines = [ + "SIP/2.0 200 OK", + f"Via: {via_header}", + f"From: {from_header}", + f"To: {to_header}", + f"Call-ID: {callid_header}", + f"CSeq: {cseq_header}", + "User-Agent: test-agent 1.0", + "Content-Length: 0", + ] + ok_text = _CRLF.join(ok_lines) + _CRLF + ok_bytes = ok_text.encode("utf-8") + # We should probably tell the associated RTP server to shutdown at this point, assuming we aren't reusing it for other calls + _LOGGER.debug("Sending OK for BYE message: %s", ok_text) + self.transport.sendto( + ok_bytes, + (self._dest_endpoint.host, self._dest_endpoint.port), + ) + + self.transport.close() + self.transport = None + else: + _LOGGER.debug("Skipping message: %s", line) elif not line: break if is_ok: _LOGGER.debug("Got OK message") if self.transport is not None: - bye_lines = [ - f"BYE {self._request_uri} SIP/2.0", - f"Via: SIP/2.0/UDP {CALL_VIA_IP}", - f"From: ", - f"To: ", + protocol, code, reason, headers, body = self._parse_sip_reply( + response_text + ) + _LOGGER.debug( + "Parsed response protocol=%s code=%s reason=%s headers=[%s] body=[%s]", + protocol, + code, + reason, + headers, + body, + ) + rtp_info = get_rtp_info(body) + remote_rtp_port = rtp_info.rtp_port + opus_payload_type = rtp_info.payload_type + to_header = headers["to"] + ack_lines = [ + f"ACK {self._request_uri} SIP/2.0", + f"Via: SIP/2.0/UDP {self._source_endpoint.host}:{self._source_endpoint.port}", + f"From: ", + f"To: {to_header}", f"Call-ID: {self._call_id}", - "CSeq: 51 BYE", + "CSeq: 50 ACK", "User-Agent: test-agent 1.0", "Content-Length: 0", - "", ] - bye_text = _CRLF.join(bye_lines) + _CRLF - bye_bytes = bye_text.encode("utf-8") - self.transport.sendto(bye_bytes, (CALL_DEST_IP, 5060)) - - self.transport.close() - self.transport = None + ack_text = _CRLF.join(ack_lines) + _CRLF + ack_bytes = ack_text.encode("utf-8") + self.transport.sendto( + ack_bytes, (self._dest_endpoint.host, self._dest_endpoint.port) + ) + + # The call been answered, proceed with desired action here + self.on_call( + CallInfo( + caller_ip=self._dest_endpoint.host, + caller_uri=self._dest_endpoint.sip_uri, + caller_name=self._dest_endpoint.description, + caller_sip_port=self._dest_endpoint.port, + caller_rtp_port=remote_rtp_port, + server_ip=self._dest_endpoint.host, + headers=headers, + opus_payload_type=opus_payload_type, # Should probably update this to eventually support more codecs + ) + ) except Exception: _LOGGER.exception("Unexpected error handling SIP response") + @abstractmethod + def on_call(self, call_info: CallInfo): + """Handle outgoing calls.""" + + def hang_up(self): + """Hang up the call when finished""" + bye_lines = [ + f"BYE {self._request_uri} SIP/2.0", + f"Via: SIP/2.0/UDP {self._source_endpoint.host}:{self._source_endpoint.port}", + f"From: ", + f"To: " + f"Call-ID: {self._call_id}", + "CSeq: 51 BYE", + "User-Agent: test-agent 1.0", + "Content-Length: 0", + "", + ] + _LOGGER.debug("Hanging up...") + bye_text = _CRLF.join(bye_lines) + _CRLF + bye_bytes = bye_text.encode("utf-8") + self.transport.sendto( + bye_bytes, (self._dest_endpoint.host, self._dest_endpoint.port) + ) + + self.transport.close() + self.transport = None + def connection_lost(self, exc): """Signal wait_closed when transport is completely closed.""" - self._loop.call_soon_threadsafe(self._closed_event.set) + self._closed_event.set() async def wait_closed(self) -> None: """Wait for connection_lost to be called.""" await self._closed_event.wait() + + def _parse_sip_reply( + self, message: str + ) -> Tuple[Optional[str], Optional[str], Optional[str], Dict[str, str], str]: + """Parse SIP message and return method, headers, and body.""" + lines = message.splitlines() + + protocol: Optional[str] = None + code: Optional[str] = None + reason: Optional[str] = None + headers: dict[str, str] = {} + offset: int = 0 + + # See: https://datatracker.ietf.org/doc/html/rfc3261 + for i, line in enumerate(lines): + if line: + offset += len(line) + len(_CRLF) + + if i == 0: + line_parts = line.split() + protocol = line_parts[0] + code = line_parts[1] + reason = line_parts[2] + elif not line: + break + else: + key, value = line.split(":", maxsplit=1) + headers[key.lower()] = value.strip() + + body = message[offset:] + + return protocol, code, reason, headers, body diff --git a/voip_utils/voip.py b/voip_utils/voip.py index 008d608..246909c 100644 --- a/voip_utils/voip.py +++ b/voip_utils/voip.py @@ -208,10 +208,12 @@ def send_audio( ) -> None: """Send audio from WAV file in chunks over RTP.""" if not self._is_connected: + _LOGGER.debug("Not connected, can't send audio") return addr = addr or self.addr if addr is None: + _LOGGER.debug("No destination address, can't send audio") raise ValueError("Destination address not set") bytes_per_sample = width * channels @@ -222,6 +224,7 @@ def send_audio( samples_left = len(audio_bytes) // bytes_per_sample rtp_packets: list[bytes] = [] while samples_left > 0: + _LOGGER.debug("Preparing audio chunk to send") bytes_offset = sample_offset * bytes_per_sample chunk = audio_bytes[bytes_offset : bytes_offset + bytes_per_frame] samples_in_chunk = len(chunk) // bytes_per_sample @@ -239,6 +242,7 @@ def send_audio( sample_offset += samples_in_chunk # Pause before sending to allow time for user to pick up phone. + _LOGGER.debug("Pause before sending") time.sleep(silence_before) # Send RTP in a steady stream, delaying between each packet to simulate real-time audio From 37a2e730b20f2a28f6a9c6d3632f4f7348aef8bd Mon Sep 17 00:00:00 2001 From: Jamin Hitchcock Date: Tue, 16 Jul 2024 21:21:59 -0500 Subject: [PATCH 06/19] Fix some type checking issues --- voip_utils/call_phone.py | 20 ++++++++------------ voip_utils/sip.py | 6 +++--- 2 files changed, 11 insertions(+), 15 deletions(-) diff --git a/voip_utils/call_phone.py b/voip_utils/call_phone.py index 68b48e4..59f84b3 100644 --- a/voip_utils/call_phone.py +++ b/voip_utils/call_phone.py @@ -16,11 +16,11 @@ load_dotenv() CALL_SRC_USER = os.getenv("CALL_SRC_USER") -CALL_SRC_IP = os.getenv("CALL_SRC_IP") -CALL_SRC_PORT = int(os.getenv("CALL_SRC_PORT")) +CALL_SRC_IP = os.getenv("CALL_SRC_IP", "127.0.0.1") +CALL_SRC_PORT = int(os.getenv("CALL_SRC_PORT", 5060)) CALL_VIA_IP = os.getenv("CALL_VIA_IP") -CALL_DEST_IP = os.getenv("CALL_DEST_IP") -CALL_DEST_PORT = int(os.getenv("CALL_DEST_PORT")) +CALL_DEST_IP = os.getenv("CALL_DEST_IP", "127.0.0.1") +CALL_DEST_PORT = int(os.getenv("CALL_DEST_PORT", 5060)) CALL_DEST_USER = os.getenv("CALL_DEST_USER") @@ -34,7 +34,7 @@ "sleep_ratio": 0.99, } -CallProtocolFactory = Callable[[CallInfo, RtcpState], asyncio.Protocol] +CallProtocolFactory = Callable[[CallInfo, RtcpState], asyncio.DatagramProtocol] class VoipCallDatagramProtocol(CallPhoneDatagramProtocol): @@ -42,7 +42,7 @@ class VoipCallDatagramProtocol(CallPhoneDatagramProtocol): def __init__( self, - sdp_info: SdpInfo, + sdp_info: SdpInfo | None, source_endpoint: SipEndpoint, dest_endpoint: SipEndpoint, rtp_port: int, @@ -130,7 +130,8 @@ def __init__( self.message_delay = message_delay self.loop_delay = loop_delay self._audio_task: asyncio.Task | None = None - self._audio_bytes: bytes | None = None + file_path = Path(__file__).parent / self.file_name + self._audio_bytes: bytes = file_path.read_bytes() _LOGGER.debug("Created PreRecordMessageProtocol") def on_chunk(self, audio_bytes: bytes) -> None: @@ -139,11 +140,6 @@ def on_chunk(self, audio_bytes: bytes) -> None: if self.transport is None: return - if self._audio_bytes is None: - # 16Khz, 16-bit mono audio message - file_path = Path(__file__).parent / self.file_name - self._audio_bytes = file_path.read_bytes() - if self._audio_task is None: self._audio_task = self.loop.create_task( self._play_message(), diff --git a/voip_utils/sip.py b/voip_utils/sip.py index 7ff7290..a64c41e 100644 --- a/voip_utils/sip.py +++ b/voip_utils/sip.py @@ -64,8 +64,8 @@ class SipEndpoint: host: str port: int - username: str - description: str + username: str | None + description: str | None @property def sip_uri(self) -> str: @@ -346,7 +346,7 @@ def _parse_sip( class CallPhoneDatagramProtocol(asyncio.DatagramProtocol, ABC): def __init__( self, - sdp_info: SdpInfo, + sdp_info: SdpInfo | None, source: SipEndpoint, dest: SipEndpoint, rtp_port: int, From 551b92955e3b3b0701822f55a0e5c16be827c145 Mon Sep 17 00:00:00 2001 From: Jamin Hitchcock Date: Tue, 16 Jul 2024 21:38:32 -0500 Subject: [PATCH 07/19] Fix converting env variable to int --- voip_utils/call_phone.py | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/voip_utils/call_phone.py b/voip_utils/call_phone.py index 59f84b3..8b72951 100644 --- a/voip_utils/call_phone.py +++ b/voip_utils/call_phone.py @@ -15,12 +15,23 @@ load_dotenv() + +def get_env_int(env_var: str, default_val: int) -> int: + value = os.getenv(env_var) + if value is None: + return default_val + try: + return int(value) + except ValueError: + return default_val + + CALL_SRC_USER = os.getenv("CALL_SRC_USER") CALL_SRC_IP = os.getenv("CALL_SRC_IP", "127.0.0.1") -CALL_SRC_PORT = int(os.getenv("CALL_SRC_PORT", 5060)) +CALL_SRC_PORT = get_env_int("CALL_SRC_PORT", 5060) CALL_VIA_IP = os.getenv("CALL_VIA_IP") CALL_DEST_IP = os.getenv("CALL_DEST_IP", "127.0.0.1") -CALL_DEST_PORT = int(os.getenv("CALL_DEST_PORT", 5060)) +CALL_DEST_PORT = get_env_int("CALL_DEST_PORT", 5060) CALL_DEST_USER = os.getenv("CALL_DEST_USER") From c845748e3a5fff1b2578e3d586dcf95bf83de3a2 Mon Sep 17 00:00:00 2001 From: Jamin Hitchcock Date: Mon, 22 Jul 2024 20:46:39 -0500 Subject: [PATCH 08/19] Updates for Grandstream compatibility Modify codec negotiation to work with Grandstream Move example code out of call_phone.py --- call_example.py | 166 +++++++++++++++++++++++++++++++++++++++ voip_utils/call_phone.py | 143 --------------------------------- voip_utils/sip.py | 12 ++- 3 files changed, 176 insertions(+), 145 deletions(-) create mode 100644 call_example.py diff --git a/call_example.py b/call_example.py new file mode 100644 index 0000000..5e5bf92 --- /dev/null +++ b/call_example.py @@ -0,0 +1,166 @@ +import asyncio +import logging +import os +import socket +from functools import partial +from pathlib import Path +from typing import Any, Callable, Optional, Set + +from dotenv import load_dotenv + +from voip_utils.sip import CallInfo, CallPhoneDatagramProtocol, SdpInfo, SipEndpoint +from voip_utils.voip import RtcpDatagramProtocol, RtcpState, RtpDatagramProtocol +from voip_utils.call_phone import VoipCallDatagramProtocol + +_LOGGER = logging.getLogger(__name__) + +load_dotenv() + + +def get_env_int(env_var: str, default_val: int) -> int: + value = os.getenv(env_var) + if value is None: + return default_val + try: + return int(value) + except ValueError: + return default_val + + +CALL_SRC_USER = os.getenv("CALL_SRC_USER") +CALL_SRC_IP = os.getenv("CALL_SRC_IP", "127.0.0.1") +CALL_SRC_PORT = get_env_int("CALL_SRC_PORT", 5060) +CALL_VIA_IP = os.getenv("CALL_VIA_IP") +CALL_DEST_IP = os.getenv("CALL_DEST_IP", "127.0.0.1") +CALL_DEST_PORT = get_env_int("CALL_DEST_PORT", 5060) +CALL_DEST_USER = os.getenv("CALL_DEST_USER") + + +RATE = 16000 +WIDTH = 2 +CHANNELS = 1 +RTP_AUDIO_SETTINGS = { + "rate": RATE, + "width": WIDTH, + "channels": CHANNELS, + "sleep_ratio": 0.99, +} + +class PreRecordMessageProtocol(RtpDatagramProtocol): + """Plays a pre-recorded message on a loop.""" + + def __init__( + self, + file_name: str, + opus_payload_type: int, + message_delay: float = 1.0, + loop_delay: float = 2.0, + loop: Optional[asyncio.AbstractEventLoop] = None, + rtcp_state: RtcpState | None = None, + ) -> None: + """Set up RTP server.""" + super().__init__( + rate=RATE, + width=WIDTH, + channels=CHANNELS, + opus_payload_type=opus_payload_type, + rtcp_state=rtcp_state, + ) + self.loop = loop + self.file_name = file_name + self.message_delay = message_delay + self.loop_delay = loop_delay + self._audio_task: asyncio.Task | None = None + file_path = Path(__file__).parent / self.file_name + self._audio_bytes: bytes = file_path.read_bytes() + _LOGGER.debug("Created PreRecordMessageProtocol") + + def on_chunk(self, audio_bytes: bytes) -> None: + """Handle raw audio chunk.""" + _LOGGER.debug("on_chunk") + if self.transport is None: + return + + if self._audio_task is None: + self._audio_task = self.loop.create_task( + self._play_message(), + name="voip_not_connected", + ) + + async def _play_message(self) -> None: + _LOGGER.debug("_play_message") + self.send_audio( + self._audio_bytes, + self.rate, + self.width, + self.channels, + self.addr, + silence_before=self.message_delay, + ) + + await asyncio.sleep(self.loop_delay) + + # Allow message to play again - Only play once for testing + # self._audio_task = None + + +async def main() -> None: + logging.basicConfig(level=logging.DEBUG) + + loop = asyncio.get_event_loop() + source = SipEndpoint( + username=CALL_SRC_USER, host=CALL_SRC_IP, port=CALL_SRC_PORT, description=None + ) + destination = SipEndpoint( + username=CALL_DEST_USER, + host=CALL_DEST_IP, + port=CALL_DEST_PORT, + description=None, + ) + + # Find free RTP/RTCP ports + rtp_port = 0 + + while True: + sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) + sock.setblocking(False) + + # Bind to a random UDP port + sock.bind(("", 0)) + _, rtp_port = sock.getsockname() + + # Close socket to free port for re-use + sock.close() + + # Check that the next port up is available for RTCP + sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) + try: + sock.bind(("", rtp_port + 1)) + + # Will be opened again below + sock.close() + + # Found our ports + break + except OSError: + # RTCP port is taken + pass + + _, protocol = await loop.create_datagram_endpoint( + lambda: VoipCallDatagramProtocol( + None, + source, + destination, + rtp_port, + lambda call_info, rtcp_state: PreRecordMessageProtocol( + "problem.pcm", call_info.opus_payload_type, loop=loop, rtcp_state=rtcp_state + ), + ), + local_addr=(CALL_SRC_IP, CALL_SRC_PORT), + ) + + await protocol.wait_closed() + + +if __name__ == "__main__": + asyncio.run(main()) diff --git a/voip_utils/call_phone.py b/voip_utils/call_phone.py index 8b72951..f1a1673 100644 --- a/voip_utils/call_phone.py +++ b/voip_utils/call_phone.py @@ -13,28 +13,6 @@ _LOGGER = logging.getLogger(__name__) -load_dotenv() - - -def get_env_int(env_var: str, default_val: int) -> int: - value = os.getenv(env_var) - if value is None: - return default_val - try: - return int(value) - except ValueError: - return default_val - - -CALL_SRC_USER = os.getenv("CALL_SRC_USER") -CALL_SRC_IP = os.getenv("CALL_SRC_IP", "127.0.0.1") -CALL_SRC_PORT = get_env_int("CALL_SRC_PORT", 5060) -CALL_VIA_IP = os.getenv("CALL_VIA_IP") -CALL_DEST_IP = os.getenv("CALL_DEST_IP", "127.0.0.1") -CALL_DEST_PORT = get_env_int("CALL_DEST_PORT", 5060) -CALL_DEST_USER = os.getenv("CALL_DEST_USER") - - RATE = 16000 WIDTH = 2 CHANNELS = 1 @@ -47,7 +25,6 @@ def get_env_int(env_var: str, default_val: int) -> int: CallProtocolFactory = Callable[[CallInfo, RtcpState], asyncio.DatagramProtocol] - class VoipCallDatagramProtocol(CallPhoneDatagramProtocol): """UDP server for Voice over IP (VoIP).""" @@ -114,123 +91,3 @@ async def _create_rtp_server( partial(protocol_factory, call_info, rtcp_state), (rtp_ip, rtp_port), ) - - -class PreRecordMessageProtocol(RtpDatagramProtocol): - """Plays a pre-recorded message on a loop.""" - - def __init__( - self, - file_name: str, - opus_payload_type: int, - message_delay: float = 1.0, - loop_delay: float = 2.0, - loop: Optional[asyncio.AbstractEventLoop] = None, - rtcp_state: RtcpState | None = None, - ) -> None: - """Set up RTP server.""" - super().__init__( - rate=RATE, - width=WIDTH, - channels=CHANNELS, - opus_payload_type=opus_payload_type, - rtcp_state=rtcp_state, - ) - self.loop = loop - self.file_name = file_name - self.message_delay = message_delay - self.loop_delay = loop_delay - self._audio_task: asyncio.Task | None = None - file_path = Path(__file__).parent / self.file_name - self._audio_bytes: bytes = file_path.read_bytes() - _LOGGER.debug("Created PreRecordMessageProtocol") - - def on_chunk(self, audio_bytes: bytes) -> None: - """Handle raw audio chunk.""" - _LOGGER.debug("on_chunk") - if self.transport is None: - return - - if self._audio_task is None: - self._audio_task = self.loop.create_task( - self._play_message(), - name="voip_not_connected", - ) - - async def _play_message(self) -> None: - _LOGGER.debug("_play_message") - self.send_audio( - self._audio_bytes, - self.rate, - self.width, - self.channels, - self.addr, - silence_before=self.message_delay, - ) - - await asyncio.sleep(self.loop_delay) - - # Allow message to play again - Only play once for testing - # self._audio_task = None - - -async def main() -> None: - logging.basicConfig(level=logging.DEBUG) - - loop = asyncio.get_event_loop() - source = SipEndpoint( - username=CALL_SRC_USER, host=CALL_SRC_IP, port=CALL_SRC_PORT, description=None - ) - destination = SipEndpoint( - username=CALL_DEST_USER, - host=CALL_DEST_IP, - port=CALL_DEST_PORT, - description=None, - ) - - # Find free RTP/RTCP ports - rtp_port = 0 - - while True: - sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) - sock.setblocking(False) - - # Bind to a random UDP port - sock.bind(("", 0)) - _, rtp_port = sock.getsockname() - - # Close socket to free port for re-use - sock.close() - - # Check that the next port up is available for RTCP - sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) - try: - sock.bind(("", rtp_port + 1)) - - # Will be opened again below - sock.close() - - # Found our ports - break - except OSError: - # RTCP port is taken - pass - - _, protocol = await loop.create_datagram_endpoint( - lambda: VoipCallDatagramProtocol( - None, - source, - destination, - rtp_port, - lambda call_info, rtcp_state: PreRecordMessageProtocol( - "problem.pcm", 96, loop=loop, rtcp_state=rtcp_state - ), - ), - local_addr=(CALL_SRC_IP, CALL_SRC_PORT), - ) - - await protocol.wait_closed() - - -if __name__ == "__main__": - asyncio.run(main()) diff --git a/voip_utils/sip.py b/voip_utils/sip.py index a64c41e..ad03e29 100644 --- a/voip_utils/sip.py +++ b/voip_utils/sip.py @@ -81,6 +81,7 @@ def get_rtp_info(body: str) -> RtpInfo: rtp_ip = None rtp_port = None opus_payload_type = None + opus_payload_types_detected = [] for line in body_lines: line = line.strip() if not line: @@ -100,9 +101,16 @@ def get_rtp_info(body: str) -> RtpInfo: codec_str = value.split(":", maxsplit=1)[1] codec_parts = codec_str.split() if (len(codec_parts) > 1) and (codec_parts[1].lower().startswith("opus")): - opus_payload_type = int(codec_parts[0]) + opus_payload_types_detected.append(int(codec_parts[0])) _LOGGER.debug("Detected OPUS payload type as %s", opus_payload_type) + if len(opus_payload_types_detected) > 0: + opus_payload_type = opus_payload_types_detected[0] + _LOGGER.debug("Using first detected payload type: %s", opus_payload_type) + else: + opus_payload_type = OPUS_PAYLOAD_TYPE + _LOGGER.debug("Using default payload type: %s", opus_payload_type) + return RtpInfo(rtp_ip=rtp_ip, rtp_port=rtp_port, payload_type=opus_payload_type) @@ -373,7 +381,7 @@ def connection_made(self, transport): "s=Talk", f"c=IN IP4 {self._source_endpoint.host}", "t=0 0", - f"m=audio {self._rtp_port} RTP/AVP 0 96 101 103 104 123", + f"m=audio {self._rtp_port} RTP/AVP 123 96 101 103 104", "a=sendrecv", "a=rtpmap:96 opus/48000/2", "a=fmtp:96 useinbandfec=0", From 73f83ca3a5d1413e351de2da0ba87f24b3618c6a Mon Sep 17 00:00:00 2001 From: Jamin Hitchcock Date: Mon, 22 Jul 2024 20:50:05 -0500 Subject: [PATCH 09/19] Formatting fixes --- call_example.py | 8 ++++++-- voip_utils/call_phone.py | 1 + 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/call_example.py b/call_example.py index 5e5bf92..a6e86f2 100644 --- a/call_example.py +++ b/call_example.py @@ -8,9 +8,9 @@ from dotenv import load_dotenv +from voip_utils.call_phone import VoipCallDatagramProtocol from voip_utils.sip import CallInfo, CallPhoneDatagramProtocol, SdpInfo, SipEndpoint from voip_utils.voip import RtcpDatagramProtocol, RtcpState, RtpDatagramProtocol -from voip_utils.call_phone import VoipCallDatagramProtocol _LOGGER = logging.getLogger(__name__) @@ -46,6 +46,7 @@ def get_env_int(env_var: str, default_val: int) -> int: "sleep_ratio": 0.99, } + class PreRecordMessageProtocol(RtpDatagramProtocol): """Plays a pre-recorded message on a loop.""" @@ -153,7 +154,10 @@ async def main() -> None: destination, rtp_port, lambda call_info, rtcp_state: PreRecordMessageProtocol( - "problem.pcm", call_info.opus_payload_type, loop=loop, rtcp_state=rtcp_state + "problem.pcm", + call_info.opus_payload_type, + loop=loop, + rtcp_state=rtcp_state, ), ), local_addr=(CALL_SRC_IP, CALL_SRC_PORT), diff --git a/voip_utils/call_phone.py b/voip_utils/call_phone.py index f1a1673..c74c86b 100644 --- a/voip_utils/call_phone.py +++ b/voip_utils/call_phone.py @@ -25,6 +25,7 @@ CallProtocolFactory = Callable[[CallInfo, RtcpState], asyncio.DatagramProtocol] + class VoipCallDatagramProtocol(CallPhoneDatagramProtocol): """UDP server for Voice over IP (VoIP).""" From ea085e33ef4df384d5c54e4a86b797da29258ae4 Mon Sep 17 00:00:00 2001 From: Jamin Hitchcock Date: Mon, 22 Jul 2024 20:53:38 -0500 Subject: [PATCH 10/19] Fix unused imports --- voip_utils/call_phone.py | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/voip_utils/call_phone.py b/voip_utils/call_phone.py index c74c86b..249cdff 100644 --- a/voip_utils/call_phone.py +++ b/voip_utils/call_phone.py @@ -1,15 +1,10 @@ import asyncio import logging -import os -import socket from functools import partial -from pathlib import Path -from typing import Any, Callable, Optional, Set - -from dotenv import load_dotenv +from typing import Any, Callable, Set from .sip import CallInfo, CallPhoneDatagramProtocol, SdpInfo, SipEndpoint -from .voip import RtcpDatagramProtocol, RtcpState, RtpDatagramProtocol +from .voip import RtcpDatagramProtocol, RtcpState _LOGGER = logging.getLogger(__name__) From 3c5ce02e0d17da8e20773b0a67569d02cb530a03 Mon Sep 17 00:00:00 2001 From: Jamin Hitchcock Date: Mon, 22 Jul 2024 20:56:57 -0500 Subject: [PATCH 11/19] Fix example in README --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 227d27c..bf2d7a2 100644 --- a/README.md +++ b/README.md @@ -15,5 +15,5 @@ Set environment variables for source and destination endpoints in .env file CALL_DEST_USER = "phone" Run script -python -m voip_utils.call_phone +python call_example.py From bef22266d708534b35282a6dd6592ab3c3c81a25 Mon Sep 17 00:00:00 2001 From: Jamin Hitchcock Date: Mon, 26 Aug 2024 21:24:28 -0500 Subject: [PATCH 12/19] Change SipHeader parsing Use SipEndpoint dataclass for parsing SIP headers --- call_example.py | 10 ++-- tests/test_sip.py | 46 +++++++++++------- voip_utils/sip.py | 120 ++++++++++++++++++++++------------------------ 3 files changed, 90 insertions(+), 86 deletions(-) diff --git a/call_example.py b/call_example.py index a6e86f2..1505dab 100644 --- a/call_example.py +++ b/call_example.py @@ -9,7 +9,7 @@ from dotenv import load_dotenv from voip_utils.call_phone import VoipCallDatagramProtocol -from voip_utils.sip import CallInfo, CallPhoneDatagramProtocol, SdpInfo, SipEndpoint +from voip_utils.sip import CallInfo, CallPhoneDatagramProtocol, SdpInfo, SipEndpoint, get_sip_endpoint from voip_utils.voip import RtcpDatagramProtocol, RtcpState, RtpDatagramProtocol _LOGGER = logging.getLogger(__name__) @@ -109,13 +109,13 @@ async def main() -> None: logging.basicConfig(level=logging.DEBUG) loop = asyncio.get_event_loop() - source = SipEndpoint( - username=CALL_SRC_USER, host=CALL_SRC_IP, port=CALL_SRC_PORT, description=None + source = get_sip_endpoint( + host=CALL_SRC_IP, port=CALL_SRC_PORT, username=CALL_SRC_USER, description=None ) - destination = SipEndpoint( - username=CALL_DEST_USER, + destination = get_sip_endpoint( host=CALL_DEST_IP, port=CALL_DEST_PORT, + username=CALL_DEST_USER, description=None, ) diff --git a/tests/test_sip.py b/tests/test_sip.py index 6644065..00b742c 100644 --- a/tests/test_sip.py +++ b/tests/test_sip.py @@ -1,35 +1,47 @@ """Test voip_utils SIP functionality.""" -from voip_utils.sip import SipDatagramProtocol +from voip_utils.sip import SipEndpoint def test_parse_header_for_uri(): - endpoint, name = SipDatagramProtocol._parse_uri_header( - None, '"Test Name" ' + endpoint = SipEndpoint( + '"Test Name" ' ) - assert name == "Test Name" - assert endpoint == "sip:12345@example.com" + assert endpoint.description == "Test Name" + assert endpoint.uri == "sip:12345@example.com" + assert endpoint.username == "12345" + assert endpoint.host == "example.com" + assert endpoint.port == 5060 def test_parse_header_for_uri_no_name(): - endpoint, name = SipDatagramProtocol._parse_uri_header( - None, "sip:12345@example.com" + endpoint = SipEndpoint( + "sip:12345@example.com" ) - assert name is None - assert endpoint == "sip:12345@example.com" + assert endpoint.description is None + assert endpoint.uri == "sip:12345@example.com" def test_parse_header_for_uri_sips(): - endpoint, name = SipDatagramProtocol._parse_uri_header( - None, '"Test Name" ' + endpoint = SipEndpoint( + '"Test Name" ' ) - assert name == "Test Name" - assert endpoint == "sips:12345@example.com" + assert endpoint.description == "Test Name" + assert endpoint.uri == "sips:12345@example.com" def test_parse_header_for_uri_no_space_name(): - endpoint, name = SipDatagramProtocol._parse_uri_header( - None, "Test " + endpoint = SipEndpoint( + "Test " ) - assert name == "Test" - assert endpoint == "sip:12345@example.com" + assert endpoint.description == "Test" + assert endpoint.uri == "sip:12345@example.com" + + +def test_parse_header_for_uri_no_username(): + endpoint = SipEndpoint( + "Test " + ) + assert endpoint.description == "Test" + assert endpoint.username is None + assert endpoint.uri == "sip:example.com" diff --git a/voip_utils/sip.py b/voip_utils/sip.py index ad03e29..ec8dacf 100644 --- a/voip_utils/sip.py +++ b/voip_utils/sip.py @@ -7,7 +7,7 @@ import re import time from abc import ABC, abstractmethod -from dataclasses import dataclass +from dataclasses import dataclass, field from typing import Dict, Optional, Tuple from .const import OPUS_PAYLOAD_TYPE @@ -19,7 +19,6 @@ _LOGGER = logging.getLogger(__name__) _CRLF = "\r\n" - @dataclass class SdpInfo: """Information for Session Description Protocol (SDP).""" @@ -29,16 +28,49 @@ class SdpInfo: session_name: str version: str +@dataclass +class SipEndpoint: + """Information about a SIP endpoint.""" + + sip_header: str + uri: str = field(init=False) + scheme: str = field(init=False) + host: str = field(init=False) + port: int = field(init=False) + username: str | None = field(init=False) + description: str | None = field(init=False) + + def __post_init__(self): + header_pattern = re.compile( + r'\s*((?P\b\w+\b|"[^"]+")\s+)?sips?:[^>]+)>?.*' + ) + header_match = header_pattern.match(self.sip_header) + if header_match is not None: + description_token = header_match.group("description") + if description_token is not None: + self.description = description_token.strip('"') + else: + self.description = None + self.uri = header_match.group("uri") + uri_pattern = re.compile( + r'(?Psips?):(?:(?P[^@]+)@)?(?P[^:;?]+)(?::(?P\d+))?' + ) + uri_match = uri_pattern.match(self.uri) + if uri_match is None: + raise ValueError("Invalid SIP uri") + self.scheme = uri_match.group('scheme') + self.username = uri_match.group('user') + self.host = uri_match.group('host') + self.port = int(uri_match.group('port')) if uri_match.group('port') else SIP_PORT + else: + raise ValueError("Invalid SIP header") @dataclass class CallInfo: """Information gathered from an INVITE message.""" - caller_ip: str - caller_sip_port: int + caller_endpoint: SipEndpoint caller_rtp_port: int - caller_uri: str | None - caller_name: str | None server_ip: str headers: dict[str, str] opus_payload_type: int = OPUS_PAYLOAD_TYPE @@ -57,23 +89,16 @@ class RtpInfo: rtp_port: int | None payload_type: int | None - -@dataclass -class SipEndpoint: - """Information about a SIP endpoint.""" - - host: str - port: int - username: str | None - description: str | None - - @property - def sip_uri(self) -> str: - """Return the URI for the SIP endpoint.""" - if self.username is not None: - return f"sip:{self.username}@{self.host}:{self.port}" - - return f"sip:{self.host}:{self.port}" +def get_sip_endpoint(host: str, port: Optional[int] = None, scheme: Optional[str] = "sip", username: Optional[str] = None, description: Optional[str] = None) -> SipEndpoint: + uri = f"{scheme}:" + if username: + uri += f"{username}@" + uri += host + if port: + uri += f":{port}" + if description: + uri = f'"{description} <{uri}>' + return SipEndpoint(uri) def get_rtp_info(body: str) -> RtpInfo: @@ -150,25 +175,20 @@ def datagram_received(self, data: bytes, addr): if not ruri: raise ValueError("Empty receiver URI") - caller_uri = None - caller_name = None + caller_endpoint = None # The From header should give us the URI used for sending SIP messages to the device if headers.get("from") is not None: - caller_uri, caller_name = self._parse_uri_header(headers.get("from")) + caller_endpoint = SipEndpoint(headers.get("from")) # We can try using the Contact header as a fallback elif headers.get("contact") is not None: - caller_uri, caller_name = self._parse_uri_header(headers.get("contact")) + caller_endpoint = SipEndpoint(headers.get("contact")) # If all else fails try to generate a URI based on the IP and port from the address the message came from else: - caller_uri = "sip:" + caller_ip + ":" + caller_sip_port - caller_name = "Unknown" + caller_endpoint = get_sip_endpoint(caller_ip, port=caller_sip_port) _LOGGER.debug( - "Incoming call from ip=%s, port=%s, uri=%s, name=%s", - caller_ip, - caller_sip_port, - caller_uri, - caller_name, + "Incoming call from endpoint=%s", + caller_endpoint ) # Extract caller's RTP port from SDP. @@ -223,11 +243,8 @@ def datagram_received(self, data: bytes, addr): self.on_call( CallInfo( - caller_ip=caller_ip, - caller_sip_port=caller_sip_port, + caller_endpoint=caller_endpoint, caller_rtp_port=caller_rtp_port, - caller_uri=caller_uri, - caller_name=caller_name, server_ip=server_ip, headers=headers, opus_payload_type=opus_payload_type, @@ -298,28 +315,6 @@ def answer( server_rtp_port, ) - def _parse_uri_header( - self, header: str | None - ) -> Tuple[Optional[str], Optional[str]]: - """Parse SIP Contact/From Header and return endpoint URI and name.""" - uri: Optional[str] = None - name: Optional[str] = None - - if header is None: - return uri, name - - header_pattern = re.compile( - r'\s*((?P\b\w+\b|"[^"]+")\s+)?sips?:[^>]+)>?.*' - ) - header_match = header_pattern.match(header) - if header_match is not None: - name_token = header_match.group("name") - if name_token is not None: - name = name_token.strip('"') - uri = header_match.group("uri") - - return uri, name - def _parse_sip( self, message: str ) -> Tuple[Optional[str], Optional[str], Dict[str, str], str]: @@ -547,10 +542,7 @@ def datagram_received(self, data: bytes, addr): # The call been answered, proceed with desired action here self.on_call( CallInfo( - caller_ip=self._dest_endpoint.host, - caller_uri=self._dest_endpoint.sip_uri, - caller_name=self._dest_endpoint.description, - caller_sip_port=self._dest_endpoint.port, + caller_endpoint=self._dest_endpoint, caller_rtp_port=remote_rtp_port, server_ip=self._dest_endpoint.host, headers=headers, From fa5194434a450129961c3b8cc3974536f4b8d521 Mon Sep 17 00:00:00 2001 From: Jamin Hitchcock Date: Mon, 26 Aug 2024 21:30:01 -0500 Subject: [PATCH 13/19] Formatting fixes --- call_example.py | 8 +++++++- voip_utils/sip.py | 29 +++++++++++++++++++---------- 2 files changed, 26 insertions(+), 11 deletions(-) diff --git a/call_example.py b/call_example.py index 1505dab..d214344 100644 --- a/call_example.py +++ b/call_example.py @@ -9,7 +9,13 @@ from dotenv import load_dotenv from voip_utils.call_phone import VoipCallDatagramProtocol -from voip_utils.sip import CallInfo, CallPhoneDatagramProtocol, SdpInfo, SipEndpoint, get_sip_endpoint +from voip_utils.sip import ( + CallInfo, + CallPhoneDatagramProtocol, + SdpInfo, + SipEndpoint, + get_sip_endpoint, +) from voip_utils.voip import RtcpDatagramProtocol, RtcpState, RtpDatagramProtocol _LOGGER = logging.getLogger(__name__) diff --git a/voip_utils/sip.py b/voip_utils/sip.py index ec8dacf..263c1bb 100644 --- a/voip_utils/sip.py +++ b/voip_utils/sip.py @@ -19,6 +19,7 @@ _LOGGER = logging.getLogger(__name__) _CRLF = "\r\n" + @dataclass class SdpInfo: """Information for Session Description Protocol (SDP).""" @@ -28,6 +29,7 @@ class SdpInfo: session_name: str version: str + @dataclass class SipEndpoint: """Information about a SIP endpoint.""" @@ -53,18 +55,21 @@ def __post_init__(self): self.description = None self.uri = header_match.group("uri") uri_pattern = re.compile( - r'(?Psips?):(?:(?P[^@]+)@)?(?P[^:;?]+)(?::(?P\d+))?' + r"(?Psips?):(?:(?P[^@]+)@)?(?P[^:;?]+)(?::(?P\d+))?" ) uri_match = uri_pattern.match(self.uri) if uri_match is None: raise ValueError("Invalid SIP uri") - self.scheme = uri_match.group('scheme') - self.username = uri_match.group('user') - self.host = uri_match.group('host') - self.port = int(uri_match.group('port')) if uri_match.group('port') else SIP_PORT + self.scheme = uri_match.group("scheme") + self.username = uri_match.group("user") + self.host = uri_match.group("host") + self.port = ( + int(uri_match.group("port")) if uri_match.group("port") else SIP_PORT + ) else: raise ValueError("Invalid SIP header") + @dataclass class CallInfo: """Information gathered from an INVITE message.""" @@ -89,7 +94,14 @@ class RtpInfo: rtp_port: int | None payload_type: int | None -def get_sip_endpoint(host: str, port: Optional[int] = None, scheme: Optional[str] = "sip", username: Optional[str] = None, description: Optional[str] = None) -> SipEndpoint: + +def get_sip_endpoint( + host: str, + port: Optional[int] = None, + scheme: Optional[str] = "sip", + username: Optional[str] = None, + description: Optional[str] = None, +) -> SipEndpoint: uri = f"{scheme}:" if username: uri += f"{username}@" @@ -186,10 +198,7 @@ def datagram_received(self, data: bytes, addr): else: caller_endpoint = get_sip_endpoint(caller_ip, port=caller_sip_port) - _LOGGER.debug( - "Incoming call from endpoint=%s", - caller_endpoint - ) + _LOGGER.debug("Incoming call from endpoint=%s", caller_endpoint) # Extract caller's RTP port from SDP. # See: https://datatracker.ietf.org/doc/html/rfc2327 From ef90520b87f1d080e0591e4573a053fe1a49a185 Mon Sep 17 00:00:00 2001 From: Jamin Hitchcock Date: Mon, 26 Aug 2024 21:43:19 -0500 Subject: [PATCH 14/19] Fix to make mypy happy --- voip_utils/sip.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/voip_utils/sip.py b/voip_utils/sip.py index 263c1bb..dddda08 100644 --- a/voip_utils/sip.py +++ b/voip_utils/sip.py @@ -190,10 +190,10 @@ def datagram_received(self, data: bytes, addr): caller_endpoint = None # The From header should give us the URI used for sending SIP messages to the device if headers.get("from") is not None: - caller_endpoint = SipEndpoint(headers.get("from")) + caller_endpoint = SipEndpoint(headers.get("from") or "") # We can try using the Contact header as a fallback elif headers.get("contact") is not None: - caller_endpoint = SipEndpoint(headers.get("contact")) + caller_endpoint = SipEndpoint(headers.get("contact") or "") # If all else fails try to generate a URI based on the IP and port from the address the message came from else: caller_endpoint = get_sip_endpoint(caller_ip, port=caller_sip_port) From 5e5d8c467ff332ce3b85ee1e3be774309acc5918 Mon Sep 17 00:00:00 2001 From: Jamin Hitchcock Date: Mon, 26 Aug 2024 22:11:56 -0500 Subject: [PATCH 15/19] Remove print statments and loop parameter --- call_example.py | 4 +--- voip_utils/sip.py | 4 ++-- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/call_example.py b/call_example.py index d214344..4cf570a 100644 --- a/call_example.py +++ b/call_example.py @@ -62,7 +62,6 @@ def __init__( opus_payload_type: int, message_delay: float = 1.0, loop_delay: float = 2.0, - loop: Optional[asyncio.AbstractEventLoop] = None, rtcp_state: RtcpState | None = None, ) -> None: """Set up RTP server.""" @@ -73,7 +72,7 @@ def __init__( opus_payload_type=opus_payload_type, rtcp_state=rtcp_state, ) - self.loop = loop + self.loop = asyncio.get_running_loop() self.file_name = file_name self.message_delay = message_delay self.loop_delay = loop_delay @@ -162,7 +161,6 @@ async def main() -> None: lambda call_info, rtcp_state: PreRecordMessageProtocol( "problem.pcm", call_info.opus_payload_type, - loop=loop, rtcp_state=rtcp_state, ), ), diff --git a/voip_utils/sip.py b/voip_utils/sip.py index dddda08..d54ed40 100644 --- a/voip_utils/sip.py +++ b/voip_utils/sip.py @@ -418,7 +418,7 @@ def connection_made(self, transport): invite_text = _CRLF.join(invite_lines) + _CRLF invite_bytes = invite_text.encode("utf-8") - print((invite_bytes + sdp_bytes).decode()) + _LOGGER.debug(invite_bytes + sdp_bytes) self.transport.sendto( invite_bytes + sdp_bytes, @@ -429,7 +429,7 @@ def datagram_received(self, data: bytes, addr): try: response_text = data.decode("utf-8") response_lines = response_text.splitlines() - print(response_lines) + _LOGGER.debug(response_lines) is_ok = False for i, line in enumerate(response_lines): From 0ec5632e739f627b9dcc6aa782ca4bd20c464d99 Mon Sep 17 00:00:00 2001 From: Jamin Hitchcock Date: Tue, 27 Aug 2024 19:51:54 -0500 Subject: [PATCH 16/19] Various review fixes Prefer using guard clauses Use SipEndpoint attributes where appropriate Fix end quote for description --- tests/test_sip.py | 59 +++++++--- voip_utils/sip.py | 287 +++++++++++++++++++++++----------------------- 2 files changed, 187 insertions(+), 159 deletions(-) diff --git a/tests/test_sip.py b/tests/test_sip.py index 00b742c..a804746 100644 --- a/tests/test_sip.py +++ b/tests/test_sip.py @@ -1,12 +1,10 @@ """Test voip_utils SIP functionality.""" -from voip_utils.sip import SipEndpoint +from voip_utils.sip import SipEndpoint, get_sip_endpoint def test_parse_header_for_uri(): - endpoint = SipEndpoint( - '"Test Name" ' - ) + endpoint = SipEndpoint('"Test Name" ') assert endpoint.description == "Test Name" assert endpoint.uri == "sip:12345@example.com" assert endpoint.username == "12345" @@ -15,33 +13,62 @@ def test_parse_header_for_uri(): def test_parse_header_for_uri_no_name(): - endpoint = SipEndpoint( - "sip:12345@example.com" - ) + endpoint = SipEndpoint("sip:12345@example.com") assert endpoint.description is None assert endpoint.uri == "sip:12345@example.com" def test_parse_header_for_uri_sips(): - endpoint = SipEndpoint( - '"Test Name" ' - ) + endpoint = SipEndpoint('"Test Name" ') assert endpoint.description == "Test Name" assert endpoint.uri == "sips:12345@example.com" def test_parse_header_for_uri_no_space_name(): - endpoint = SipEndpoint( - "Test " - ) + endpoint = SipEndpoint("Test ") assert endpoint.description == "Test" assert endpoint.uri == "sip:12345@example.com" def test_parse_header_for_uri_no_username(): - endpoint = SipEndpoint( - "Test " - ) + endpoint = SipEndpoint("Test ") assert endpoint.description == "Test" assert endpoint.username is None assert endpoint.uri == "sip:example.com" + + +def test_get_sip_endpoint(): + endpoint = get_sip_endpoint("example.com") + assert endpoint.host == "example.com" + assert endpoint.port == 5060 + assert endpoint.description is None + assert endpoint.username is None + assert endpoint.uri == "sip:example.com" + + +def test_get_sip_endpoint_with_username(): + endpoint = get_sip_endpoint("example.com", username="test") + assert endpoint.host == "example.com" + assert endpoint.port == 5060 + assert endpoint.description is None + assert endpoint.username == "test" + assert endpoint.uri == "sip:test@example.com" + + +def test_get_sip_endpoint_with_description(): + endpoint = get_sip_endpoint("example.com", description="Test Endpoint") + assert endpoint.host == "example.com" + assert endpoint.port == 5060 + assert endpoint.description == "Test Endpoint" + assert endpoint.username is None + assert endpoint.uri == "sip:example.com" + assert endpoint.sip_header == '"Test Endpoint" ' + + +def test_get_sip_endpoint_with_scheme(): + endpoint = get_sip_endpoint("example.com", scheme="sips") + assert endpoint.host == "example.com" + assert endpoint.port == 5060 + assert endpoint.description is None + assert endpoint.username is None + assert endpoint.uri == "sips:example.com" diff --git a/voip_utils/sip.py b/voip_utils/sip.py index d54ed40..b76c7e3 100644 --- a/voip_utils/sip.py +++ b/voip_utils/sip.py @@ -109,7 +109,7 @@ def get_sip_endpoint( if port: uri += f":{port}" if description: - uri = f'"{description} <{uri}>' + uri = f'"{description}" <{uri}>' return SipEndpoint(uri) @@ -362,19 +362,17 @@ def __init__( source: SipEndpoint, dest: SipEndpoint, rtp_port: int, - loop: Optional[asyncio.AbstractEventLoop] = None, ) -> None: self.sdp_info = sdp_info self.transport = None self._closed_event = asyncio.Event() - self._loop = loop if loop is not None else asyncio.get_running_loop() + self._loop = asyncio.get_running_loop() self._session_id = str(time.monotonic_ns()) self._session_version = str(time.monotonic_ns()) self._call_id = str(time.monotonic_ns()) self._source_endpoint = source self._dest_endpoint = dest self._rtp_port = rtp_port - self._request_uri = f"sip:{dest.username}@{dest.host}:{dest.port}" def connection_made(self, transport): self.transport = transport @@ -401,11 +399,11 @@ def connection_made(self, transport): sdp_bytes = sdp_text.encode("utf-8") invite_lines = [ - f"INVITE {self._request_uri} SIP/2.0", + f"INVITE {self._dest_endpoint.uri} SIP/2.0", f"Via: SIP/2.0/UDP {self._source_endpoint.host}:{self._source_endpoint.port}", - f"From: ", - f"Contact: ", - f"To: ", + f"From: {self._source_endpoint.sip_header}", + f"Contact: {self._source_endpoint.sip_header}", + f"To: {self._dest_endpoint.sip_header}", f"Call-ID: {self._call_id}", "CSeq: 50 INVITE", "User-Agent: test-agent 1.0", @@ -426,140 +424,143 @@ def connection_made(self, transport): ) def datagram_received(self, data: bytes, addr): - try: - response_text = data.decode("utf-8") - response_lines = response_text.splitlines() - _LOGGER.debug(response_lines) - is_ok = False + response_text = data.decode("utf-8") + response_lines = response_text.splitlines() + _LOGGER.debug(response_lines) + is_ok = False + + for i, line in enumerate(response_lines): + line = line.strip() + if not line: + break + if i > 0: + continue + _version, code, response_type = line.split(maxsplit=2) + _LOGGER.debug( + "Version=%s, Code=%s, response_type=%s", + _version, + code, + response_type, + ) + if (code == "200") and (response_type == "OK"): + is_ok = True + elif code == "401": + _LOGGER.debug( + "Got 401 Unauthorized response, should attempt authentication here..." + ) + # register_lines = [ + # f"REGISTER {self._dest_endpoint.uri} SIP/2.0", + # f"Via: SIP/2.0/UDP {self._source_endpoint.host}:{self._source_endpoint.port}", + # f"From: {self._source_endpoint.sip_header}", + # f"Contact: {self._source_endpoint.sip_header}", + # f"To: {self._dest_endpoint.sip_header}", + # f"Call-ID: {self._call_id}", + # "CSeq: 51 REGISTER", + # "Authorization: ", + # "User-Agent: test-agent 1.0", + # "Allow: INVITE, ACK, OPTIONS, CANCEL, BYE, SUBSCRIBE, NOTIFY, INFO, REFER, UPDATE", + # "", + # ] + elif _version == "BYE": + _LOGGER.debug("Received BYE message: %s", line) + if self.transport is None: + _LOGGER.debug("Skipping message: %s", line) + continue + + # Acknowledge the BYE message, otherwise the phone will keep sending it + ( + protocol, + code, + reason, + headers, + body, + ) = self._parse_sip_reply(response_text) + _LOGGER.debug( + "Parsed response protocol=%s code=%s reason=%s headers=[%s] body=[%s]", + protocol, + code, + reason, + headers, + body, + ) + rtp_info = get_rtp_info(body) + remote_rtp_port = rtp_info.rtp_port + opus_payload_type = rtp_info.payload_type + via_header = headers["via"] + from_header = headers["from"] + to_header = headers["to"] + callid_header = headers["call-id"] + cseq_header = headers["cseq"] + ok_lines = [ + "SIP/2.0 200 OK", + f"Via: {via_header}", + f"From: {from_header}", + f"To: {to_header}", + f"Call-ID: {callid_header}", + f"CSeq: {cseq_header}", + "User-Agent: test-agent 1.0", + "Content-Length: 0", + ] + ok_text = _CRLF.join(ok_lines) + _CRLF + ok_bytes = ok_text.encode("utf-8") + # We should probably tell the associated RTP server to shutdown at this point, assuming we aren't reusing it for other calls + _LOGGER.debug("Sending OK for BYE message: %s", ok_text) + self.transport.sendto( + ok_bytes, + (self._dest_endpoint.host, self._dest_endpoint.port), + ) - for i, line in enumerate(response_lines): - line = line.strip() - if i == 0: - _version, code, response_type = line.split(maxsplit=2) - _LOGGER.debug( - "Version=%s, Code=%s, response_type=%s", - _version, - code, - response_type, - ) - if (code == "200") and (response_type == "OK"): - is_ok = True - elif code == "401": - _LOGGER.debug( - "Got 401 Unauthorized response, should attempt authentication here..." - ) - # register_lines = [ - # f"REGISTER {self._request_uri} SIP/2.0", - # f"Via: SIP/2.0/UDP {self._source_endpoint.host}:{self._source_endpoint.port}", - # f"From: ", - # f"Contact: ", - # f"To: ", - # f"Call-ID: {self._call_id}", - # "CSeq: 51 REGISTER", - # "Authorization: ", - # "User-Agent: test-agent 1.0", - # "Allow: INVITE, ACK, OPTIONS, CANCEL, BYE, SUBSCRIBE, NOTIFY, INFO, REFER, UPDATE", - # "", - # ] - elif _version == "BYE": - _LOGGER.debug("Received BYE message: %s", line) - if self.transport is not None: - # Acknowledge the BYE message, otherwise the phone will keep sending it - ( - protocol, - code, - reason, - headers, - body, - ) = self._parse_sip_reply(response_text) - _LOGGER.debug( - "Parsed response protocol=%s code=%s reason=%s headers=[%s] body=[%s]", - protocol, - code, - reason, - headers, - body, - ) - rtp_info = get_rtp_info(body) - remote_rtp_port = rtp_info.rtp_port - opus_payload_type = rtp_info.payload_type - via_header = headers["via"] - from_header = headers["from"] - to_header = headers["to"] - callid_header = headers["call-id"] - cseq_header = headers["cseq"] - ok_lines = [ - "SIP/2.0 200 OK", - f"Via: {via_header}", - f"From: {from_header}", - f"To: {to_header}", - f"Call-ID: {callid_header}", - f"CSeq: {cseq_header}", - "User-Agent: test-agent 1.0", - "Content-Length: 0", - ] - ok_text = _CRLF.join(ok_lines) + _CRLF - ok_bytes = ok_text.encode("utf-8") - # We should probably tell the associated RTP server to shutdown at this point, assuming we aren't reusing it for other calls - _LOGGER.debug("Sending OK for BYE message: %s", ok_text) - self.transport.sendto( - ok_bytes, - (self._dest_endpoint.host, self._dest_endpoint.port), - ) + self.transport.close() + self.transport = None - self.transport.close() - self.transport = None - else: - _LOGGER.debug("Skipping message: %s", line) - elif not line: - break - - if is_ok: - _LOGGER.debug("Got OK message") - if self.transport is not None: - protocol, code, reason, headers, body = self._parse_sip_reply( - response_text - ) - _LOGGER.debug( - "Parsed response protocol=%s code=%s reason=%s headers=[%s] body=[%s]", - protocol, - code, - reason, - headers, - body, - ) - rtp_info = get_rtp_info(body) - remote_rtp_port = rtp_info.rtp_port - opus_payload_type = rtp_info.payload_type - to_header = headers["to"] - ack_lines = [ - f"ACK {self._request_uri} SIP/2.0", - f"Via: SIP/2.0/UDP {self._source_endpoint.host}:{self._source_endpoint.port}", - f"From: ", - f"To: {to_header}", - f"Call-ID: {self._call_id}", - "CSeq: 50 ACK", - "User-Agent: test-agent 1.0", - "Content-Length: 0", - ] - ack_text = _CRLF.join(ack_lines) + _CRLF - ack_bytes = ack_text.encode("utf-8") - self.transport.sendto( - ack_bytes, (self._dest_endpoint.host, self._dest_endpoint.port) - ) - - # The call been answered, proceed with desired action here - self.on_call( - CallInfo( - caller_endpoint=self._dest_endpoint, - caller_rtp_port=remote_rtp_port, - server_ip=self._dest_endpoint.host, - headers=headers, - opus_payload_type=opus_payload_type, # Should probably update this to eventually support more codecs - ) - ) - except Exception: - _LOGGER.exception("Unexpected error handling SIP response") + if not is_ok: + _LOGGER.debug("Received non-OK response [%s]", response_text) + return + + _LOGGER.debug("Got OK message") + if self.transport is None: + _LOGGER.debug("No transport for exchanging SIP message") + return + + protocol, code, reason, headers, body = self._parse_sip_reply(response_text) + _LOGGER.debug( + "Parsed response protocol=%s code=%s reason=%s headers=[%s] body=[%s]", + protocol, + code, + reason, + headers, + body, + ) + rtp_info = get_rtp_info(body) + remote_rtp_port = rtp_info.rtp_port + opus_payload_type = rtp_info.payload_type + to_header = headers["to"] + ack_lines = [ + f"ACK {self._dest_endpoint.uri} SIP/2.0", + f"Via: SIP/2.0/UDP {self._source_endpoint.host}:{self._source_endpoint.port}", + f"From: {self._source_endpoint.sip_header}", + f"To: {to_header}", + f"Call-ID: {self._call_id}", + "CSeq: 50 ACK", + "User-Agent: test-agent 1.0", + "Content-Length: 0", + ] + ack_text = _CRLF.join(ack_lines) + _CRLF + ack_bytes = ack_text.encode("utf-8") + self.transport.sendto( + ack_bytes, (self._dest_endpoint.host, self._dest_endpoint.port) + ) + + # The call been answered, proceed with desired action here + self.on_call( + CallInfo( + caller_endpoint=self._dest_endpoint, + caller_rtp_port=remote_rtp_port, + server_ip=self._dest_endpoint.host, + headers=headers, + opus_payload_type=opus_payload_type, # Should probably update this to eventually support more codecs + ) + ) @abstractmethod def on_call(self, call_info: CallInfo): @@ -568,10 +569,10 @@ def on_call(self, call_info: CallInfo): def hang_up(self): """Hang up the call when finished""" bye_lines = [ - f"BYE {self._request_uri} SIP/2.0", + f"BYE {self._dest_endpoint.uri} SIP/2.0", f"Via: SIP/2.0/UDP {self._source_endpoint.host}:{self._source_endpoint.port}", - f"From: ", - f"To: " + f"From: {self._source_endpoint.sip_header}", + f"To: {self._dest_endpoint.sip_header}", f"Call-ID: {self._call_id}", "CSeq: 51 BYE", "User-Agent: test-agent 1.0", From bc663bd4672dd2c1046cc415a9159869e33868ea Mon Sep 17 00:00:00 2001 From: Jamin Hitchcock Date: Tue, 27 Aug 2024 20:39:56 -0500 Subject: [PATCH 17/19] Cleanup RTP/C servers when call ends --- voip_utils/call_phone.py | 20 ++++++++++++++++---- voip_utils/sip.py | 8 ++++++++ 2 files changed, 24 insertions(+), 4 deletions(-) diff --git a/voip_utils/call_phone.py b/voip_utils/call_phone.py index 249cdff..3cc3f18 100644 --- a/voip_utils/call_phone.py +++ b/voip_utils/call_phone.py @@ -1,7 +1,8 @@ import asyncio import logging +from asyncio.transports import DatagramTransport from functools import partial -from typing import Any, Callable, Set +from typing import Any, Callable, Set, Optional from .sip import CallInfo, CallPhoneDatagramProtocol, SdpInfo, SipEndpoint from .voip import RtcpDatagramProtocol, RtcpState @@ -36,9 +37,11 @@ def __init__( super().__init__(sdp_info, source_endpoint, dest_endpoint, rtp_port) self.call_protocol_factory = call_protocol_factory self._tasks: Set[asyncio.Future[Any]] = set() + self._rtp_transport: Optional[DatagramTransport] = None + self._rtpc_transport: Optional[DatagramTransport] = None def on_call(self, call_info: CallInfo): - """Answer incoming calls and start RTP server on a random port.""" + """Answer incoming calls and start RTP server on specified port.""" rtp_ip = self._source_endpoint.host @@ -60,6 +63,15 @@ def on_call(self, call_info: CallInfo): _LOGGER.debug("RTP server started") + def call_cleanup(self): + _LOGGER.debug("Closing RTP/C servers for end of call") + if self._rtp_transport is not None: + self._rtp_transport.close() + self._rtp_transport = None + if self._rtpc_transport is not None: + self._rtpc_transport.close() + self._rtpc_transport = None + def end_call(self, task): """Callback for hanging up when call is ended.""" self.hang_up() @@ -77,13 +89,13 @@ async def _create_rtp_server( loop = asyncio.get_running_loop() # RTCP server - await loop.create_datagram_endpoint( + self._rtpc_transport, _ = await loop.create_datagram_endpoint( lambda: RtcpDatagramProtocol(rtcp_state), (rtp_ip, rtp_port + 1), ) # RTP server - await loop.create_datagram_endpoint( + self._rtp_transport, _ = await loop.create_datagram_endpoint( partial(protocol_factory, call_info, rtcp_state), (rtp_ip, rtp_port), ) diff --git a/voip_utils/sip.py b/voip_utils/sip.py index b76c7e3..c4e04c2 100644 --- a/voip_utils/sip.py +++ b/voip_utils/sip.py @@ -566,6 +566,10 @@ def datagram_received(self, data: bytes, addr): def on_call(self, call_info: CallInfo): """Handle outgoing calls.""" + @abstractmethod + def call_cleanup(self): + """Handle cleanup after ending call.""" + def hang_up(self): """Hang up the call when finished""" bye_lines = [ @@ -586,12 +590,16 @@ def hang_up(self): bye_bytes, (self._dest_endpoint.host, self._dest_endpoint.port) ) + self.call_cleanup() + self.transport.close() self.transport = None def connection_lost(self, exc): """Signal wait_closed when transport is completely closed.""" + _LOGGER.debug("Connection lost") self._closed_event.set() + self.call_cleanup() async def wait_closed(self) -> None: """Wait for connection_lost to be called.""" From c6c0ade4bce979d403534b403ba6330171ebc5d3 Mon Sep 17 00:00:00 2001 From: Jamin Hitchcock Date: Tue, 27 Aug 2024 20:44:11 -0500 Subject: [PATCH 18/19] Fix import sort --- voip_utils/call_phone.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/voip_utils/call_phone.py b/voip_utils/call_phone.py index 3cc3f18..88fbc8e 100644 --- a/voip_utils/call_phone.py +++ b/voip_utils/call_phone.py @@ -2,7 +2,7 @@ import logging from asyncio.transports import DatagramTransport from functools import partial -from typing import Any, Callable, Set, Optional +from typing import Any, Callable, Optional, Set from .sip import CallInfo, CallPhoneDatagramProtocol, SdpInfo, SipEndpoint from .voip import RtcpDatagramProtocol, RtcpState From ed86226cb185a1ae2c96cb4b73d3a25bbd715cea Mon Sep 17 00:00:00 2001 From: Jamin Hitchcock Date: Wed, 28 Aug 2024 07:37:51 -0500 Subject: [PATCH 19/19] Minor codestyle improvements --- voip_utils/sip.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/voip_utils/sip.py b/voip_utils/sip.py index c4e04c2..df32b34 100644 --- a/voip_utils/sip.py +++ b/voip_utils/sip.py @@ -190,10 +190,10 @@ def datagram_received(self, data: bytes, addr): caller_endpoint = None # The From header should give us the URI used for sending SIP messages to the device if headers.get("from") is not None: - caller_endpoint = SipEndpoint(headers.get("from") or "") + caller_endpoint = SipEndpoint(headers.get("from", "")) # We can try using the Contact header as a fallback elif headers.get("contact") is not None: - caller_endpoint = SipEndpoint(headers.get("contact") or "") + caller_endpoint = SipEndpoint(headers.get("contact", "")) # If all else fails try to generate a URI based on the IP and port from the address the message came from else: caller_endpoint = get_sip_endpoint(caller_ip, port=caller_sip_port) @@ -368,8 +368,8 @@ def __init__( self._closed_event = asyncio.Event() self._loop = asyncio.get_running_loop() self._session_id = str(time.monotonic_ns()) - self._session_version = str(time.monotonic_ns()) - self._call_id = str(time.monotonic_ns()) + self._session_version = self._session_id + self._call_id = self._session_id self._source_endpoint = source self._dest_endpoint = dest self._rtp_port = rtp_port