From 3d6ef1833e01a32ba1fbed6e47e734d8547cb76c Mon Sep 17 00:00:00 2001 From: Xin Wang Date: Thu, 18 Jun 2026 13:55:03 +0800 Subject: [PATCH] feat: Enhance text-to-mic CLI and GUI with model selection and Edge-TTS support This commit introduces significant improvements to the text-to-mic functionality, including: - Added command-line argument parsing for better user interaction. - Support for Edge-TTS, allowing audio generation without an API key. - Dynamic model and voice selection based on user input and environment variables. - Improved error handling and user feedback for audio device selection. - Updated default voice settings based on selected TTS model. - Removed unused compiled Python files from the repository. Changes: - text-to-mic-cli.py: Implemented argument parsing and client initialization logic. - utils/text_to_mic.py: Integrated Edge-TTS audio generation and updated voice selection logic. - Cleaned up unnecessary compiled files in the utils/__pycache__ directory. This update enhances usability and flexibility for users leveraging different TTS models. --- text-to-mic-cli.py | 186 ++++++++++---- .../api_key_manager.cpython-312.pyc | Bin 7261 -> 0 bytes .../hotkey_manager.cpython-312.pyc | Bin 40361 -> 0 bytes .../presets_manager.cpython-312.pyc | Bin 38348 -> 0 bytes .../resource_utils.cpython-312.pyc | Bin 1735 -> 0 bytes utils/__pycache__/text_to_mic.cpython-312.pyc | Bin 78455 -> 0 bytes .../tone_presets_manager.cpython-312.pyc | Bin 26011 -> 0 bytes utils/text_to_mic.py | 238 +++++++++++++++--- 8 files changed, 349 insertions(+), 75 deletions(-) delete mode 100644 utils/__pycache__/api_key_manager.cpython-312.pyc delete mode 100644 utils/__pycache__/hotkey_manager.cpython-312.pyc delete mode 100644 utils/__pycache__/presets_manager.cpython-312.pyc delete mode 100644 utils/__pycache__/resource_utils.cpython-312.pyc delete mode 100644 utils/__pycache__/text_to_mic.cpython-312.pyc delete mode 100644 utils/__pycache__/tone_presets_manager.cpython-312.pyc diff --git a/text-to-mic-cli.py b/text-to-mic-cli.py index 3610080..54515be 100644 --- a/text-to-mic-cli.py +++ b/text-to-mic-cli.py @@ -5,19 +5,58 @@ import wave import threading from dotenv import load_dotenv import os +import argparse # Load environment variables from .env file load_dotenv() -# Set up your OpenAI API key from the environment variable -api_key = os.getenv('OPENAI_API_KEY') +# Default API config (will be overridden by CLI args if provided) +api_key = os.getenv('OPENAI_API_KEY', '') api_base_url = os.getenv('OPENAI_API_BASE_URL', '').strip() -# Create client with custom base URL if provided -if api_base_url: - client = OpenAI(api_key=api_key, base_url=api_base_url) -else: - client = OpenAI(api_key=api_key) +# Client will be created after args are parsed +client = None + +def get_client(key=None, base_url=None): + """Get or create the OpenAI client.""" + global client + effective_key = key or api_key + effective_base = (base_url or api_base_url).strip() + + if not effective_key: + raise ValueError("API key is required. Set OPENAI_API_KEY env var or use --api-key") + + if effective_base: + return OpenAI(api_key=effective_key, base_url=effective_base) + return OpenAI(api_key=effective_key) + +# Model name aliases +MODEL_ALIASES = { + 'cosyvoice2': 'FunAudioLLM/CosyVoice2-0.5B', + 'cosyvoice': 'FunAudioLLM/CosyVoice2-0.5B', + 'tts-1': 'tts-1', + 'tts-1-hd': 'tts-1-hd', + 'gpt-4o-mini-tts': 'gpt-4o-mini-tts', +} + +# Map alias to full model name +def resolve_model(model_input): + """Resolve model alias to full model name.""" + if not model_input: + return None + return MODEL_ALIASES.get(model_input.lower(), model_input) + +# Check if using SiliconFlow +def is_siliconflow(): + """Check if the API is configured for SiliconFlow.""" + return api_base_url and 'siliconflow' in api_base_url.lower() + +# Format voice for CosyVoice2 +def format_cosyvoice2_voice(voice, model): + """Format voice for CosyVoice2: model:voice""" + if model and 'CosyVoice2' in model and is_siliconflow(): + return f"{model}:{voice}" + return voice def list_audio_devices(): p = pyaudio.PyAudio() @@ -88,14 +127,21 @@ def play_audio_multiplexed(file_paths, device_indices): p.terminate() -def stream_audio_to_virtual_mic(text, voice="fable", model=None, device_index=None, device_index_2=None): +def stream_audio_to_virtual_mic(text, voice="fable", model=None, device_index=None, device_index_2=None, api_key=None, api_base=None): # Get model from environment variable or use default if model is None: model = os.getenv('OPENAI_TTS_MODEL', 'tts-1') - response = client.audio.speech.create( + # Format voice for CosyVoice2 if using SiliconFlow + voice_to_use = format_cosyvoice2_voice(voice, model) + print(f"Using model: {model}, voice: {voice_to_use}") + + # Get client with potential CLI overrides + effective_client = get_client(api_key, api_base) + + response = effective_client.audio.speech.create( model=model, - voice=voice, + voice=voice_to_use, input=text, response_format='wav' ) @@ -118,44 +164,100 @@ def stream_audio_to_virtual_mic(text, voice="fable", model=None, device_index=No if __name__ == "__main__": - import sys + parser = argparse.ArgumentParser( + description='Text-to-Mic CLI: Convert text to speech and play to virtual microphone', + formatter_class=argparse.RawDescriptionHelpFormatter, + epilog=''' +Examples: + %(prog)s "Hello world" + %(prog)s "Hello world" --voice anna --model cosyvoice2 + %(prog)s "Hello world" --voice alex --model FunAudioLLM/CosyVoice2-0.5B --device 8 + %(prog)s --list-devices + %(prog)s --list-voices +Environment variables (optional, CLI args take precedence): + OPENAI_API_KEY - Your API key (required for API TTS) + OPENAI_API_BASE_URL - Custom API base URL (e.g., https://api.siliconflow.cn/v1) + OPENAI_TTS_MODEL - Default TTS model (default: tts-1) - arglen = len(sys.argv) +Model aliases: + cosyvoice2, cosyvoice -> FunAudioLLM/CosyVoice2-0.5B + tts-1 -> tts-1 + tts-1-hd -> tts-1-hd + gpt-4o-mini-tts -> gpt-4o-mini-tts - if arglen < 2: - print("Usage: python script.py 'text to convert'") - print("Environment variables:") - print(" OPENAI_API_KEY - Your API key (required)") - print(" OPENAI_API_BASE_URL - Custom API base URL (optional)") - print(" OPENAI_TTS_MODEL - TTS model to use (default: tts-1)") - print("") - print("Example models:") - print(" - tts-1 (OpenAI standard)") - print(" - tts-1-hd (OpenAI high quality)") - print(" - gpt-4o-mini-tts (OpenAI)") - print(" - FunAudioLLM/CosyVoice2-0.5B (SiliconFlow)") - print("") - print("For SiliconFlow voices with CosyVoice2:") - print(" The voice will be auto-formatted as: FunAudioLLM/CosyVoice2-0.5B:alex") - sys.exit(1) +SiliconFlow CosyVoice2 voices: + alex, anna, bella, benjamin, charles, claire, david, diana - print(f"arg count {arglen}") +OpenAI voices: + alloy, ash, ballad, coral, echo, fable, onyx, nova, sage, shimmer +''' + ) - # Get TTS model from environment - tts_model = os.getenv('OPENAI_TTS_MODEL', 'tts-1') - print(f"Using TTS model: {tts_model}") + parser.add_argument('text', nargs='?', help='Text to convert to speech') + parser.add_argument('--voice', '-v', default='fable', + help='Voice to use (default: fable). For CosyVoice2: alex, anna, bella, etc.') + parser.add_argument('--model', '-m', default=None, + help='TTS model to use. Use alias (cosyvoice2) or full name (FunAudioLLM/CosyVoice2-0.5B)') + parser.add_argument('--device', '-d', type=int, default=None, + help='Audio device index to play to (use --list-devices to find)') + parser.add_argument('--device2', type=int, default=None, + help='Second audio device index for multiplexed playback') + parser.add_argument('--list-devices', action='store_true', + help='List available audio output devices and exit') + parser.add_argument('--list-voices', action='store_true', + help='List available voices for the configured model and exit') + parser.add_argument('--list-models', action='store_true', + help='List available model aliases and exit') + parser.add_argument('--api-key', default=None, + help='OpenAI API key (or set OPENAI_API_KEY env var)') + parser.add_argument('--api-base', default=None, + help='API base URL (or set OPENAI_API_BASE_URL env var)') - if arglen == 4: - device_index = int(sys.argv[2]) - device_index_2 = int(sys.argv[3]) - elif arglen == 3: - device_index = int(sys.argv[2]) - device_index_2 = None - else: + args = parser.parse_args() + + # Handle list commands + if args.list_devices: + list_audio_devices() + exit(0) + + if args.list_models: + print("Available model aliases:") + for alias, full_name in MODEL_ALIASES.items(): + print(f" {alias:20} -> {full_name}") + exit(0) + + if args.list_voices: + # Detect if using SiliconFlow based on API base URL + if is_siliconflow(): + print("SiliconFlow CosyVoice2 voices:") + voices = ['alex', 'anna', 'bella', 'benjamin', 'charles', 'claire', 'david', 'diana'] + else: + print("OpenAI voices:") + voices = ['alloy', 'ash', 'ballad', 'coral', 'echo', 'fable', 'onyx', 'nova', 'sage', 'shimmer'] + for voice in voices: + print(f" {voice}") + exit(0) + + # Validate text argument + if not args.text: + parser.print_help() + exit(1) + + # Resolve model (alias -> full name) + model = resolve_model(args.model) if args.model else os.getenv('OPENAI_TTS_MODEL', 'tts-1') + print(f"Text: {args.text}") + print(f"Voice: {args.voice}") + print(f"Model: {model}") + + # Get device index + device_index = args.device + device_index_2 = args.device2 + + if device_index is None: list_audio_devices() device_index = int(input("Enter the device index: ")) - device_index_2 = None - - stream_audio_to_virtual_mic(sys.argv[1], voice="fable", model=tts_model, device_index=device_index,device_index_2=device_index_2) + stream_audio_to_virtual_mic(args.text, voice=args.voice, model=model, + device_index=device_index, device_index_2=device_index_2, + api_key=args.api_key, api_base=args.api_base) diff --git a/utils/__pycache__/api_key_manager.cpython-312.pyc b/utils/__pycache__/api_key_manager.cpython-312.pyc deleted file mode 100644 index e317ee054d48229f528e373f5b8549a4d57be2db..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7261 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 XiT8g<&!0)hbIa={uICBCoDK5-Ahwxs diff --git a/utils/__pycache__/hotkey_manager.cpython-312.pyc b/utils/__pycache__/hotkey_manager.cpython-312.pyc deleted file mode 100644 index 6476653625875530e71c876ac2cd9c1e42bed528..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 40361 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 diff --git a/utils/__pycache__/presets_manager.cpython-312.pyc b/utils/__pycache__/presets_manager.cpython-312.pyc deleted file mode 100644 index 93971626901c965c4fcd231a68913a83e30f3f45..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 38348 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 YRsN;UiTKY=r|kNZ`lmYf!wUO<0h%_mUH||9 diff --git a/utils/__pycache__/resource_utils.cpython-312.pyc b/utils/__pycache__/resource_utils.cpython-312.pyc deleted file mode 100644 index c7e4a78a198ace7879d36e63eacd1b433de7e088..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1735 zcmah~OH3q17_REaJb{7Phb+iiVM*MHf*wp33A+XYB8S}&(Zf#0bb7iA=%HsCt7~9q zGMJ6wfRDuNX~fmQQNkw6(M>cyu3lErsJ$`SL@(ahg+#;2zq+SqU@u!q|F8P0>aYJ% z{bPH30>Sv~=Wphzg3w<=2?yx@ICuqE9hu0)Hp&JZXEErKEfwXgjFE(BC^G^?KpSv$@G|IiM3LAyE15VeQ^l0l&`txLRY8X% zntG(7WK^&HP3k&jX3)2}WxLg3!7N@OhON6UnR6If&`YLmmF5X+AYB3$q6>$}5_pu? zjm04YAM+{-vJBtBI9Tf_j(Bsj5IWqnAhe2kBvcErP-^i)S4$418m^%*R;v;}71~Xy zhHgVFYtn7>g|gG|3Zt4di!LA@<^&BOHiOYq&P|59w)j(4w6~CPDd=8Y* z&ycU;>*(W;R?rRkI$FUQrK(L)PWS>Pdfs*HGN)uo=L>{8zA?q9jQ$}cM*Gb8aE?+lR~AK{3&W-P>d;a}xD#}Ne{!`~#G%;~LnkIh zeY)=fxrz28YW#KlcX#h*+eX{^^kEx1eYSq-)}{LBtVN>z@2@dS4abBR35$yx%#dqVLtQv*YLGANnxR6K$vh#BW0rggWBQ z7Uj(*EC|dK0~)J=4EZXq;eu%DCx(gdNFfHJiVTIC7H<^M3B(T`i8;%rLvO+RrRHtN zSiF`|m~e=RQ`s3HP&I(hNM6EUpos-uMA#^Eg_ne|(*lU z5rjS6_xU@&^$q{jH~dx4Uf;xC*W`NS_gKd#$q$mB4y-4CjXie&Pj31!*1C;m^UHDfyhsk3E#9#S8QiPU@ diff --git a/utils/__pycache__/text_to_mic.cpython-312.pyc b/utils/__pycache__/text_to_mic.cpython-312.pyc deleted file mode 100644 index 8777f7b3ed34e7ce5d6fce889ea2b83b631faa71..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 78455 zcmd?S33y!BbtYIVP=zY&g}ne27GfcG5(G$a1qqNK34#m24I&AHcm=RPY;5VEeCeh4%n(6Nw+G4jI zs%Lusb6>spstS*bV$bq@T_oB`|s=9e;6HC;Vi&FraD zTc&GZK`3qak!D$9aBxy&BM*i?wo3wZXIrA_VlT? z>21T?m_1`^`*izoJF{m_?U?Qu?qK$;sm|%0!#kNhdurEo*Kil?IbSmj?=~5Z7`WW8 z890~MIQg>D1={ypX4yWxcfnYn_Zc|`>dlhn=-BLxWIN%VnLirvPD>WD!QXmxdUV1o z+1aOuAH5-^GV9Rw`c%mr2wa!aroDbY;#{45S#tV)({oc^&Nn(WJHb=GOV-2u=(JZ# zIW#)+(x_ju503G(Q&U$*`Ff+2a&pc)(|r^+$JFd7H^R*ZyfZJsX*o3-xQ4H@d!F;n z4tgi1y)yy0)4NX{J?>pNF*<_+DTnmF*}(M#k27BX>^wi_Jsa>%`QJ54IYYBE-c!8S z?+y61bQzm`GP{rVa=ySUuSLon^acXHnTfb`soisPL*AFEE*a;%yx%uFbLg6P?7Ej9 zlff#R1Y`R9d?$=I4FQaM`NtW*6|-}upu=ETGz4P(VK9UYt7awCXjm}RTLz>Q^vbwz z;<2R}fI({@4hATPTx-~TRumaApue* z^1<)(pP<&i1z366$}ntNGK?EJ4W^TGz)a`*IOo@l!x>yUT$x-3%q%VwW;T}vGl$EDnagI5i)PJm9_NCY&*i}^ z;PPP>as@EckW(RYD#Eu2-(s#9z9n1xmUHDWJ)8$-1y=#HlB)GS1osxtA(qMtAnc^u6nq(a>ux>_%^`ZfNvwdjrcZkO^DUZ zHN$M-T41(vtuWiTHkjMEZ7{cU+hMkI?J#$6J79Kj9WXn&PMABnoiKNCyI^*4T`+ee z@7>6I54Q)dz1&`y`?!5D_jCJU9^ekZ?B=>*9^?+fJj5M>*~9g~?B#l49_9|iJi;A; z*|%hP**JW3&`^I|veTRynmyqg8&jtOIz0t{Y?^!nQ{f*OF;QqJu;0zpkl}Z*fP5?F z#`0zi8Ag=hg2^(O8Vid1a3=U$;yhy3-!uHaNt;@TW8WNyQzzddN}5ECl7E~fkgoVm zW+*o88#1n1l~TSHtEtgor@GQaP5M2d7Aa~DF-W21fW?SfW6lN_+iWRA&JLGaS1t`M zr&18-fJ?10$}3euv@d*fG?!xgJp<=Nh)Z#6UqDiYlaX3hu7xQ!tknuI z7AQVkHe9sWv7ZmH7%5U*fgOr%vO}?H-;g1$1h?Xk8mc{~_yM8Xt=SbDm&4^ME#q9* z>#zruA~o$bNx#XxNgi-=E~Rv%;g)fx`b(tD(^7KzizcpM(aaStTDYP`>l1R>uTy?; z$h2Cb)SrzZy_)N#bcakK%WA2D!hET;Wg+X|Ic@o`P_E}!NL%qM)VY$CTlIH>Rkco9 zo&I3`sIF39VgzjAYPj0JV?Wk$^_$XmZysgJ+F>*V4k@8=e!Ys{2a0KERO08T~yL*Uj=$-Uz6gCn3om1_Kl0#qWA_z72D)h#io4|>b_0!NA44fUHiu6-mdr} z=5@uceU+GtDREGk(!v#+5)UowRQ!L@r0Zjxh5s2)n+9x)U`_~EpS7zCBSiy;v0BHu_c7>(|q*~ij!Ye!nH3-Ro4NI zcDw^h7~u8y6ub6SAj?+jzpwc#HZ45xTZ&&o9eWhtz;7$I5MdoUIGzF{)JmPxPv}LR z{!(hfXCciSN?F=h34bn}M?+)P4D`l`k|$q_GH_;~xMh8P-^=EUh8xEE)`6h4t+~CqEm%RQyeBa0 z0W$Boy5P}Hmd#_c)1D^JOTnU1Kb^K)Km(X<8uRgEQ{JZS+nVQQCJy5WYoX&}Ff$g% zhXZai4Br3{W?v9(@JVEwBEtYfGQKQX_|bs(vww_wN+~bR`o_Hedh=t)#9W}MoldDU zzF>;%2+E#KfqDMwEKiG%WCDpI^M-GRn}spqU+^>P#^{UlqmpH8YIHi7S~b1{|2kpu zw&GtqEZfl6I!{0s-*{?V)6DV)Oz$&=E?XL)ZdD0S%I zd>{adigSq32d*lvGov7A#9WRcBC^CBDMP(80e+$0BxR2Kyi=T34o~P2j!=hYr?1X} z$`Z^zYW=$w>xuzRp~9-ZN5Oe89j-#oK-8WPgA6slnc!5uHTEn?kjewh8a-v=_jZ z(#Jqo^713{_>gQje1U5mBXZ3x1Oon-w@Vgku$1DRnefecB?rd!DSj5P2mp)|agKC( zWR1wfQ_32BY1B70dUeV>GCj+Ar~Fbn=N%uNp9;usi9umxY!ra!>1Zce2LlTLq}9(p zma);PDajtV=AHJA%=*(vn=s9*KZB>$ALDIZ_}x?F(AfI2tIOHR)F66P4Xn)ALaWyHHiwn^D&^~flZ z7?K$^=4s>L=}aeO z#%eJ#Ez=r#I@?M1QQrutn}D{Itwb0DIdgQ*kNKB2J?fi5t*B_n81KcRH3Guryp%zM z2sBY&&^t0Q@8juQEoERzU^c1+&_PhjjLj=~LSo9L2WBTGFp6Tc)jB$k@rrR9KVKy~ z=cP&I8()xe=I1ynS02$LeiT`6lPrGk)VMq=O(67h0PUa(g4T!w*voc|}oIjp(WoY7d58 zhnDOVHREQ+t@&?UeQWye^jcA*Y5EVLX5ySpRK zgAX$dB~(u4M(x%mOT<>av89f_l^cyM^sV36+C<-4lxI(WBmHLj9oJjscguys`jzaJ z_GrTqvEhiYwNJ=D8nGQ?k)pO@(N-L>xz!}EXFf_X6qLO=b$jaTGbqeKHFex{L~Z4w zt$aCU#T>CUZj@HM^}^j3qNVL(Y5UrRaOplOxA?C;ee^BeC}s64My4gDRN+ta3g5hV z`{JFz*GJ$?+i+yQ(Rs7;jXgK_+_4B{En!FN+To8KUDWVnH;+Y~9?|Jp&i{$C4mqS} z$NNQ?Utz^k-$qIGQvXI#<P{=`h-{ZSVSIF}euw6^fkFblYl z7*Mv}C!BtPg0)^RYoEhuj%iFZk#@3pmRXMQzohtvX_>xo^v3U0b*% zTF@#Mw63|r1s&)N=lzoMWy?Fxx1He=4 zj)75H{#O6p{uNi)-Ap}Qbid5=*3{jpmG*F1D|wVWsMr#%=oBkD!xg*8qimzLAzHgv ztlb-~-A^9XluJw0eL!>{xQBcWvwSuvS+7{p8?HFQlA-dh!f5UmF?UNiw|2>Pzu5g& z)7_@u!$8OQ$B@jtnHjZ}h_;eDeXL5Q>(;P)U&OW_`B!aur|IpcwQKKBy*DKsIxk$j z9PYRhsl?ce*vb*^X*!^2nyVaiu3*)<(IO#0pvKdB6X?{&0CWD+;MG!1v$WA9a+8jCIQQmkd7hFe0$kU0qIF=q?{ zxdz=16ty^a3er2Ybczjhbt`DXrces#zZT^Tic2bUy(Q>5#E>WtkQI--?RaKqn9Gk% z5SZv^D9P~H*f3C^B4x$)Cm%QE4UGD)1A9Q4@!1hM?hPLoxF+SqdtLMTCawh}hwLXu zaLNujh(Cwy>r?rg_}~VTm5Ke2GD?rRVtG(9oCB1=m@Ae`10^>u_zAqRZB5?Q&ch>E zpzUf2IOBhhK>ycZyk>Yn1G`kTm14SJFcrF^1x;c>Q@EgI$+-bnVT)MU5-x08N{@xs ziUqadg8Eo!y;xWuE^J_-8O3+{#q_$B)1tF^$+(eTeCM*5zIEkA(b>9WWCNA$Q^q?L zcXID^-x<9#cFY=b7wfb% z4VCp%c^;1p`3czN11GyX!X2nC;wvDUp9+1=@M&Jrow~1ISxVcm&`CiWnvI{2W6s7yXEN4mgsDG`F2NwCGfTD0U7WFvdh?WvyM^Ltt`ZKF^us)} z{Jwe7q+J?MV!kH-Fpo_dnL+R7fU~Zqe2e-Yze&RNlYU$(m%3`x`Zu87QR&?Xg^ajq zGV0w3t)?lI2i;N}tIoLf!cd<+5Om-Y-4nY#mr}R4w!Yl9qcv!Y`FMhbX=xscvWdFj z1Gk3ZT`(&UmMW!A&iey|^QPV4N5OS4GZDD<8G#Bz&oVd4fo=eEL9!m2n)Q3%HSzBt zOiBfn0ysSf_aDK{Q%}EZkwGGW8yO+FEd_TpY<%K^EL$b2-zGUg|Jv>C2 zk6o9~ZYc-l<9#aU^#}Obg?G*JxX$s-z&$?}0Gohv#&pK{`TaEdu-LHSj%fgsfn3@r6 zmm{`WY|C~TMbF)`azxmBGP?J?xHmrTBqDxdyS{mb(JWyz?Ek`Cqw9TbRNqu@!EPEx z)IIa2VNz#i!B=NSuByxwMgw9zZC^A7)Lro=_AzDD^G>AGnO!qrPFggDO#J1LX;P)x zqAjr>W`mgygq(#;WqdE1pAp-d5Zm&M*eMCIu~R>_CaDRrQ)Xz-=A_?q zq|8Oi{G?=XK1WIyQW6~?>6etUBqF(sF?BR?Vf@o+G~^q-<2;YhU;_ zYc9nWpWl}nt2X4PGoE$FYH`SxFjj54W3?n?#xCsseKT?<`eo8DVHD`+P>Pi5J(iX{ zDdkhgPe?!KvXDisTf3ICVoNGP9YIPs)~s@d%cFIS#me(F+jFF;Ak04o5h8Xc{o-@@ zQhjIt5`9-0vM2PNUAOP5kfRPiL3|BE`YEfCQoU2t8u%P3w;-i@+oqoq?0hu?^|<{Y zf*}8!h$N-T1VBG%jZ>owBcQ6q2&+;yD7qlU)i8L?Hy&u%nc!+oaP3NPwJ`(;6-y0xNBPX>OM{d@1+OKmq47p4>!LCBbd>B)N^QdZh?rRs8%os5w6aT@|&+}f$p%`ik4WZn*7@DInDDUM6Ax}yJZBkU(;v+5 z!|g@fwUg(de36mb&G0OL(00a40QJ1^*myaZ4McKk!4p@_VE!P1wPg?h^{6)~o)>~y z$v$JKs`?`=hG^@b(*jAnYUp!yM^$6tT)nE|_+WiA573pDo!zlerRt6RcM%x~Cmnnk zr>0CheQeu<%c!f|=)PdBhWN!1k(>8S&EitPzYi8UVkV0B(L!EnWR(8O@EU=G-CFWVF`p_|e`&qv? zSUBY6r~RJUadLTpGkf}RFMxdN%Vpl)R2s}+zf0ZhntI+XZ^7(yqUqd$nnXG0+V~^d=6~@T$N@RBR zz^3wH%A_b3%=$Toz{@0jet}B*8X5N}X7(tJ#}Tv(w{GknL@GwZK@Evb?vWVP9rrS0 z*FnIbX-^}E?gRP%f@Q&)8h?zCvgOuOca6-B(}hue8XI9eU1i7mf@jl0>x)cfl~FoJ zE(}?*i7REsmKfC|U4gcItC6l$OLp3?VK_0XpD^mL;8-L7|OvQbWr2ncil@4P-8*)NF;BzcCK55eFKr!lXqOvqQ;Ml8ilhL zmok0^l40>iS!1+pk65;6{lYz;xc8KB`l`5hEL_Gdo!lJ6iF>`_vT+2tw?^GvqPuH- z=e?ui?g8QCh`9SJVfX0LiOs3T#Jya&%zN`BDpuaa@?|-&xJxH-ZYnChGxXM_yO-A5 zB85Aa(uoA?ya_T9JEjHK(*>IcHysP9wd$I8_P)KB$~!IY zJ}q>fj#Ql?f~$vRutl_OSsA!D6z#n%_FfhyuK&VdxMu7%{Y?G{$iiT-A2vOps#9d4 zvFD>e^yIjBa$J}TAoh#KlN6givDl|fYSt|Fk6-=4tHQOZ=(V7DEr>V~+bhok*}~c) z16eN-!SZ83t6SSIY&&$XO{nXoDvXII#~3I$6%<07q7FNrqD)Eso1Dqc`@Q@ldrY3Ve!)1QP#$N8@6njptyW;eJHy3 zq`3E_K-9%kT0sALb+qf0*ma5poK^#b>U|$sqJ3AyK6HNRC$^EzM|0ZH=CFT={zD{lJwx39>BB{2}BwP;X@y`1}SO z?Bbp$${l|l2H?qvrKvOC8^p$uKq;m8v|q=#?3)ue(^3Lk8=?SgIpxuuW-+IEB@oVO zUrPO{BWI(e68BX7iT75&bNr#z;LMfb8h^S{hfN6iJqxbNX_zxIF6EMdO52%CLGq-Z z5}PP5IBl3hM&dRfG-$M&kV^3x1RW6KF+HO^sQ8bKE$><-8}_3BAskYQ%#0!PLKHHF zg}J#A@UYBbYhxGSKn}*3^o&BPvk_MkV;Zm_NS33areX_|iF3Ic-vdQuF@mKU#C3up z7iRdJP88VI9JzFb6?V9nZ67=8?iW-?3-*cyd&33$aVMK!c5C>~i_3+}X+my;;B5Fb zx8RQL>-z*}#Z%z_T+>#CS8UqWoFdG4)B|Q6pmWra*kC*pFE+&{ZyqWxrO_Tg!eT4q zFO9jF&`-h;{7;Ah#eP|0ck3RuJX%|?SFn%B`C3ilJdF390qQ&0;DFv{YEz~+X8DMf{x}%v}#mucM zd&8N#1lz97%MzhRG_F4X6JYK{5Y<0Ms8hkH$%pAJJqbiq%9s7VL>hIu`Vwi>Nz54` z1YiQ0(Y%O@MLqH)2O_6J;KOC3ejIB^y=GcWc|x3&kjhTGm>RMIY8gsvweL#?-i;8Q zrA3ca5K@J8jE0$#FOg0?;DL~qf^<4$%~(xzu6J~6q6+=QYVy44;ze((h%A#2C#^t|cfu7?9O$=FYi3=2Yh+y&I44FoTuVJH1KJ7*858_;BN zQZSrxq3)-K>X2dM(t0+h9k*zgTkMLVYI7XakFL04HDs~$NUKS)(AMY3>j|+Oi6w?W z0M!Jf(8D?;+{p%=n#T!9EfOK_dDCTbSxS2s)1Hv7NvFJQ2rk*VT+Rg|cWez|@X{++ zFMU4J7jT8KJc_;*L(9HY9>vI`L@$r0kJXS(nGK7MkmE_?lyh^Xt7XciD^>@`bM>-* zEC*K}Kdzp;e$J5d3H5VO{W#BRg$8}ZeV%csA1kSbT;*c=mlzFITy?_rv$j^~Tn>aB z9E65eYn3aEC$#VxD+O1_xmWAsTK^=-C(LMW>tY7lMfh{lPuZn0|J0QWG24@(!O5Gr zh8bFYbuIAQ0%bG1nspQwv^tq?b6^kLc@%2;htV7izU%6bA^ z9dYZV&I-)6uC{5TKCaZAn;{W$ptU+z2>QNyIE4cB3A&!qf#)9>|2T!)hA=|ClYTzq zKQJz4hq86siFFn8BcUybxi={bI78`N)#`R-4a8NSih1edXp{Rk=aJB39wnSJPZ%|U zHMF5e3DLfjL_$ycDKJq+K@j1KIdMIq-~a6i{hu4k)rE_lbN`zA|3Fgp;Y3??e4pO` zp&YfZ`!?rDeT~_m?#3wL*ydQeEtXfxgpu%s)XymgU}$pbIz<6N%6*QLOt62g6V787Hs=s3<&Hpq zQ7=aH@aE9fqskd;u`E=k+loZ0&NEsOhhJaXTpITKW8Cr8e&rkkoUcWRh5G5Wzd;Gt zzFaa@lS$hdTNw9L(&Z$h#Oe-m%io(c^(FEc+GL^Qg zEvx(zIe2w*sNyc7r#jUV$)!>^Kq0E;#uv8){7U#_K(T4xPz5&;s>H?Swcj^$zEE|D z*ar1ZRwix|RG$(q2jMSi=@r}R^>4+nLeyc8;)}R1D|YSsg#NSxH>g{kQch+VBhRY& zbf_x6=CRrlnIY+yP&<|Gf!c+VBEtEE+7T7TlTf?o9KnExs-6TTe)YLaoWc0^tj=oi zK1Tzv@?ZwZ*znZK!VKpi)w( zPH$aM<_u`hb(6oP#MQoBfHD2fe=Sb%2c^HR#ZYWdJ5TW0Nb`mgQ~PSAFF=1~l>vpt ze$@v4D~t7-5*O~JP(7`<3WO49XwMBH?gsZVV6>q0+v3*H)@MLv>rPxl4qQkpkx~ztBiBs2Kd0uWXCyN}djl*D0q_GZd`9aeI7(A) zFsVqMmJg%6!jmZ!nGT0wNszb*@Vz~&pXbiq0nHC%qkn7_v6$mZu_?JZR315<&nY{Afj9w zS{iwh*5Zj}N6sOOcn^}&x9-^4*}8-OT|}2m-W&B6-a+x5FeFF?Qv3aLqceOuJU$~T zEB_u9W!0kb#N5KdnGDxwWe5-ELRSjJvjWX=8dlI=x^!Y?1vAc(8X1qu>TKq-DVsl{ z2)VF4D70T-H8EuD>b(}buA7{NV$TZDd#=u}|KV-h=6jp3k zEO#huAvi1fd#J290BDV34AF>23?)p_Y|u%})G-F?uE#c|G|9&K{8RyM{s3z8*Z*Ys z|5$$m4AOqzm?Cfo4L#i)N6bgW%ABv zQNEPo3qX^_82lK7SWm~mL@i*jlG4CL>I-5-jZR@?BO6jO!XOyTl&6YXY_RYs&6d~< z^3=`F5j#85bp;Dg$uq}8BZnAZW0AUoTLzUmlpGeH!DqzX09eH|7M<~qa=}b>Xvji) z04t3?J_B_RW(W03ufn6JtLfmgI^!~y3iVvLN1#gki=8_#aapX}|@Y=Sj;?v#gN_{N!V- z4h-y{5$b|@sLr9J$-%EuE<0cZ3*tE9i5aaYHg2R`u#N>rpiT)|KuDJ}b;e<-m~l48 z^De8R2*G&fddjMIhK)c^9Wn6NW4uAymvrC+E0fApBSJu69vzOTP`R{|{S>IH!;7se zfVIUB_J7up&*v;k%maIhH>YCW+Cs?>>POR1K7o&n@U-Lpfw$=k}!TX;P8hjpCe=( zh4CxF;%Gc9dZO)pVtZet{TPEqeIFB)ki`(D051tr!Wy<9YhB{$Xv5EtLAv{Ro(w{^ z`8hI3mX&wHkSr6tkCTk&C1bB-9FUBI;M!-qrYuoU>Y|)LA5<6rDkY^QLrR&NoxMIk z$B&cGcgV-Zco2GfW^Z2_o+s*;E5j_K}-`>jA2=_&}5Kg4N0s_$#VYWnI8Tt zlqw@80Yx%f0W2hcLY~$$q|8jROwRgdq!e&llI|wEx^hAZn4igZU`|NpF(|6D9~!zY zPj>#VDFg5%GC?p|CPbAK@y}nKh8i~67y6iFNs)L@$tlkiiB2$srFZS+$m;pG9RT`X}bJt8zq=Lmqc>wCsdI$ns2A znkvVDoKgHKKpxzgTEpd7d76i;N-Y*IfT0HgA-s_ww>piDPuZTw>`?3`3n#^f1+)pU zk*Me+i@7Kx3=XERAT~JuSAsAT=Fwz>(ql0c#VIjo48*aqMeMbzA~oOiggWS0Tlix% z)Y6!87v|w_KtW#tL-lk1WU+wXK%#ig_QZW?J1y1!Af4?x4{{6QR3Cj>S^ZAq+l^pz zuWTo=mh$`VvS(;vf=me%W2J8t)h%UgxGM!)5q!#ONPcIfdA%uI+DBRz%4^>W-3~;3 z>bgF0?uKHbs8jP?Nsl-?9yrRE+oM&xMErN`V#!KHXKB<~Av!CB%8pN*oh+H=x!fFa zwmooEEDuGu>=yCgv0K=GR=7Cw@%|B(zFc&c%jF2wYO(R2J5a8wYHVdFlDCbiPa$1V zU`ikTPR{$T_gvrM-w(VO_?Kt?Z0JvizPIhe_7B>H*1o08i0vrT=S2Fo?wnqJk?GK? zXI@33t>{k0ayP&zi*DI-qqa)XR=M1^a$2xeG949A(vs)}$dzn~DUEU!zS(uVE1Fv^ z=2kCXSP6x5_bk~q@`~OZzC9exs}b{RmS0|Thx7I=r6F0os;@g&HYz(e>bGuGZ{66^ z_|R^!mp(FB?9C6I3DJboHi}o*wo%uj#ZG6jQxH2VDR#@#Vn50;6coSdyX{*}3+Fd1 zK?5Ax%QVm!mtR~vy&ixTnux83c{9Bn-7BL431hYDczuej7H%&r7l#WPp&!WRirNUC z%h@Z&wb6T)k2)Dt2U!5ADqB9i0@znaY;8JT08X)ciL`XZ!$>IIwtkrP*C9wGLBWUp zru|lfP~9%lbJJ4-JM_An%0FNz*BaJ)L_5v8U4} z${96GY!y5Uik2MsKueitm+09Q_UxvaSPHM|x@gt*kE^!dO@+W-^z7uvXD8QP(Om=L zu7QtU{CL-Cl<=bQkZCFX)1nd*|64f`DeA(o$oMqBh{4#gR(G!!yz3;@f!$(5cckzjDxSVk zSa$2>Z&oh{qP084+MTL)w{YbFvEaaxlj=&!{$5!tyZ1^YZ!n?6@0i}Vyr-0UzsUVo z+1;`g$J)^Qm*2a5ujj)PADoExoE3Y{hI`JVRmHs~VR#(vAxlgauSb@}V;^`EC`lL* zs?TI)Y?zc4Ydz~P3APd@kQfUhbymv*LRU=i3_S;JYWr^Pi#ke0M`_qm9(8OL9a~qr zB90EMHg7=rUR2gYxOLebaW<3RiJK>)PFk?;j7OYXkVTd&npysFCRXI~w~pRDx_o`3 z{`y7>=Ij1Pspisd)Uw}p(}jz#O)Ky zTh}f{Tn9;nE}I&2XLR}WTHE^2N2Vp{bR*q+v4PzvZ0Qj8o{887qqYm8?Sk-?QDNd* z5$lTDB9E~HuZ&@j-j^jf6%@&+J0JWKaJYLiJ^newY%kN ztr%BcTzB2WOoW8%@eNyvywb0f3Hz}_V)Z}!X>sXW^>^!+`-RRc!uX4kVtxra3JYYF zjLY3CZQnWb{?L0v_fps*b>zOM>Ya?YGgd+*3weqJdI`8*@r+jnarn&jjpp`;W>dv^ z<3{K1Xy*yB^F*}sjM#Z5+&P3A!~a1?SG41-*l`v$h7+QZRO7N()hgDq*W2#_IH=u; z4O^+K1#)Gd(0z`rt>-B+pqaSfVvLoPv4$KA7q=ueVLkg^`$rS30q0oTYDHTu*6<3! zRvWRk>v&Nag;85#JZ&7etYkcU7{|tMuL*@8Ykz(j|d_D7l?mkXy64OyhLbS{0*NQ)yjEsy%N5;jGabX%l!jOu7 zMU6yQ2MrWJxj;BAEAYI4;tEUT&2w#Eq~PGD?elv%AG$tpeUJYz@Im07Qy3f;M$tn+ zQm!Qd;?9-zRMvF|5Kz#HsShbWXkQfyn^xu{jvX7B1#g6Ih6MM{^(~Ri0~?+L_XvtcWvLyU$LxQTU!vD zyMYah%|qdev*E&XOsiorX#>sJU>{NnT2zANsi1htiK?UVm+xNQa29UlmM>=t<*jQ* zA$!|Kv3n!evyoG_QL{B#)A4al$L)*jM>n!-Hc&U$cG0!{QMSD-jet}9(1lSfFLg1k zyFjqkE%$&bmCIW}LK*3IUIqS@-KrIlSN3}GmQi&#GqUZ5@9>uppK zEZoN*%{yzq5e=fzXuqS$!YI5-UrrDdbf1tc%*3O(y{xPF+1<>T<(ch?+~kZ ztPf+*L`p6|b#Fz(Qh&r*21v=9YQ$Nt+V4z-8xeQ{puoPXt1|Tys7y5*oE5)(lxxT; z`ne&6igsoTuGY2eHM5Y@9&zpLQCYWE@W^Z|?piwbz?n~a zmLty64cT_5KfD#%hmVWS<6k^Xrwkwai*aiEMR|AiLW|*VTkNkCn*VlZcm6B6<}Y%s zaEuY@Qu)!X4*fls9D2NpMX1y<4Frp?1p;&au9lV?H*Pd*R81lwf|Qze!+Z5A2w$+?Y~R+VDQH)ohk#B?>%i>HilBGy^d%2=Ec; z@M0z?&?H)E(l1GYCbc%{$C+0x%FVJakGz$s*reXZ4>#CEjAuVRb#>rSNd;$-4hIgn z?g)nX>6T&#KOg#;eh}h@lF9-8W7wtC4k*s-+}7&rK@Ir-8ea1CC0)Yv|BQ@plR@{T z{6B|L@04lI{|$NclW~p=5*Cu2M+XLn&YV3oboAuFAR`9z|AGREiYZf@i8RWulkul8 z{8V9(abyzBr*H&I;zky!v5ePGa}G816E*KCIxC@+yE##3<);N@(SioCpyB@|U6pim z!v^y|wa~Q1wLc!9gvN&$@DZy1v}NcC;VNT;#`vL$R6zH#!(f=Oke-7c!{tVtJb0zZI=CmZ)F!BwMdLFD zuBPA88nR9ns0mdI7bhx=7<37l^y5_VNlX(}JZ(~ktxyxnhA4Q7-s^&a93}Hfk7Col zU;<9lU=Y``N-d6J3#G*6Rjv4H-&Kc_6GYBaCu_A3#TJ*oPVv*e&`+Q)4oKgig($YT z^cV%nzj)2LNMD{D4$)@~7R^r$^=u9Wq|%jzC!tqbH^)tY)Ha>)R6Rzv)eI$nCfxn> z`gd&3HLi7Z4V?5#&;_UqU5HP2B_)D$HA`Dgv&=|z%lP_#0+W=wjRn+gETC>!<7TileUu9 z)*-rI$2HXy9=v%OY&RTm3_L`Q*M<2}`j~kjYnW3YHy74;F!b?8y4gNZ%HC~kOY1RF*-p;Pl zq)gn>L4P@Wwg<0V2f!9Kiw2R#Il4#jlRoLdHGV4r(w}? zz2ke^_lMVSo!oF0{lW^*pHT>u3FTEi%rQ7i1V`olvMtfF9b(xIrXme*VdyHc##srJ zanQaPS(%hrKJ#ojo zTKVnTcWWd0+hRmJqJn*6+glxXJC^rHY}*;xo&3I;^G?azC5$H4q*Cqi!py|oiPeMO zKJxC7^&Un~?nd4*vf~y|WF7B0?!6H0Jty{_i@46KB*zn-|Dt+x4+v?M95a6 zDu6mpC9TwdyXoB~R?<#n_Iz5ke{sl25F{`@X2AR<)uZN{uSRwr6LOFL++a*ElClaP zn(=+?CsvX_&FE`4eUO^dS7ZI4$OijIHP*fs`$r9_WN&vJby|PmFv3h=nE=)!<3Du2 z|18}*-$ESvk-jV$pOGIl=gjO`b6_@ldc1+xSnx)&wkw*TBQpi;l>NS|JQyN_xumYs zH^wxYdIn{MO~HKaSl2|eA@(-;5dRh`K)h-ANS14O(~JKD+2iSDW3|4BWE8~DjN8sojGOnW1%>G~Wk6=-pj})t-gumO@>K6Y_t6nB5{?}2y}0+W zF%4Zo@RZkb>kS@kYG9dSebGbyl`QGFp9UJOTWr+=J1ntU#2zanSO<%>{zwkHL;Y|H z>0dK!&~2DmldF0mY z^2GARm8*iQE#lnv3p2ugK@omN#$!J)a>F0ycbm)~n5^B7)C3X*?a=IGZ~#N z={VL-0))*!&pR6EEeo3?<^+siofS{U_Bkj=LJy`U^dR)S1G|p(KJYl&7uYXkUbSnO z&Vnr&3wb?X#zKIBsCWl(jmAZ5+$*K($wA2#A{J?!LwhSi!`B%*w^|RdPumu)U$rif z9(sJ^*r%Pr`avRa5LJWNP)Q?RjL0GLDYf9CkC&Kove;W9Y@+it^7s$Y1N=v1`~b!P z?}4XeWeC9I!ozrT&kGXDtcS*pl6jX0doV*X{(y2IOoRVRGUzbG-yjU4`v_wvwMkKn}Z*{%l#70ZXkf~`w^_p|eEU0XJXv#T+v(>qs; z8(G#QnXen6z+&*bzo4Z6CF6caJla%&Zb|a!pY))@hFW^`;1f|mBXG2 zD}WZx?+t#G{paWI^$A;XNjD%m2fn~Qf>@9JbfEanmhL*kd->gN^9QLeSU+%EySJo% zP?1XZI{U#=^9OB}2Mf*LEwsX(u$!o)p<=-5`Bt_ky+otzHTO9dRD&^?DfTXIm;@B$=W5DLeOv&r#puvLGA=y_JhDbaE z#ILJtVE+-oBxNKns*jC(8DBDnA}y?hmD3A5@(}(CB>+bp@0-I1yJkRHY}Ii}jCRnu zowVMvhZLW%-X@3rF%8$(P=i&P}~nE}R6-KD=Ulf#B< z;$PTd!(DKe>#?8c4r>Jmjph$*Rb=ik!u+n$dN3_DVce-}^*XBlEG#B&^#&eu%jmah zBTP^Ifiglk6H})~Zv{VP9MO38|4#whS=jIC>#CBsvSzdWgqE$OpAyfBu^va?a3w{9 zlLH+oWB|Su!xV^$#Q#Rf%-%TGq2nkyV;50rIC=`#xD=2wJ^uNzYo1ZR$3N%w!bY1e z&}pXGJ(e5eiS#$8rJV=AEf_ozrfj2)o`unDSl6-aqTX8Q9CmkzU4d=-y4rr&ElgkC`cI zWh4gvClrmLIySt#x8U{9%<`X7dRn3INC95sV~+syKca{q!@$F@z=?>3Q^u173J_t$ zBS%nDAA2!^l_h12`*=KM5%A&ZVt#%`vO$t)ZkEJf^w1{$8VZkB3@;zS*h|&#)9!N` z#gX1(*PHdX>jigXIHzeTRm#l2kK6ZGZ@wDN^ep#%oY}ZhTox^E5sO>G#cj7zp#k1i z@~Nl#n-Jp;GWH@0kxZrLSn*%jWhTd3H5E8~&V;I4_5G>aw88?Ks% zCR5%%oY&o+M~)PC&Mn)|vJ5WwUlnX&@Aox}h0T$|)=$f}M$6j8vi7x$!huVI*B2?9 zymjQK1!WISsYN5k`(O}#_3o=-Tw(WpT)t<+Qyul}5IsBACO+}(dqA!>(bKk88}W4A zN73#U(cQ9^F6`$cZa*$=vkI0nmToL%JW4m@l}BB*qN{eJu;ro2STtvRWVPhwgNKpg z&;_oi9*2J_lJaR4-K}c{!k(eX*$cwO;qciPgrQ49*X5}Dir~HiUPemw#lu`m@Yqia z{C7LMvwErw->b6s7MZ`-SlR0`|Aos6d%}iF*AndT^D!*X+EA4(WYOpYQl@RDxcSmS z%9Pm3mWRs_ET=%>jC$KDw8Ua4(2q7U&PYwbM%;rjVtlv!qn~wP~*5|7WvPcJH8iZ#< z1a9q6!Oy}OPt#+wBmVX6e@Am<0^KZQvEvOd@>ca&M zKgn)f>fXq8MRS|P+@_V$aBk~T&qijhfI*g7x6&5IB&w^wm3qf==iFWA$5~q*rW$gZ zfPUH2=qY2cFlOd2Wo*6#{?A~5WMP0DB`KYR@xgya%i;e<#?N3RcioFRT^BDV;QtT5 zhOVm-Giz5W!kG=v-E}Bb{n5N;b2|jf^Um%6CzQGKKSu@le^18W!bl|2{YUsbL)E$w zt>FJpO1=d~0`bNI57x%-!V=#`cDWl54TRG#Q7#=Qs7@TdERF=EUiM-|(S5#T`r-_7H^?dS#n8DvZhH0eSXUT*mIm3OZ|l0wMX8?o)9_s#eHm-~ntDW@jltYw!G zB&e_ga!C0n&bCh}q$=X9W+5awv1S*XRi8M!Hut)E3_J%L$PdQXcA;-jc=At|WM>S} zs9`_dqfBf>=agNzS?(E zz4X`oaEMINV*yZVqOvd;^d3;ug9pm?X!$EPy_gE*G=>RW@#{XO_|(+4>z$Y^?MO*# z2a-s4N}O31h%Tdg^QOMFMD*J>flp3;4sBZ><2$1)r*b~N3 zDzux%<|54;Hg|N`6B1^i9>n4_p~q%m`{w%T^{3M2MF;xE2`$xfE6YL-)LMt70q+73 z(MTsGBVm`9p!Y(_IQ)aQTFVFnUFqtC_a{K540(M$ZM-&*S< z1twDvWAGrV79-y&SAFpmt+X`o`FOiLL}*K-EG7~VV?;#|;B=^M!Axi?X=c3vtxQ2_!r0)paQN_!B&~Dks^01bdG=p3xo#3kTRjqK<=QJM|Qkxgs3TUf2gwY&_m#TS&9>bmp#(i(55!CG(OTl%k+>iB8qCr98&)gfkF2W&ND-^Cwybgai^2m0VjtJDK=pLxbSkg z1cw_^t$>)ywCF<`*Jamo~EUA6oL#uNfbBcHT+{Wi>nRO~-9VG^X*!l<#QirHVCZ;>DkTm zBL26Y-+(+b6Vwqp`o!v^Vphe2>KY-d0;&Fg*c%s(U|f1@_ubvml18zlF4`QT5E~DK>$)RZ2cOb+u4r4Y*w%Y55IypOc;p44_0mS$zI&NM>nZB3GYS0| ziz~DqMx3=wiqLKR<)aa!!Bt9}Z`X`!UoO8Ov|o-~85ORMg|BeJWv{SpJeoBjW=#-J z17d#hh*OeXOiVWLBfl^>^uw1vx+ZKpAI-WTW?f)uE`m}{SmgH&-P;Ft8-Cbzu;S!) z!@qHtk-6J`veo=!OXbN1^N$;>WZ!N-RcHS3p2|~IW}(Uo`xp_PlphuqnGp4xu*4Ih z^axDa9p{tyx$v+WRx|o7f*2k$2FYgCmlFUdvuRc35d#8gl?mTz*b7HV%NIAoTd+~m z^_#paf*O>A3?(~z>6q<4SnUI{$`EMFf*Ky;5ypFpv8y1&#B$9pnxq^&u+8qESl)7M zD|L}f$w#F2V>dm-pGUokV=`d6yJ>wt}ClEEy2~d|th&IN4oEffIeqbXs=+cJNTNhTMdSy@YQ%Y-l47ZGzhYW^G zXz`+jQIK@n?#~FQOb77-Ax5O0=|pSPtA4!orwr|sxHR@qN+NAG;E6RvpK?Q_;G|zj zrKS3dpTXn+Hn&)Lv9=fuuLlAuy+lv1cqoNaUxHgqwG%{Jk}3eF#t=Ya5qw768N|lr z5EVdaJt#i8pxmTRZr_}X(z}akaS(Ea>`4&PAf6XWOAJHp^yrK_l$|HU+_AYs8O1lsXw8Z3}5-XI(nd4xhQpi{H)l)Z7SBQHr>8Ja?fg_YU9ye=Om)J5}G%?qjWH{l$sQUOph z)IUBWcZ}3m<(UzeJKFifK#c;RNgeSba~G{UMu*Ly;jH-g{)|M@e}G4 z*LIBP-3lDFuQs0IVDpckQRnW2I+uLOI^#v7 z`sui@94|>JBi&xh$MdV;0s+Sg&hca3DSAqGcE&?0Ey060(ag_cMW6U5cj@dI zNL8B`T}j0**KvjA=%y>~*crS^JA83Y&)A3{7aJlY zb5h|ZKbhF!mr7)Av6vb?KT(O8l13_2CZ@1!QbyuoG#YczH^-Qw_j!dyeK*0%jCTnW}QcIWIP-Q_v~~`n;}IabY0fMN3I#A zUnT3<)T|#kImBJO(CwJZsw`v6P)SK-96toWZxWQ!G(1~^GDn)h#G*nInQ>_GH^}`ZxA{^2;(&a*xH@Bx7zQxBaWJt_HXb1qy4I|TEyx36#6cX-8^>7|N6;?DGqz? z{hFqCX5XF-*K{uRM4VL{jm`9}-zcM}?h(b1o*i{IicZ`?Lm1>?#vXgcrwz?3!S#L7 zhGRI*-m>4>!?>4!_tpEZBBA(D#ML8##A3`yhAMSh?e(@<^3O>`SHjPM#3kqgv&=ZDyrTof4e-4!++^k#Jk_vvgQmo?gbs7 ztP6C2viw_zAG$%riDos4SxwQbb}_4cZG8Re+NGal9en6D8XAuqA5Iz>c&kNc^(W4n zUp`teGT{R=x+O`|h$f3rDr`F|oI5Xocdhke#5sK5ne)ZNR3!Q0QL~{Cd~T-f()+Hm zsH;wNL37G3VK126#)S(L!tQGkmrruJ?}OPqcsrOFbHy#}8We^`g~6-B)$5U|Sz+$Q z@Dwjx_Y0kYh-?0Tbh*E{U*OrC=!M9o5$FgDU%D#1FeY?z5toSL=@*Y04TTjy zH(01j7y{eZy4SV~#hnq?&bTTb5PC>o-aJTY_ylCNc?V5Bq|m3=)JL92O~*{&@a+W! z4Xz$jKYb1vPf(P+0n>&n|INPJegE(nE7^|XzIc=$17!sR<<^z9l`0_zDj-`_Pzn`o z!j4nI=`+HqL18W`+Hj9^>q8dJZ`oAz-dP44>EJeUa{qv z)B2YwDe(DArxQMZSy*}8VExN3^7)~`3ZEZZDgF;__Wp9~53{??{l(TFxhVKY#a4Lz zsGNd-RB1oaX#P<{=ZRYLzpk~yp1_l+3YXl$+VI3PINhSgFk&=S{rTM*Ut;`u8nM-L zvKl$=WWE3;4HG2rsGBSJBhJT8z$TDvbYJfCr^l77o^ctU!)}}w&3fF5oO=FY?E5(o zGE3KLr`WU;Gj7at!S|S{glJ#f>zm_GLa$#W4oTE|5U2JOl%K-R?^Jt}9wk7-W)ZI5 z?rZtSg`1xdt_wju)e_oy9jEWJ?A)f)qkO$Sy!lf2tLGc7rkoA_#44TiQ|K8u|4|P< zV>IBbk)>q7?l-M*y_-TOhxqqRp07`UiJsv?C+G7lI4I>Tn3Kz?PYWLDBm7?$^}}-7*;tK{%8 zT;sCi0dP%V{yzUToFwGfxFyX13a8|Rs_S4`z)Le^yp-xJv(yoC%FtBY;NgtG5Iw&v zgSeX_kqjbmDX{Iua5cUQ-t_*;^eiyQzfZ~czz2^OFbpnBshEP=@k|HM0ZL@yMnQdL zH)hC@5I@jl!H`dbIfjPG7#L+3&sC|@mQM)%`mazq@ZV?V-wFt&osrC)_bkx^mp?vm zIgwGXOeD>m9$a}nwA9-xHp(j?!wB31$VS=jNZIb&X}41DnBs9NLRRS7%957dwE=x+ zd++XDafM5oZ}t4NpakktNr~$6&?kjkkxNm1w6H}iY+1`+&slRu3itlf}?PIqN-#NJ9Dvr8pL|0A3RR{Z<{kQx7;efiCvOAbQRVCO7SOIou~_8Kb2xuN`KU~>tok0+Iq9QzIas3QW;TcmTdn$ ziEGvAzpGTqJFSH-Ao4;RCcEn=-&|-yMe`Ed{MpyjCtV!D8 zxj$19*;!r2(16%4eq#n{SY3)iWLNJo_~|%lXI&*=3c-;i@vzbLYa2ASI}`8G-%OQ_ z46Irvy^T}}$32RP#nEBCjEh6^cDn4DTAbGhEI=&)6%`T*EmoN`d1CZY$&w1JusW16 zVzWx1)Ivy7Pml30ZmY8{;2$Y-WXvmN+J5Fpnl~W?1yCizf?HOlWf^RYjFKG=lHi60u0RSOWw3iv>@k%=tI7StRp=?39y8ZRLbTQqGk zh^~Yl=GoShuWSypeu|~+2LpTy#`$L)z!t2Lqxi?LVayZFOQC0h4@egL0L=uXk3u;f zb`Q4TD+OWSNSAjDqLlG%$XDJ*E|HTeA=$xRAvb~VqhQ)3WQqjUf^8F0neuE8uHqDG zM_l>fijj8^xdndW?O>DxZ3mI1v}ho*?LyuxXa@@xXvg)0s;6Rm_3x3l2{3kNG(>ET zSSL$7q~{eDQp;H<+Ui#Fp!5BqrOdu9Za4X~s&>T^t?L!*dc#$Rg)GnCRBn@(@rNdR z-k!fIsaPI|>QAwzBT};yTKS{yX3^aoaku`oqykP->Hm#^pO%zv;OGs#E8jTw%ZJ&9 zs_hSp4Q<=$hME+@WEIff)fUOzM%)ksA9oHsG+DCyj1Ry}aqRZ7JATr$c|@!}@`t6Q|Bmb&$W{sk>S5-p*Bz#xMqfe>ID*%*S2jcE%S zfiOt;NjRV&+cV=yM2abkWHOewvJ)kfS&JD@qOIDRVQRNF{>v6KwX@p~wWgKE-r&Sr zGpVhuaU>_>I5V65zI)$ax1NNY$<#cXtJm+{ci+AD-Fxo2=X~cJwP3HHAMSEZ?CSzkGJnD-`(bT zr!ZspeV%vL=In0qyi@PN^>flO-@%^+PiHYoF`FierPQ7j)lKRlI+_eNuk*WI)YJ_dMNew*OwPLC$9h|tuw9k z!GgQ^ALx>yt^{3L3vYGCS^(>2_`|R=*~#UCO1VazFE}r|FsTF>^6Vdm(&;MJi;hn6IZUkU;bTu@`}Sv=_YLP=g==JtJ#1>9sN2$u?T-O-D3Q zrtv0|Kw#>7dd+?#>LyTNxRh&1rAtt?t~E_SPm3&g};yfm&Af zA!#TkRzBpAld^)8W4Xa;K}U0^Zwx-Oh-II485RLHlf~}IU*jFg76Gs_0U8)XT)esd zic6q@v&{PHXLu83u_=fBRiJ^P-?!rM1sZt8r2-A?OvdI98xjdS%`IIOSXdH7c&3=TXg5Znq0yFa!?;@qwgP5)YPbQeUW8KM0-7nInI@u=GG|$;fzO1?A~CxP zcxyG1A<{xDd~(@)6F;mjfw`n25)iDL1rPB6C)H1p2m7O}yz$M^lG<2S-CTL_-vEFI zyj7rLa_w~Y?aH>BFGky+6w|p*4b)8?j@Ngp^__2Sj_-b4-TioU(-U*`Z8sl@Zh9DS zs@xvpt+=PL=8bOJg*;P_FvHG|5sjfJ?i0wy%;=_`S>GdzVKJo2VjX!8y(s*>;6mzQ zXF`FYYYb>&onYQ#aKUzyH)8SpLSqec4`Am87~aW@{Q`JeLv&^bebD*wQ4hFjkDV|M zS8aHGV6O60TWUgj^gRf2Eh99;T^sIQuMt+dH2Cq*`UOTE?Q>*2^+s==N<-X@^rCF|iX5Ob?vKRl2>!3pnV1Ow! zd7suC(vkUcLm?GoK{(=|*4PBoqG;6J) zo0u$$)*g!a4ns=xVRr5-N3R|ozdX5NCc9?LWi?*^$d!{(I=8y;)g#xBOg6{Yx2fyf zZnk`{{V&^R?tge@{eiivn%BeM49`?;wJ5CC*UUBTK&Yp}@&$*x@PV=Jk1`!lpzOT9 zbFyG2zk00e2YH2nBfsjq?wdFq3#^-io5<1YqmzecifYH*^BzZj5yQ^p%dj(2l=aHP zS0BFCGv~{BW#83(*WjWn`;~{TKJ@NvYej^Ec#oOyVAQtj(0dgc>rQNAWJW?Vz7- z-FHW-A9>{m$TL!D@|PlaZ-1D@LM5(0cZP$2TYljyUIr9e(qBCC%Em&^wPa&qt;dB# z9B27N%8{}F+(S|?oQh?n6oH>~v8{6)_k1H99_e{C-2mrp%3-IMv3#VokQWhf;ocIl zV)t_!L4PtD3ISqp*ry1CAz_F!5)9T%eYZKArq1g6)X7TWeMC+F5U<jKiP_8*u4f zzVk33oi|*cmUUq@I?Zh=K6U4Qe#$`wft3+SSYfOPPUqA)p2!7$LlTMHB+daw0>9_Je09pQ<@O85G|Il zD90E-IK`+bG;8vSSuafVa3jfsgweLoN}|oS0dDV9!e-l)r{uX1#vw)~W`B4XW=Yoe zi992DW@Ge$dyUm6w}|S)8SM*KUx@qR2c&v(WX9hT^|mZ-0UnTF=j%AJ?yK!YIy%i7 zbx}xeyJvOkOf4C9Z2fXCxl z`|=Ay`9%Mrv%YnA={;QR3o~YYwTs7{F>`jHgr&N~t~=oMB&oTG^n(fXI!Zya6b=bG zT+o`B@SYe({OFYFlPD2FYNM55W&$Zd5a^Nh=A>FO6Qh6#H(6-8*QW=T5^>2cAr9HB zw`p;E$xyS+3!Cr(zl0WFwe>l2Pktk1i;Gh1q*yjwjXsPE&Ti8(4B|&W)`#{CK4kwqZ~ii^D}Iv{IB& zS3EDd=ww)k4veW~%Q>dh37#=Bt~$a-KcSAxY{Ey=Bbj#FZZn8P1RLRq@Z%8iiTZ;Y z@i5x4>NAv(ZCir(Gn9~HTSCTXD8X-ALMHmDT(-=b+HLV8K=i+nXY$T?GH889p4&c| ze`OW0_XYnxExCl#7)fDcqzrSh7RT9Y{mlHU&jvhUC{0m=jb;x0%r-d72IDSK(ZRd#z2K7Q;Xr!s z{2X#BHO!vfCGqftQv;*35!VhYUquy^?=g9c$(u~xX7Uaac*2r8;Ye^l9a9b~^iqAp zB~}=v9p{!Dk3#4h+^A5&Deym1h?6dm^-3*k!Qr8JaF)oG*q$(4WdT6m*LO-$4zRQw zy+wl;*n*RIz&NnZI4D0{_!A^wb7IkOa?6u?DBZY@ccdP63>vq{roHDVOI+asa>XE4 z_@MUna9-O(S37W=D0-qBMx(1wT{?LR3iQE&F#iW;sqft2=b_aS&cuYkX&T)C<5C4a z0EQHzp0IdR2qlD8l0SJ#%Af#yA|EpnvM$m|{7u7-bAu;)&ka4$AhXVLseS+*^9k1K z!qQgx(Mj+)>?L{Q4SP-b-7DbP%q_IOvs!nTbP)R*2Hf195bJ1B3PR~ zW+wbXp&LpIFD$rTiU{G6vUmT$aPw9n%!6ymGsKl)>z+tIEKU>IvVviGhknA*gAyzt zd_la8cK~o8_8)mduqS-)E9b+)ELYSY{v5={L}#EQ3OR0N7ZdKXmA_;12dwDd^Xw-~ z_$j5blBDk$vgZ0BS@bi=U}e!$c-L?8TMi=+zokE4ixjQ;ZPEJ=%#`*Z;!Rd50?_=xUrB72|GGaK z?1%+Av7OJ(|2WN&TV{GMcsv$(g8myAt+Q4wtet9~DZGCy>%GE~iMnX@c9bc8f9TB~ z&z^X8;%NzcxSLfN&050{rw_?j*@-?satAZ2=PD{;iqL~s7nd6@I>+|SAxP<&*Uo(V z`KieCzMDtY&3mK!o>Dg-o2hwvX3g=jN9GV>8Zd`%ADQZ!-gtAn+Oj7K4+Jew%v2qn zDSr}P9c=C&QCl9Lsd{3j{3!0*l>el<`Kg(jV>4@>9@9-Dh~|s?Hmbgj)BaoAqrQ#F zFmibVCj0G=Mjt&GZFnsDbf3s{`Ys~PcU^nv!`0=lhOdWbRzvQ3ts5WX8`ZB>f1~cT zx;GyGZumy{&F5}?A$p=OI`RSpfrniuT@!T+4o6wU#b-aTe4VCPp!s8WT6R4G7_6&{ zS2nAa%{L2Ul^rzaKoC@HKV(&PV}lR<#e~dN8~qNq8PTm4`~J<3$9(v(`o6^-_f@IB zDgyg6s-;`pck=eM?ay}nRd&XM`DuSu*!o~j+F$2*aGqq%Z|J*jVXPurAe6;n40w5% z%PADshUubGjlCbKeafMf+FxIOTb=X{L&v3bpe$}fQV!vy&gQzEmP==wpx3c2%Z{lr zpGm5hq0|*^w=p*sZMV5@r)M+Y!I(qOf{jz?MczjDcEts48R!xZ(TZg>Z=-3Ebi1Cm znENs!<0`Vk5w9&njP1&bOUSS-fle2Rl1Mr1^mma=Zh#_LV2pi;;D^!2L$uP4DKC@v zt!X4jn6)k{0c*Oyr(3y%BBhc@tT%syM{T*O`$_l(S5(Hc0Y27&vyfjd`!PN!3KQ#_ z-~vpQl_;BX9k>~ykWQ{wSi%&sB-*Tox}%9KY2X>=V+y4kDT`66_XxrESzSgXZ}~sq zg42kKV7)0>!wA*yQI|ilHkK8dio_c_ZZ~vT2o2qi#(Y&m-#<|t%UU-%{Q4KZ^#$ah zgh=9EaNqb{q53Kiqgm$9k7ZR%Zg{==Th+YZeYIOgd;uxL!ZG2worRdn8fBUa!RaaB zG>b&d|MEE8W|(X$YNj5(xi-3O|E=6;?L*NcVG-&68H>b2%TsaF|K@Yi+WpbPPb15$ z_xNJz2U$!Z{rC=glO!=I2Cp_yk;gcQTG0nEC5g7ItRW%55VsBOvILRJGG1exm|+!d z)&Hn94-4V2h3%SNRYi?#$WO#$r|L&NZ9J#yZ`1#ZGD#y+4wLv<GOI}{ ze;MYgLiH?-Up1Ri`oojF?M1vpJZoCOW{K!w+HOIR55Wox#H(PQe-{mcBol7f5fZWg z1OkZB`dN>FBdCHfW2M?VMMgY|OG)G)iTwP63@FT>NN&(IUU!eF=XG17s zmZhXYFqsaQt{J20!^ZT)3ZCM~=1RKKYPp|f5(AWLGkwoin(xrhfC;kUAR=Bw5ypV$ z@n!Eok>xGf=3DHa{jwMK4ONyWa;|#m3d9Wov9Yvj+_K zs8Sr292*P9Z+S*+x(#}{5L8u;uCml7-!i%lOj9x*7zkj;=&Bc134s&-S_Do7Jpz|A zlB+q7G)YOqeRgPY0LZ{vyjnVuOh*qYzry+;H0H`yoE`2S@%LVY3R&060otD>&Z$A~ z?S~v8L-QnXv43Q>q^&}`PDc;;i9ArYD*dOSpcRjxFkyBe4B^^>pE`p|58iuH?*RVg zoZ^DB0Or^6HJ6YTY0DNa7{^tIsXl?~(bc1Tid@j3{1gAUg!^_=@bZ!ryeLsTKeEY` zx|m%esjDe=*>SG-{E0~K1GP|d46#1gtP{oGu5N6<6^d?bk8M0GSB<{I8i^Ltp`Z@B zZVMg;`a$BR3?!%dJ_f=;96w~CRtI)~S|A??Doz4d4KxAo3F!m_^z=52>`ZG?B}9)Zdo zcn84D}0@tcUrsxXk$TK_Xt%A8tWG4+Z zAzzU`_^Ho%Mia1fNCC?i@vbD5Udkf5iXV;QrC$K=;Ht?u=0xlh&=Su76Hq-(HRk_azv{hx^c=kW0;i->u zlBF3GtmHB#N!+(i^{t!Sf{?t`H{jgAnf$Ni`c!?qc86NKBj($QX9C61;`-bEhUsn5 z9Z%eDJsLfJB7S_}_VEGK>3a6vVAXgwVgZalGI?OKU4qU9`V}zs@$+ySdAB_Hjh@$f z;^nO>Z1WGqH+QR>yQ7aCfu;UT`Qz6!J|vvIJ{D-0D-TI?lJSfW{KZ7M7q?FDpT7TQ zZ?uqdp}U#^U~4Q0#MtLV{DF~K-xvOIuM>^^Df{V{AH&pA8h4-{357oxdyJk8W*&PY zdhlp8@5#9DDb@Fsu<|$tcY=-hU@x!U6LP%Px(8tueO-Q>f4|(br+U@*E4@4qWpwAK zeZQrsJ16bG<#=$O1d+$bl}t9N(@ItOgddD-e0Z=IHVHZm=c2G=;ygN}UDD7Z4ImI) z%j8J^pEw)BU~y;~b`F25C6I_1s2AGIp+)5k4Mx|%mQwX^n(;S8mqk@HApgA@lBE15 z+^zW#xHdqf=zfHz8TW1#ac`nojDo!wOtM<+LiKWp4SMjw%A(~ z_g1Ois>w66-p0k-BhqgETcEmNCKS4pY35QQ zB8&~`-!b9W)*<~FbcB%m24L4h&qxNu#tIWqzD6=qVm3deknLd$KzO1GGG4kCn(fdMBls=`uGU)RQ`9x7fxKyTK|`#F{suvb zg)_^YY$umEt({v`|CZ@9Gye9dw_P@qlS4m@Z_JTq{l-?k%4H7VDg&=cAI8B80QX_L z6g)2xTN+jq5It@gQ*m3$9b8NTF%Zcqd?9P)Ada#?e(hrIGm#s$_m)m6>gGb8K$akUrHcV5I`-@A*hx(HBraJ}5xNOqAswWPhzk#n4}sRY_i@ z$J|0L0BBLI>a8_8$x2R)?fp7jT^dhhhoHj7%$?F7_-StWaNkBHETig;I$eyNXS3nw z)?VLE!jRv6+G+ZrMTs`{Wp=0^{lnvIasgy-c9 z#KqDE0DQw#xZ$%C2S{oGh)TxBC_*@js*i_gr#pvEd+e`}k@u$#P&>w`0xbz|t0AF}RFYE#8xz;E3bG zj6K=(@L!Dn$5H73{?_W)ebR1AxrMtuu#^+yn{`mc_zq)`DZj@-evD_syzw;8;yBYq zYoeRJh^z3nhlwO)YutcH-Ti9YN?N%n+YCoo=a=vn)EWFg#9!H0VKiQ%dP^oY#7mph z(x#ZVnLC35!d)l&RDac&d(N9b=4NQZ@y_v!F>l4);x*%!zP({`I9{_&t=Sf@*{Rm- zoT+J_S=XT!b&UD$K%Un%=YxV$3$(s@u6avr!y`Y3ckqMGpQbrhYglZ9uAoMoMEvv% zD`HcL($t<7d|TrovZ-Pq>MOj-cOORoJu26I3+r8kmnCuq5f-0XdroI#_*IhV&$sbD zD{6bulM!|<6=39GD&ziE)!#bZbrX#F-l%u);swtjI^}4$5aT;dUl2+9%wo`8YhU3V zJnRUM0>U9&XDvggK?3acjajl>YpRnFstuGfJogz%58Px?>uUFu0WLG&r@xKDc_=O1 z+EPw(kaCz{N+FV8M(-%@^JAwRmUr3e1c$1VzJ_7MA~dO`DTU$Z@|Jr`lqKLNvMltH zO{r$UIOUjqj+M$S_4X>;K0`TNQB#fx94QZP&@bA-0g=P|Muu)hiT-yA2Vo)o8S^hB zw6>v>^tla=BI|Ni$Tw1ZSYWBe?&SIYq5c#7jI>P`0$hMjFqkZ2IG=|RMnkvqJ9xoi zWe-y23X(*QHnlZZqhj$GdqRcM%9$l53Se%?J)v;Q z8Wy!UhrJ*(UuGg0n2V&?S*MkLc>0%KrFvMd;1$PMN-4Gs@I;D#a3nA=)DLF|1H;ns zsPY1f5mhcyPW6FeoeAqzhXD}LL&|?ZwGuuNDmr}X5}qDPq=YExId>FDjIqi}sGy;mh$`2borczrNl7*Y#EGlg|ySs!E- z3J5%vym4Ph^@V1AbwcPB_sMG%dm&;auB~qXXIuf39}8zJ9i>noOIsl7ex$dQ8r549 z^M=HN7x!1)_E)`8Gra*?+E^`&5TPL^{yy&8ruw$Ud~LALrfXE$kpHymraQjvVRhTX z(VpY6rm(x>X6kk+G+qjz1Mv zp9)9&PDcj@qk&zqzy%1{eC24X^s+k96)*2p%R6U%yMUhal`mdI-1rn&J{$}G4?X^y zT||;dmI*NV&zQ0{9PM&3It2-~dxksalq1PG6WSyXEQclmCcMXPL9xTV+oJP*7XBP% zEx!=imN3Lc&8|f@OO;M|1tBcQb2f_={MOrRt+i!e^x(4EYQdG)ElVafS^|L%LT?*% zlJrJ-pNS-S*(S+TUdQV-8mi54tqe)3#8ZN=C23Rsgt_B-W#po8w>2i^Ymk^K~nIGS_dSIcaM24F3(r2m?=%n{f#w$o=V zLHKFP(R&1%+G1#G4f2J+nK0$B`e_oLnW&egXQpJmY+$5L+rpo?IE)RD)Bv7<9RMOA z4j6vf;EW0K@CE@)>q*7=zk`~L_yokiQ#i%f(E9}WOPtzHo(b66{XFYHqB~|28&pcs z<@<-A9n6s2)RHjmvv{BB8eVtAApE$c;G}fxb`PBQSV*4{VG-^xM1c>&kY#-PW0hKksH|bTy>CTbR=oN_#it z!FiHIh(ts1ILC3aln7I~x4|d@}U?&O3y&5W0+n~TxAYT199Bu279TH7M zY;XT^yI9x=!=Cj8wI!)i^;ORL)-PU8*k7X0zJrs0L7%zNXXG(c4y7D~yHtR&`E|sB zoHjxSVIYG!!vj6c@@z<^PZEZCqCV z8THXPlSJn8{k`EcgTv3Bx}3zIP#0_Sp|nVrl03){^|$;`T`1S~L(M@kfBehGznOWr zf-w=`bv%$Ix=uehgPMEDakbRZl7DTh^Xa+x}iIw?BC z7?;9Mf%~AB4BgL;#p8sMj$Y}xp{b0xslA~&_Bw)dv0ohGJ9Rmw!g*}f{bB2wWa}b@ z_djM2Zp3qol^xv7twhaXjQ4+~UfR64mo8{AgeBz2w!2obyOh6R-`qr!+&2i4=ondN zk^=ONR-|r9FMH=F?46KZ?^HF7d84^7m0oAr>lz9UywEuQwYz8Q;_exOQP)7ESAmp9 zM8UD`An$S=gfJILQxF|w6q?*c|FC2i)wHmS)&qZS*F|`Naj?7CO$#*HT#91avAY)9 zMfF#?p>U>zSW`F~dS;LvvEk~&s~0T}ytv2}5KGa-Kw;@w=x1!Lgaq8B#eBKyEsuLQ zt6r#`w=NbD7~j6_Gd9fXOInhO$1cj%P!l6Tr+4b)vyi+IMMl3x+EO`$u*ipr1Nj}i zQTZa1RCo(7T17~rq_9@*FW5jT*y7{}f zZv`i4TWEn`)8%}kTmPBe$x*$CyoT!Ip$;|F5f62#p{|)wHzy0AHP!c;EN+x0Cd&qV zhGhJOiF;OF#$s=!LU@RWEkkkMDsHlS$~0k6jx14bx-8$CD(x%JyF6pEL^)a3x5;x0 zK}fr-{TFhN?Adqf9PE{Y=T8Bb3e@Ewm`YtRYm5)8U^dv>2h?K_><(e9axoYZb1IQ< z%?Ii60Ced+Fx-iu26EO3(arbJ`^uMaEm3Th0$U$mG&3o?fxO*_-EDnPA6C`^($MQe z9I#M(na(+r<-EcRZoH^YEvk#w?~3_%-*U(I9aHxmi|@N|d*20%jC7kC*d}G9u|SvQ z`c5^lb2iWpzjOPY&%tfuhQ9DPo>yWdT%y6G<2YHc&*ycRGWXTm$rGQ&j*Yjn{F%7vT|YB&2h zH1OjJ(>rZ)K`&qAc3j)zPIlmL=;1_J#rS7Oh^kS1x-)86*4l3=Bc>5bQm7 zPQwZVuX`S94Z^IXt^)`{UDp9vKm>p?Ikq*;jU-(SKOqmOPy{|1a((GK4Nfn7oK$_?&cMBfT0W0<4i1K220a`5v=;j3hW}(O;kimD}(Ve8pF?&)la+BGB}DV)?|NBN>s$WYw-(q@KA8jYIhH(#>MEG z##w*Uhb3z!E`H<1*It}i+ccf4u5JC>lFj3ta|MXC9#RWJQK>oN)n14`RZBk+QoAPOM{#%+#S8D$6dn3)I(vkBb%{s8un-3 zGK^kC>|&NFjwB`a{TPFG1iI1wI>vvH^9paZ*)JlZvdhlzPO|vx+B!yFf-5NdGAxmy zt~lvE%d}gAXl)bXgBluz2)y1Tm%XxbA%II~^jVfK&n%`9t46wrxI70f9yOVUC(|JO zo+C)$CQPQ2=O9;uj7-Mg)NTa(`{4RCs5>SMWhOkBdV`k}Y4DVuNI!uey%9tz98`MG zCETY@o*7h#Yf88W2QFVqxCaKG?@hRepes$R8amT|{yd=jl&mNYt`_T&bEIOA2$e~+ z-=eo82q+|P6vZ(zIkcA%IsZfvBFxTDP=rNHr}+~ju0wJ06+m*QPPQX_>l$;>Ax6~b zkFe~Ib)05Y(1MN0%^ypj%ksyw%5GPt;yQK?m0OA#mv5Lm=Jq%TI;QE2d{ZpsDd-lfJsbkS~ZLiXK81<$al#4O2w6-};J`aa;?%=caPgwjXWXp$f?1QwwQ;Y1MCQ>vMG zkc?zh>Yg%t;L-94UKeV4asrCLUG?(J0A%U9Z+EY9dPvFT=*&ZsvJ^bYqAd_@Y(zzU zG&g5$9GEB3M;Mq0HM!=sHSv-Lx27En0?xa}M2m?_)9M;y%cRr_s3z0TWu` zm(%$qj4)e$DL9ZcB^&o_R4k+JfsMFhs5QiJ6AA7hF0**f2BnC*j69fU=GV^x~RDOG?RhYRVGHY6r<-ES3Um+zfZax~^4IpVXmhJqQd-#wC$< zzW0)H5N8(Lh=6{4j@J$|ImF~KCP$b&js&vItN4@1*0IG}cv|s?b`s`L!@4=1zm9BzpDC$`7jIOHH_jB-j%B}B zR64P9YQuLMZ#2#nwT=0}USP!gU-QR{>(t`9nd17fY)Gr)S(Uf5DnIa-V?M-7wy7oC zuBRhwDJDjnTGDnsUDy$co2_a|t8sISTC!!FIVCc2qI@D}vUe(d@=~;rz(lbtEmggx zvtAo01PLhrEnGlyuZbYY8D@IwVMjnQm~5tj6+|F#&)wRlU;p$LoRUD{gCoAUDR_#! zG8a`%?Is2Yotew;5D|cAYR9EcUTD|F;7FCA{18>QiVwBzzxH;C%jYX2{F;r(EWRe0 z!7|lb1{kNXe~x>D0FlSN!uvo$Jk+j++M`wNvzl#*bbsmW4!OF!Lk}jr;V?a&hr@}? zaQOTn;xF;s7Y;v%kc0A$@*rL%2CQsMJ^fiOH{+9ANTWO!i@@Du2Y} zL;n2VOg>@q-+ApelLV79yf(<>IVKe43u{Yd1N%&bp4h>&AM-9_w~Ws`fM*{t zd4@mfd{$Zv3Xf4jUvrMv=sHPwvruTmuF%j=ie!W!h6X#zUB34Yi@L}}K-P&+SH8u& z#EL2}^M?46BFNN__>)=%Arx0A{Z%O8RD>w-i@bZ6iGiI^NYE9oJqqWn!VjLv4nyex zCua=(9u8wmG>)q*)zKlX5^I>13HMS%W4QCl%Z`uT2VI_Z^L_4I&-(f5G|$%g%uLTY z=X~*2&oj>X3r?4(b>8do+&7=&LAD&1r+(h+^0du+pLBaF7cP07cp}~9shRi6#~S$X zGfuZBIPXitv%YN4BhL9Xt2_ns1&yAf`Lj+h(gG%hC~+aM%5(oh-YKW&sB`|&G!H6~ z^O)09Ie*60gf!yZ=xLch;>`5a%@_MUk2>eq6?#hNTf_?sQK2Sr=JGTypjN19x~Fs@ z;6`qr)6=|={(z@?p~F?^2|E{>e4gFTh4PJ_W6t@*XjUWJ(Zro_)Aqiz4QqaIW>#&hK&-pk@uLJR27BvOH_&OT`mr;zF09 z)aH4wxVDPr=M|t=HWhjb=bJL|>f&-w#m{%F!u!S2Ej~@?fyAoeXR$K|=iS8b^>Zfw zi(mSAj-3C)vsRw{Aamm?QXC|su#t1k}spBrlE zz0edU?^uU(OmAoP$KKr~&Q9mJ>s8Nn&(9p7m)L_rcElA_+U9u!H*deD+cTMuglLu`-)1rnSFWQs5- zduKg6l*hZ4GMSZF^)PcLPnJNoppQE9v0&eV)F3?z!ijd+yc0&(6-GAe7Jk=fN|_De7(SGVI4Zk`+HKIGK8_}QD(^9(OtO3&Xe&dMgtVvEYpJhlL%UO$#I!JMbw<*r} zp-yV`Y}N$rG(EzH9;Z&!he8*{tPyW8=o$202wZm3qT#qFG}JGZmY`gf`X&s|Hz+Sb z=B$pR-=@y$IUPU)rw3@nuFje`BS14}0?2S?fEJDcn8jHDTDdHMEN2Cn&9MM;xNLwn zubsha6Lx2=nAaB=^&aQFL2oE{%rgo&^Zg2TSQCd%5C6XDhSVEW zgpN>dOeZ0PIV21#L#!mgZ-oAkmL8!_vSfrBHmM59(P2ww8kek3Q!CW6YShvxy{=d* zTcehq(<>iz#d@~PdZ~9@u~u$oE#;f6SSLTT4riD*E_<`W%rdEVIT$f_a&%zyN>?il z`Q>ZmXJ%8wm6?g03EHa4OizvN1m!gMg!6mH0vElb4x~PZOn#zyM|1P#ZCjhWpPB0h zn(@yZEoNQt^j{q01D8g*M;tWlw2P)O5APifi8`2ROkZHk?|t3t7fqbc;|~mq#*i=M z_lnG*H!$K2@e`s2sM{CzT!2JNi1&;JeOQ?p^{o>5Jr6MOjCm8lU>s4!rDsOscUXC#vm!}QHn1*Bu){8M!k4=;%TWTEZ&6Y-)${4eS zB*&RDfhmhI74Wof!;~S$)XM3IM~o@|ieZywk_}_t&AOYRcy+5#-THvp@(sKi)i1Lo zj8kU#N0{3>NWDRYl6k{w7D$RxNk%$JN9bXroT&QYXihh;W+K|944jcOK}qw6GRp)e zpk0#TES!$Z;;i%RhjM=_mdz$*bLMT!TE+KE3tTp5=W++12h+UFHYf6(1>r3Rl=ndHGR?XKc*tff?8DeWqS#Tz%cVXT;0ng3Tk7dRD9= zOIP1f&jp++SOmX=Xc+K&LQcJCy%6A`-Ekim8WK&s*YEQV@GO)FSFTXsMVbP3vV{a_ z!?>RZHt`6%77Z5yeoiz=bKYqXv)~=P600H2LdP(BMH9ThP=J4yzpRsvOQBF;bWX=R zp(%a?0H>aB!Z>2YyD&iqb^AjwyTj%>Z!`XZBr{IXpqGO*t{MNNjSWG$$7$e^GDTxA zav8oDy+^^Ls@d(vt6}COExW*PT6A20i0oSQp@6Z?-xbSc`2R@X(p?eXdd^C4g}nnmB@r> zl~SaM$x07HUfmPLmqQmY<{+L{?gi-EyY8<>Ibu*_yu_N(JWtyhVMLUwmWt_1*FObwd8S zrTq0%Od>O-xctT&*WZX2yM$ubQgQPXn<%NcWu3OhOPYm}=B1L>sce`@CFPh=K9!v) ztemM>V1=6Yd%1$6Ln!Q+%EGkDg-W4j&%GAG(J2&mPGynxOAwmatcqrU~tex|U|X4*Hx!UhCmF-{>H}9iICj!7$+SgQ)1e zJmwkYfF$t+MWeJFVbh{v48%>Z}ouZ&XT>ML&rmQRddBNVP>t}9;ZoM)6#zJRw zUtg^7Wgs9X4_Wg2CvTmaJ~i8i+_qH~kg5cx>Sj2`Y>=O;1*Uo?3nVi6*F2TZL* zL-MzRt|$um38A4p`0i`c5S>OZx`<9oL<%J}zu_e1klqMTLdC!aJHv40*^#EOVPM~SVMDDczY-Hop#{ihKON! z72S=?zPKJfIQ?!hl*45|EpRC0$$~13gF#EPLlKY5o6r9+IbQGXF;Jo83?4>NAuUAo zT!HEfRHS9YBUi{3am4^j=1V`6zaMCs$vLYUaYttDh+frttwz44-Z)&JS#rKid9O($ za4!vQbGR|HR>U|AgMYe3WFJ%oNX%n zwcBfe_PW<>FF7ZnbZ2JiHQrid#&GNA8&hu$tseUS(yA7xz|}P^aO(ksqiKoon8Fa` z3}?@y`;bNi4N&TgL^>s62CVu>9I{FXW*;Butj8b)Wee_dcQ^-CG)FHnDS_lF(pz~P z(K)?nK)Vi)C`kefk64H%Ng?JpVIi8|3_pJh{~&y|S5lDaQLGFK@nr%hNSQ}C&}c~` zfnN_#pmH`hZ{NXf=Ud>(X%7*#O8?ZjN2)a+S^hjZK8kNScku*XZ|zGsiK zkqCeMOIZ0h0!ipQ+ST1B(r3gR6a>MT78vskf+0`LB6_(bDV~7hVveNe^bh&`92f}| zC8*!;2?iy7-8km=^m|3K+_PxvIQi14-Y&30qMgnU_=uKXGD;UbyvV%Lb+Yfp1N)DP z#);Q`-f=KY5Ic*gM2Za)}3(HA{;DOUVC=zL6pWGsE3zcoHR zJ{yXny|N92@1ojxVY5)!{F}nosjh^rAZ~LAHph~!c4lbF=1SNLZ`iKeW-ec|#q7=a zWW8>k$)9am=)GorVBh)JOciZ;%2H(&x5}o=W{xiAe#ZZL;?s#lWAnn9#MV906K507 zZBNbmvK?Tz&3VdDWtF!orz>Y7KkxYKBR@M5J@Inh~|zA6TmH6bd@0EMFE> zPIV?&`+GfCd*W=3z}9?FduQG4b+h#`c5}j(e=Q`b+HFE{+mfvg3_#9KOrmd*!ESEgEK0D2{A*#{7T?Ko{imMr!|kz`Orw@FaV__h`5X^6TY)X=5S ziXsT5ZRM?E%A%6)z`5&4G9U*eI;2e!M`+0FkeN!VfQzhcJx(M4 z7W6N&P#{@Z)DObe4&ue*CKRk7l2H^kg1}%auUxQQ1H8!B57t&35U>VGYWH8lL%2qR zJ1l2fQ&233!Vp-3%ByefncfpG-zJoATPoiXWlDZ)El)U`?pDoJ#htqa=k93x(fcQa z_Lr8N$EP}D>^h+1I9n~S)eqR3$3}{+$o!T`6`O}~e;yTkUZ;p4@D)(TAOXH5Qbk%A zPAYq;jMdFGs$8^Srv*+wZ%8Q>DnT+Qtsp#VV?_2n%=3&Qm?9;vfu%Mc7G)HO86Y>a ze}&d%g&P(7Rn&4WE2(hnwG?xr;-?gDy{1y0&E;^md3$Pvh{Byx7tr{a7GP#AQ_|s^ zCJkgTf*LCN8l$D9vKMfL^F=AFRNpO0KPj|uuBT{>7%En$BF*o^70efF_NXC#M+_>e zbEGg)V)G@+w+2<;xW@a}Dz#F-s@CgMsY(pY81g89s+Htq!|Rm%)bBDpQIbvzfSZPz z&XsZHTm@IjRn1qc3?@ZNW%$Y{)2D?s-cm#1SG}d?7g5h#z!VjTw6FpuC}gJvP;irT zK}AiiX~p1i1ujqn>1~;%xmu#M$}14e1vHM50Od7I1X`oS6{@4Q3gPJVf*#`=!z~6Ljj%*j|2XfH;*W~&6%b*)8>HFNid#9;IWwVn<94BOdvwq7 z=-KZ?y;ou-Z^8}~Qz%KJAL#CwZ<`kkQFN_9Ikc!QUf3cOw*01W%O9zdv^~wDY8&p9 z-Y%Ve;od9J-oaSS5Tad0(8j%pI8!Gub+RhuS@cGkx){?5C>NEIosG$8+o4$Di)pIY zY~Lb{YS%6(SX_2vyY zLxsxfTL-5PLWPr`ocicgqNV+l>W``u4X%ZqiN>~svw6|;)MBXIPa~qGkF&rHMN-+~ z3?lqN$DM<>4}M(xN#jS2_v)ieRg5`^GCSyX=#(HzK%>UNQ#-2HXkx;wjW z@0#V}u04Wl&%N`BwjJ@dV?x`p=*#ZtVC1QuuD?RMa}dWB+=GcT4Fc0JyY1(-e_j7G z=%(QTvo~{NFDWth!31AZV$_rim#y&V$+G$i|3|DgL{gL`Qdn1QK+q%%+m%@AH$qEN zA#TNRS-|P@Qh7>j-m0vf&ml4X!T5r24YF$pps!HQY}J||S@6_0E5hxFJ*k+m%U;EX zN0gba%f8T~0%++`9RReoZQZfGc`HWRwt2Sf0DkVo+-v~+MgXv(j(in7$O8N*c%AVc z&UY!u4`LcKFbI6gAK*pnP~dgQBo7kvMuyGLVFOtyrYr5VAIB^la~*i?W#~n{YhPz}#Ly8W1Du6RY056s@F;WNKNiK=nbB;dLvsGj%hcK-u7% z0Dzyt)J1i?;7}eEkabG^QI&f^-!-+0Q6Ffu1K!G9eimwkD&= z2$_1g_Co;WNV^`AUs~Xdp&TViYnrB}2(+mbRQ+-$RH694SfNJ^`~- zK$um(A^^!t(s`7Ky(@^9z>j66h#+70%D}6=Hv4L^aQvWm*Jnip63^vKW zSNJMgql-%ZA2Yh?^`3Wh)9XFw=xV<;cr&rf$K076-uyE0!<9@-k}s|UyoWuGabIYN zq)J95FGuWCve8L2jRyD;kKal2cY#2j>04aQJP)z(=AM9L$b!8R-+<4{LqmSQM{Qt-ST=)tsUM9FQkKBOs!66O`irIRK|kGHbns3AYf;Aow>3 zP?!ZbXK9NAnLPhP1n(eNMDULh{3`@Fo%tyM&;jyx{+|L^=6q5K37S?g$tI@=$-l;W zH-RR=3TDfX+nit6oQdkXTUVy9#H)7+)w`Ce+oNp7Z*A3yrk1P+Zq0lpPIm$RBAL3=nh4Z?*ra4oL+5DB&7PmGC)`r=lFRYu1 zO|4R3E8}dvz}C;a9NqMt7<)b~d3INn1&i@El8oiz>_&mzxUeD0Zj7-nkmM?Xt%|b^ z0^2ZqILbD}*zF{_R$y!6tW#i}i9%PMrag%`ny_+d*?G=|k5jvLXe?C<8`NTy9|E!%aM27FhmwoaaB@MC z@)2_2JFT>Z)@3}5qP1LUNs-!b+YYU+(1wPK&I%|aH{s|{5F(SfwW}puuRuYbbHUO}RfI|fIYzYnp#=Y2k zis^{CM0P}MmE#B^gXPe1ROU#c6?YcpcUi`nP-F}@YKWJlQAH1zG5=dA9Q-E$RQzeS zFWz)eXgYX*+ZRnI5^UaAMP>1#Mxm%NUbImt+Bn=Jz!qUoTa$@l3CgTGv)`>57-}M{~%{Ao$jipPNz`Y zJFtDHrO&AkQb7p|^qdwr)uAaUp&=Tq-ZM=>t>oNIHLlEVl8-A^T39Zya>hxTGfnEW z`x?$os|=4y`zzGY5U!LO5t=wro0G29`W4#H-~&ns?vkx5+Q{ui^YiEF~;;K0ZIHk#y1ded%N}8eu4Minlf<3cZWu+#L zaI4dv=7`MKDJ?Af3e9OR3y%>-^-Wtd^T8QTmSiR^5z881r!BL-s`YJ|x$0d7)sD!H z%#zFS+?AQntpn^(BuNWgBe$M&avQjf^P4`Dx%WHSSF_i66OCD>dK2w2Z%Tbk?#oP_cctiPik-@yqNZ{N4BY0onaQlxX$5AGnpUh4>l$yRHD^n}CAm3;xvIyG zOk5*Yt|gMiwa#x*X4@J)YET5s)i#BumQkm6e_MgecV=Sp|AvE_V@_;yZVzvKX$(%( zO6Oz9aXhlS0H+@u9tX%;lG-Zyi@Cx@2Z$?_qephAlMmsF=525Wx2?H3bvVy=8YYkL z8t@6?R>vdZ^5{y-zlfj?!C?TPD<6ZOa285#jvjC~+of!J5fyj4ROSr)^znD_L2X*? zfdpym>z`o^`M$KvwgF>f0H8RwPaFqRn`F`2mahtppK66Duz$)IlOs!0oPuoq?} z@nMx%>Q`xD)%TJVzO~-Vq_l6(MbKKXmQf8LeDj+(n^eb?vY!eO=M7MA)>N!u28EXtqMGd`;J$w|J2$vj(6VyS_*6|(!VBAFGN8jB?NE4D;?7(No$fY3B>sz;? z7SF>$V=o_cz$t9Flpsi~0^w?{##Gh;$x{LCn$9B0&iDnyiC)hyK}^*9y`w3;Kc(RF zF)a5Mg8zu%2MDercn85>01$0SZ#_4j3g`Jh$5e1;_NE;7L^EI$;sX;-i^!lo0N;%N z4Yu(UEKP^R984yb1j$)B3yZj6c;IG->|`F<>_^c+w34#YDwsM3`W6JT7Y{Db=mMZr z4DZC%O500VDdTGQ2l_q!;2zhqsvCi!2fq*Cf5LqU#Wm>uyHwm5FK!Zwo0f_d*LJ1`98+Jp{Ys48lqjvf$$Zc@Yq)Ejv&Pr&6V~sGukRAp zcP*_yxKwvYC^kBZDSf@buAi-nu{)9}Xr{e+CC0h{*A1=9{VHQ@ z%~x!3(#Mh*SQL+$DVp-gX=NVO ze!d6+s`EUqCHx))FCaj{She+f93S69@DYM>0AP_r5|un%PGD-v-DMIV{{+GJ5d0Z} z%LqP3@UIbkAHmxQ{uIGA1iu3S+XG1DJS^oD--VzX!9f6`G&6{QikOA7Tyjm}r?JGp zMeuV3{~f_k5&R8;uMzw=06`RqUX$Eb2;8@CpX9!B9WuhTYfqGaz*d^{6!m*Jsw!U{ zQh#UT?Tt%CF4;>%x;Ug2ZuTHf8|W-8Um5}~9OS|f?$*WWi*R5ynJ-@s0uC2x7lWt{ zRhQm)_4=#v!u3Mo`lZ4Rv)tW_a~I>TF2U8c6}n_4$oU_7w;Ba z-Ak@R_g@fPr=#CFFEpJO3eTe_3ZS;?A?z4)Cgs7Rc`mnanw-k5eaKkx4uoqPX4=uI zhdCN&P6*72*r_w|Q|EEw+mk9hlqhS6mo*7x zP0_7~vC2{UcSn!^yUy4vr{k}j7hXAkzw^OSccy9B1oH@H5%tX#fGcg_tSMX56Mw)x z7vO`SLjgmP6j4e9jRABc9@Cs%1R^}A*rTp!XxME3%2A!%T(_BF&EY!fOriRaihn{rrlNQa^rR%|aLxfdw#Scv z>oA^04A<=Ey^e{%CD>h)BjcXY5bo?rJNb^ru&!~hvp^E3Zvi@zC~kn5$asPmC%i%M zM##a8cQLJ!h@t93cpx9+dA<T;G_&roB<@Uok;A&{_#U>Gfj3!E12%||4H4^4AOY^>87XeajyyPQ%%^(;paS`tH1X`_*{E3qr#S@rDkep<}6`bIAeAXV>bI zbT?j(w4qrMe^tVAZj9XsI3_?+S5b|9kf!30Y(Zlz^lT$WT^i9NSL3CT7sC=(W!EdCH#bWosA3z|LwG>Y|r zrB->3eZLh-uFkwy@KIQHIiptpI1kf;@}^`-(5h3ORskND)v3tLUyY%IWjjR?j?B8~ zy?{HFKUEta_29#>3AL_F=PKeQ+wTv6c>_=UNjkbK%z|%J(vvn^E88q2&gGCTAQ!xN z>f8aG4|rS;@q8dA4qgDX!uFoPxZ_d~P2I@#b~&86l8u4zP%C;KjC=S|$d??cW}uSF ztnmdt68<`cF=E?5PRsutg8zX4ml~pg@ed#-JIwNrF%_*9%l%`24Jn%U`Vhvgc-`V& zQSiS)QI+Qc@jyT?q?tX@EvI7aX^9WU3tU2hYsv!BJ6kBRzOpLGNDwdEER=0tFoHY$ z>mR+oRJJEx)+v;AE|qnIslZm2*tTEdcX7MK#RTAD3SVmy>`jWUgvw9Mj;`&_R>|Q( zeMw`Bz_bvZO?G*33XD^Its}ZR#F$F8+kCWUxW_WMHk$M2Cy&h7& z3gptMB>h2oIl!HWX}1@0hOm_wHYqK)T<{r!k;VX5{AivyROU$Vj)hX4Akq@)5bv}A zqKVvoa2L)9$(Nn8zHgi~q`ZGXoMyS~`5a}JYAfu?ukIVq*&+rX4Lj?0*y)kS0nEdB z_$MXEjUH3=q380``Y@?-GcmyZFA~Es1~?JX5TMqE2O`s zq=(QBL_$5>vN*}4%=2791h3CidC&N$e%%@PN|VeLrdR$Qr^hL!tu&mxO8P2&6#ij- zIE%sujs`rEKdVE&AHp%f2Syx+dtd5tzzt~LO^)Q=Ajt@Ua~RyQ>2>%9V5`u}c{vxc zKH-&VaEBV+feVMi;H*F}h4kiSIo``2XxA&1Xz7K^ zKrcFca4jepticKlZf2X{1o#EGJy$Yw6PH}*Y6w`lCph8?H}>MSzYf3eB9WjQVFiHm zY5W9PNCtQ?fb)Pf=L)~r>zQ!)Ld#0R{w7}i2EASIav>jB%!8o-)CIvC5rA7eHaW<3 zyLb>i7zl)hptLKzTZJZ^of`mSI-LFU_;Cw02p!{9pafkQLo{nkxDan)7dY<`gz**^ z?}!)F1n=d3A7DrdCEqOM>vuVgB6C0<1-O(H-zuElAtTz0h=#2_*yDcEqiF7uS`z8; zXU0pRfuq%R%JxsK!V^+9k+EoTP0Bxi!uEL^4XfgNypl0K7##WvHUEo9ll>Oo-qPi04vf z3h=xg98BB#RmHlfvt6iYhjT88;<|Woi%{GWZS7ksetC+8RoGq=w>1j3#+c3dSXZ1~ z_H}XTjq&T_sO$NAtEsW*+DlLKsIsbP)#io##qn6_ z!N(L`c#^)~@(`}2v`kxO_AKm;)*iTb;{JCZl$`ihkC{>tK)0;wrhoRpVq>hd<1wWx zJV4*`Kdh{Y)^1toy|+D9c?1fU9-!~Pk*H{lS2PI~O|$;EYp>wiyX4v*tLT8%Ap2WA z)_k02vJ^ecEsPd5&gL(S$8z^VC9X5XJEF8#6P z_m7Q`_3T>~x*&c39?X&UQm6okvANNL=7rn^eKfBPw;=Kh|NKR)U@3YQd>_c+Q`6Qi z8};e#^3IL=UlbKX{1;8OF1`L2?T*gv#$Q%25dUR81L?nP%IT)5U+ymI+N%F7w-n-^ zZ8UbanLlebL+)qWja`)GvvxC-|6FhEV$Gj3nEtuV($%W}yu{Ykr2o8;#(0wv;Z|eU z9`onB%+SuSz{FUu|5cW)yITLNQX1pcMu5w%=TDjn^MK}7kfZRP1zCQ8S4)NrIZ7wX zQF<`v(LQ?80P8o-d=lV#K#*yBo{2oH9%gl;-8f4GNDUf zizjr+^)M-Y!J1n#sgh$j7O$^Wueq?^S|?3cOcUACZ)&}D=7g&yT|~vwa0N)Ngz`Ga zKZUpCzePY;>F+W2zYzRy1jt$W{{x^WTrTlSNfSw9mECZn4@Zm#p@ZVh2p9ww1T2DV z08q$=ang|;W4Q=Q5ELLN1`x!tRkI|bmS{2|qE)EZ-9@bbkDxv@L6U>l${m$Sct`lNJ!ss2+t1JO@Qjr(iOpH}HHUQ1wurNgBE)Rogg z>wiHTA>QN6$7}4#=C51Ka=YRD%_YCr?G{Oq-Y#uG4JZi-JNd$k1 zpcg?O0+WspiLS`l_N2MUI7&Zh%Q2p%pEy`!-IIzYV>kWeJZ&`AKFL{U+($n-PUk>DN0l+> z$v&Dj9;TmEyha;eqn~u@%c0P&0^>pY@g~ZY_xHMu#-eZZ5POWV$7gAhm}4v@iGQzy zn1mFf;', lambda e: self.on_voice_exit(voice_menu)) self.voice_menu = voice_menu # Store reference for later updates + # IMPORTANT: Update voices based on the selected TTS model after initialization + # This ensures edge-tts voices are loaded when edge-tts is the default model + self.update_available_voices() + # Add hint label for custom voices voice_hint = ttk.Label(voice_frame, text="💡 Click to edit or type custom voice ID", @@ -914,6 +923,15 @@ class TextToMic(tk.Tk): return Path(filename) # Default to current directory for non-macOS systems + def generate_edge_tts_audio(self, text, voice, output_file): + """Generate audio using Edge-TTS (synchronous wrapper for async function).""" + async def _generate(): + communicate = edge_tts.Communicate(text, voice) + await communicate.save(output_file) + + # Run in a new event loop to avoid conflicts with any existing loops + asyncio.run(_generate()) + def submit_text(self, play_text = None): print(f"submit text self recording: {self.recording}") if self.recording: @@ -977,24 +995,76 @@ class TextToMic(tk.Tk): messagebox.showerror("TTS Error", f"Failed to generate or play system voice: {str(e)}") else: - # Use OpenAI TTS + # Check if using Edge-TTS (doesn't require API key) + selected_tts_model_display = self.tts_model_var.get() if hasattr(self, 'tts_model_var') else "" + selected_tts_model = "gpt-4o-mini-tts" # Default + + # Find the model ID from display name + available_models = self.get_available_tts_models() + for model_id, display_name in available_models: + if display_name == selected_tts_model_display: + selected_tts_model = model_id + break + + # Edge-TTS handling + if "edge-tts" in selected_tts_model: + # Convert device names to indices + primary_index = self.available_devices.get(self.device_index.get(), None) + secondary_index = self.available_devices.get(self.device_index_2.get(), None) if self.device_index_2.get() != "None" else None + + if primary_index is None: + messagebox.showerror("Error", "Primary device not selected or unavailable.") + return + + try: + print(f"[DEBUG] Using Edge-TTS with voice: {selected_voice}") + + # Generate speech using Edge-TTS (outputs MP3) + temp_mp3_filename = "temp_edge_tts_output.mp3" + temp_wav_filename = "temp_edge_tts_output.wav" + self.generate_edge_tts_audio(text, selected_voice, temp_mp3_filename) + + # Convert MP3 to WAV for playback (play_audio_multiplexed requires WAV format) + print(f"[DEBUG] Converting MP3 to WAV...") + audio = AudioSegment.from_mp3(temp_mp3_filename) + audio.export(temp_wav_filename, format="wav") + + # Store as last audio file for replay + self.last_audio_file = temp_wav_filename + + # Play the generated audio + if primary_index and secondary_index != "None" and secondary_index is not None: + self.play_audio_multiplexed([temp_wav_filename, temp_wav_filename], + [primary_index, secondary_index]) + else: + self.play_audio_multiplexed([temp_wav_filename], + [primary_index]) + + except Exception as e: + print(f"[ERROR] Edge-TTS error: {e}") + import traceback + traceback.print_exc() + messagebox.showerror("Edge-TTS Error", f"Failed to generate audio: {str(e)}") + return + + # Use OpenAI TTS (or compatible APIs like SiliconFlow) if not self.has_api_key: - messagebox.showerror("API Key Required", + messagebox.showerror("API Key Required", "An OpenAI API Key is required for speech to text or to use OpenAI voices.\n\n" "Please add your API key in Settings.\n\n" - "Note: You can still use text to speech with the system voices only.") + "Note: You can still use text to speech with the system voices or Edge-TTS.") return - + # Check if a tone preset is selected and add it to the text selected_tone_name = self.tone_var.get() - + # Get the actual tone instructions from the tone_presets dictionary tone_instructions = None if selected_tone_name != "None" and selected_tone_name in self.tone_presets: tone_instructions = self.tone_presets[selected_tone_name] else: tone_instructions = "" # Empty string if "None" or not found - + # Convert device names to indices primary_index = self.available_devices.get(self.device_index.get(), None) secondary_index = self.available_devices.get(self.device_index_2.get(), None) if self.device_index_2.get() != "None" else None @@ -1002,19 +1072,8 @@ class TextToMic(tk.Tk): if primary_index is None: messagebox.showerror("Error", "Primary device not selected or unavailable.") return - + try: - # Get the selected TTS model - selected_tts_model_display = self.tts_model_var.get() - selected_tts_model = "gpt-4o-mini-tts" # Default - - # Find the model ID from display name - available_models = self.get_available_tts_models() - for model_id, display_name in available_models: - if display_name == selected_tts_model_display: - selected_tts_model = model_id - break - print(f"[DEBUG] Selected TTS model display: {selected_tts_model_display}") print(f"[DEBUG] Using TTS model ID: {selected_tts_model}") print(f"[DEBUG] Selected voice: {selected_voice}") @@ -1758,19 +1817,22 @@ class TextToMic(tk.Tk): def get_available_tts_models(self): """Get list of available TTS models based on the current API base URL.""" + # Edge-TTS is always available as a free option + base_models = [("edge-tts", "Edge-TTS (Free, No API Key)")] + # Check if using SiliconFlow is_siliconflow = self.api_base_url and "siliconflow" in self.api_base_url.lower() if is_siliconflow: # SiliconFlow TTS models - return [ + return base_models + [ ("FunAudioLLM/CosyVoice2-0.5B", "CosyVoice2-0.5B (Multi-language, Emotional)"), ("tts-1", "TTS-1 (OpenAI Compatible)"), ("tts-1-hd", "TTS-1 HD (OpenAI Compatible)") ] else: # OpenAI TTS models - return [ + return base_models + [ ("gpt-4o-mini-tts", "GPT-4o Mini TTS (Recommended)"), ("tts-1", "TTS-1 (Standard)"), ("tts-1-hd", "TTS-1 HD (High Quality)") @@ -1783,6 +1845,94 @@ class TextToMic(tk.Tk): 'claire', 'david', 'diana' ] + def get_edge_tts_voices(self): + """Get available Edge-TTS voices, using cache when possible. + + Returns a list of all available Edge-TTS voice short names (IDs), sorted with + English voices first for better usability. + """ + cache_file = "edge_tts_voices_cache.json" + cache_max_age_days = 7 # Cache expires after 7 days + + # Try to load from cache first + def load_cached_voices(): + try: + if os.path.exists(cache_file): + # Check cache age + cache_age = time.time() - os.path.getmtime(cache_file) + if cache_age < (cache_max_age_days * 24 * 60 * 60): + with open(cache_file, 'r', encoding='utf-8') as f: + import json + cached = json.load(f) + print(f"[DEBUG] Using cached Edge-TTS voices ({len(cached)} voices, {int(cache_age / 86400)} days old)") + return cached + except Exception as e: + print(f"[DEBUG] Failed to load cached voices: {e}") + return None + + # Save voices to cache + def save_cached_voices(voices): + try: + import json + with open(cache_file, 'w', encoding='utf-8') as f: + json.dump(voices, f, ensure_ascii=False, indent=2) + print(f"[DEBUG] Cached {len(voices)} Edge-TTS voices") + except Exception as e: + print(f"[DEBUG] Failed to cache voices: {e}") + + # Async function to fetch voices from network + async def _fetch_voices(): + voices = await edge_tts.list_voices() + # Use 'ShortName' instead of 'Name' to get the voice ID + return [v.get('ShortName', v['Name']) for v in voices] + + # Comprehensive fallback list with common voices + fallback_voices = [ + # Chinese voices + 'zh-CN-XiaoxiaoNeural', 'zh-CN-XiaoyiNeural', 'zh-CN-YunyangNeural', + 'zh-TW-YunJheNeural', 'zh-TW-HsiaoChenNeural', 'zh-TW-HsiaoyuNeural', + # English US + 'en-US-AriaNeural', 'en-US-GuyNeural', 'en-US-JennyNeural', + 'en-US-AnaNeural', 'en-US-ChristopherNeural', 'en-US-EricNeural', + # English UK + 'en-GB-SoniaNeural', 'en-GB-ThomasNeural', 'en-GB-EmmaNeural', + 'en-GB-LibbyNeural', 'en-GB-RyanNeural', + # Other English + 'en-AU-NatashaNeural', 'en-AU-WilliamNeural', + 'en-CA-ClaraNeural', 'en-CA-LiamNeural', + 'en-IN-NeerjaNeural', 'en-IN-PrabhatNeural', + # Japanese + 'ja-JP-NanamiNeural', 'ja-JP-KeitaNeural', + # Korean + 'ko-KR-SunHiNeural', 'ko-KR-InJoonNeural', + # Spanish + 'es-ES-ElviraNeural', 'es-MX-DaliaNeural', + # French + 'fr-FR-DeniseNeural', 'fr-CA-SylvieNeural', + # German + 'de-DE-KatjaNeural', 'de-DE-ConradNeural', + ] + + # Try to load from cache + cached_voices = load_cached_voices() + if cached_voices: + return cached_voices + + # Try to fetch from network + try: + all_voices = asyncio.run(_fetch_voices()) + # Sort voices: English voices first, then alphabetically + english_voices = sorted([v for v in all_voices if v.startswith('en-')]) + other_voices = sorted([v for v in all_voices if not v.startswith('en-')]) + result = english_voices + other_voices + # Save to cache for next time + save_cached_voices(result) + return result + except Exception as e: + print(f"[ERROR] Failed to fetch Edge-TTS voices from network: {e}") + print(f"[DEBUG] Using comprehensive fallback voice list") + return fallback_voices + def update_available_voices(self): """Update available voices based on selected TTS model.""" tts_model_display = self.tts_model_var.get() if hasattr(self, 'tts_model_var') else "" @@ -1795,8 +1945,18 @@ class TextToMic(tk.Tk): tts_model_id = model_id break + # If using Edge-TTS, use Edge-TTS voices + if tts_model_id and "edge-tts" in tts_model_id: + voices = self.get_edge_tts_voices() + print(f"[DEBUG] Using Edge-TTS voices: {voices}") + # Also add system voices + if hasattr(self, 'system_voices') and self.system_voices: + for voice in self.system_voices: + voices.append(f"[System] {voice.name}") + if not voices: + voices.append("[System] Default") # If using CosyVoice2-0.5B with SiliconFlow, use SiliconFlow voices - if tts_model_id and "CosyVoice2" in tts_model_id and self.api_base_url and "siliconflow" in self.api_base_url.lower(): + elif tts_model_id and "CosyVoice2" in tts_model_id and self.api_base_url and "siliconflow" in self.api_base_url.lower(): voices = self.get_siliconflow_voices() print(f"[DEBUG] Using SiliconFlow CosyVoice voices: {voices}") # Also add system voices @@ -1818,8 +1978,15 @@ class TextToMic(tk.Tk): # Set default if current voice not in list (unless it's a custom voice) if current_voice not in voices and not (current_voice and not current_voice.startswith("[System]")): - self.voice_var.set(voices[0] if voices else "") - print(f"[DEBUG] Voice changed to: {voices[0] if voices else ''}") + # Use zh-CN-XiaoxiaoNeural as default for edge-tts, use anna for SiliconFlow/CosyVoice + if tts_model_id and "edge-tts" in tts_model_id: + default_voice = "zh-CN-XiaoxiaoNeural" if "zh-CN-XiaoxiaoNeural" in voices else (voices[0] if voices else "") + elif tts_model_id and "CosyVoice" in tts_model_id: + default_voice = "anna" if "anna" in voices else (voices[0] if voices else "") + else: + default_voice = voices[0] if voices else "" + self.voice_var.set(default_voice) + print(f"[DEBUG] Voice changed to: {default_voice}") else: print(f"[DEBUG] Voice kept as: {current_voice}") @@ -1828,8 +1995,13 @@ class TextToMic(tk.Tk): selected_voice = self.voice_var.get() is_system_voice = selected_voice.startswith("[System]") - # Update tone menu state based on voice type - if is_system_voice: + # Check if using Edge-TTS model + selected_tts_model_display = self.tts_model_var.get() if hasattr(self, 'tts_model_var') else "" + is_edge_tts = "edge-tts" in selected_tts_model_display.lower() + + # Update tone menu state based on voice type and TTS model + # Disable tone for system voices and Edge-TTS (neither support custom tone instructions) + if is_system_voice or is_edge_tts: self.tone_menu.state(['disabled']) self.tone_var.set("None") else: