From e6c9b47b2c17eb10bf0c945e80fa37568393257e Mon Sep 17 00:00:00 2001 From: Dan Cinnamon Date: Tue, 22 Mar 2016 22:36:44 -0500 Subject: [PATCH] Created a documentation page for the pulseaudio_loopback switch. --- .../switch.pulseaudio_loopback.markdown | 50 ++++++++++++++++++ .../switch.pulseaudio_loopback.html | 1 + source/images/supported_brands/pulseaudio.png | Bin 0 -> 11379 bytes 3 files changed, 51 insertions(+) create mode 100644 source/_components/switch.pulseaudio_loopback.markdown create mode 100644 source/components/switch.pulseaudio_loopback.html create mode 100644 source/images/supported_brands/pulseaudio.png diff --git a/source/_components/switch.pulseaudio_loopback.markdown b/source/_components/switch.pulseaudio_loopback.markdown new file mode 100644 index 00000000000..afb00a30957 --- /dev/null +++ b/source/_components/switch.pulseaudio_loopback.markdown @@ -0,0 +1,50 @@ +--- +layout: page +title: "PulseAudio Loopback Switch" +description: "Instructions how to use Pulseaudio loopback modules to build a flexible whole-home audio system." +date: 2016-03-22 21:00:00 +sidebar: true +comments: false +sharing: true +footer: true +logo: pulseaudio.png +ha_category: Switch +--- + + +The goal behind this switch is to allow a very flexible whole home audio system based upon PulseAudio. + +For example, for a system with a 7.1 surround sound card, and 3 instances of mpd running, it is possible to quickly route the output of any mpd instance to any of the 8 possible (4 stereo) channels on the sound card, by loading/unloading a loopback module. This loading/unloading functionality is provided by this component. When the switch is 'on', the loopback module is loaded. When the switch is 'off', the module is not loaded. + +The benefit of this approach is that this audio routing can occur without modifying the design-time configuration of mpd or PulseAudio. + +This component uses a TCP connection to control a local or remote PulseAudio server- so there are no local dependencies. + +To enable this switch, add the following lines to your `configuration.yaml` file: + +```yaml +# Example configuration.yaml entry +switch: + platform: pulseaudio_loopback + name: mpd1 -> bedroom + host: 127.0.0.1 + port: 4712 + source_name: mpd1.monitor + sink_name: bedroom +``` + +Configuration variables: + +- **sink_name** (*Required*): The name of the Pulseaudio sink that will recieve the audio. +- **source_name** (*Required*): The name of the Pulseaudio source that will supply the audio. +- **name** (*Optional*): Name of the switch. +- **host** (*Optional*): The IP address or host name of the PulseAudio server. If not specified, 127.0.0.1 is used. +- **port** (*Optional*): The port that Pulseaudio is listening on. Defaults to 4712. +- **buffer_size** (*Optional*): How much data to load from Pulseaudio at once. Default is 1KB. +- **tcp_timeout** (*Optional*): How long to wait for a response from Pulseaudio before giving up. Default is 3 seconds. + +

+This component relies on raw TCP commands to PulseAudio. In order for PulseAudio to accept commands with +this component, module-cli-protocol must be loaded on the PulseAudio server. +

+ diff --git a/source/components/switch.pulseaudio_loopback.html b/source/components/switch.pulseaudio_loopback.html new file mode 100644 index 00000000000..31ef8fc5717 --- /dev/null +++ b/source/components/switch.pulseaudio_loopback.html @@ -0,0 +1 @@ + diff --git a/source/images/supported_brands/pulseaudio.png b/source/images/supported_brands/pulseaudio.png new file mode 100644 index 0000000000000000000000000000000000000000..f90a8ad76d2cc4c1e0b09f1f600609ea6943b82a GIT binary patch literal 11379 zcmX9^1yq#X)2BmnLAsZvq(eeVWPx2;x;v$F=@OAn=~9}dyIZ_W{+);x%e*bGAIV&$v|LpkEL>s6&gKX(7>vW(-p0k$*wLKB!PzqX zScDt_fffM@mQeG^ILh?Qpj2}=C(ZMurh*deKE)3rfdXSuBruF4^zezm_)GW= z4>`_6SIv5ch%l$wh?{n2b?^k%Kn`2=8#)vM$N-WVUg{xM4Jg&Ope5@jMpa*5U4MD1 z#w_0GNi16tu9&I1>#B59k#!+FenI(Jz4{j%evV?q;h6UHqW4q8Cf5{CIDn{gXzK+B zCn`z?2BG^Dd}|qC2Aqe(hd!*~uF1nZt*u$i&CS2^BPa+D6uV#Rl;7mR`S|%Kr=~V5 zt|`_oUPrPEE%Sjx@#*dZ`Qppq@V9GdYY!jSf3UcXq>Cq8s}_FN)Ra*eC5`pFCLV}O zyVrDKxzQgVXxXog>ff|oyhcmsw=>!7i()fu&)C_q;37Vjp&%!JnMiH`0AI;AbxT$! zCMIqMv;?5u-Q9T|)y)p&pEUn~fOrJknn-z5MC!)3@xiqc+r`!O_5Ai7PwvE=1{tl6 z6sLE6eSIF~4h;X8a}NARh8{%=J44j>-c{`BuM)49E6!S`-wll~-R#fiuHW;84=kaf zs`bv>tdGaAj_tLsuLuI~`T2colpI+8(eMgPH*-Mn6SG@zZNILo0EA({KR{5@1G#+7 zed!nUAObZ~tR|%w1qIUfP20prdwUQB7Yd5>naiWhZy2w_ScJk=w1rG~PQMr!7_1A} zH$$bPD8tOPze-oef`(TH>I8B|-P=y`D8n#9PdBhQoySFC$fbxouRP?J#s80lKR&YZ z^eTc>vfjC(tgNh+olQ@5Y1cuoQc=MaWwh_nWGMedl`rc!ZP31SF2G_ms~4_bQE5F@ zFyHBqAaHY27V^qSFhv!B{#^m$?w>!A#?OzQuCA{5F?cKYF|==SXu@((1-&(sBjC|>m>@d;ay$mo0v z>gw(eQ2LGD8y>Yyq9U{oI)4-HS>wl^S*E};T#dK2PuWoCRMZr=p3A7>vN2Ejq4H}8 z)j<^jvB7X1XFq?SjOlNa&(e{k5|WaVN1*_sL;^3Da}T?yRk#Hz5c z(EFoKDcD3!DFZr{;LmE0+2E9ABp50WF_sZuN$9Geo1TkxnEQjBB%-u-;pk-?zXit-6r%mnp}z?g$)5i zlmt@+G{m5Cn+7d0E44aT_+_EW%E}+LwXLfaA=R(HAbtBgVCoGP*5L4XVOd*dd3m|m zDu^JA%WuY0Et3mNeeQOnhwo@b@S`(M`DVTBte6X)>Z&_SZb3%(A5_hn?R=T}8c*|p zZF2eYVrK}5;4Miqh%;+p7mx0rp(5cUzkBoM&EDP~Z5-q>)$Afdwn+G??T1=)eoMbe z|9;_Ii)Uht$TIlg#{y`9#95)iR#VhhpazJl7M0!iyD1r;wb-Nw%fC0gpBMiNV~#o- zYg{Xr#~|6KV2m@RsFZhFNt5&QP?41>rly~bCVXyK;-3sYW9mCah#n-Xblj8CCTzo_ z-P7!QucP!-w}+~~+gm=jh)doTVX7&m${08ialRaN>>Ym@|5Us3jSKKAH*eM3%Kt#I@n>xYRbn4}R{qFx>WKP2{ZjvD3AHjxw%L_ZEzU4Bg_kzB z1+Dwe3c(wC0m86tRW;?9HSG%hY3={kb_aqha8AZ*P(5 zkAsk(%fx#@MYH*>PI6tABYZ_F;0BN2$@g*q%S2nGFrsg4qfhU5$<%gBt$Wd2#UW-Z3jOON8 z@E{~IWekPw`lf8-JzHu7p)oTvzv?pBS>m535Jl_#H!%T)!89vC!Zuy#gPar!uqAw3 z%|$u`Lm#}bM$DV>B5$~g@`oUJ7_aq0UEp;Ox(je@=xmCGgJy8-ij&~v_^|h0J!$Cy zi=+9uaLl8BTr5Vwz;LWyeLPRQ>iCS9gd_n1$~gb$52V;27n1*`r=gmfni>lA_rddO z3ZheVS^+qm&rvf;J!4IV2Wsj=GSfVs&-t!(R2It{;((Lmp}`HQUv@pRA&Hv2yYWgc zjxX-~t*5m5W#4&p@)rf#KRw+OMHZ)TM*jU1A>NxbEw^VY{Pq?fftiJcOc`JLRnSi; zbV!W-@K9RqdXdm=67GW>C9ff`=7qVcedz8|#}QWNWle?IdcWUD`zWjDRk1L3SA6wH z7a@CLj{pY$dt9k}`o_ay7?0ObF$?RA+9hSj{bjbuCL0^sSgNKEhhqj5B>we(63T=B z7&OIzfe;YypuFhAyEnsd5%Wb&F~!zJo4XGvjNOAI2K}|DnpNg^l7~7Cf7Ds-43EJj zU(U`A9X9_9)X(rl3#(-P3#c?SQ#@tMrY z*XUGvN-@Z%`1ks+XFZRgnr z=%uU6HF}5Q@?!)q!BK%ZUSZVD4=nMF&jehcbV{><|3wwbJpPj*9{qCB?N2$LcUjdv z==;{QfW#t7%JygsxN25nwWsg@KDRFQRMDeJPTK`|T&;!WYh8 z3ev3aY?Pj|qLcb0=rnK6qGyvTeMf5$GTaCIsiI~?v#uqh4lDdc?UriBTHf7$4F!jS z|DWzxtp51-DCvsT@2AFpR^|cAd`=3IMR(z{5`&J6*?uetqWVX#Q*Nd_IPKdy!GJ#E zyUQd2vRg0nJKCsqQp$1>>lu>v7=o9Sgh}WAV))-;Br`H$Mx`(rF`>Fskmy!Nl~ZTT zv{q+QnCZqa(TarN-f>MCmUUdZrK7@~HiXGrR8(wwn*#maB5b|VmfEMEKG$K#zI;?h z7Uq7EG+oPg{HxYE5{k=vKv`er*Tz# zx_w{xz)b*|kj4o@T7a~XcqNinKD=N5HZ}B-NjZM~yimQ)j=A4OL=xPNIZ~~p8;JK; zyeZ~a=n`a~7xA_YF6L6(m%y4)sS^ijW?=ecegw6S(pgzLW>;n|CO^=oT)ZAiARBy7 z5XNn~{*dZ7Lj(bBG^r~rTO+vE(d^`-`*lTYCVPa<{8gQAeFW_2Jz{nape@dd$p8Vc zeg2cO{%Qg+@UzlX)zoga(|k`PrBM9FhDk1i42t@R7FqymXDYJQDhqHpU=``6=*#Mb z5;c_`PUL{&ku)u6o{|j58bT!^56171!Ra z(E*A@$W6l0QMiizm;0)cs4(@M#v|oe4mZ&;bx$Zb8RxZ-D3%i(xGq{?uW~o zmnBCo;vU~LL+8IUWqIS|tD8QE3^d=7@LDV^eaum?7eZF%_5$|E%6RPaos>1KW-F_Z z=H_wX0g5PvQHQH5*@ly_B3~JZl#2 zI*O$?Da63IBxGl1!L$7{J+VPI0bfYXIym}HF%l@J$XrpLe>`$?>HX7E?+i7!tl)0+ z`07u|Yq;hHZ|ax*c-vRRJeEt#xp5e&%vCy4WuodFNXhCf!8n5Q{0`WEIYs+B;1n@v z$p>3Z@CUNcm=lvDXNVpivOvjxeJ*$GpKg-B9C~+BU7++mp48@eu&&NgouY8sD&MR= zmcev_1vkDusfK~n{9YK}$;t-Z!c2j0mKRa34I=ZqcR7uXDS-SQ=7EU0&0gx{FcYjK ztY|^C2=|A3J4@w_??*z=6`RBu@^edcFq@uY~ z5~n&$vfAfQ?Eox-@n5mIFY)74&zhg@dRuIq5gmJDarXtk!;i(%P_UkjPz3tJW5rAP z$|PD_kbSI?u=J=gsJ@er5c7#Ol!d1?i{Z$R;D?6dN2Sc}h4C`KW6LRRjojb=(icr8 zC*?$~o{x&nIaXN990N$C*Prr>D980~KzqnG`|>+aFZPc)?;R!{s@k;5bQ}D>5#Elz zi8Ys!KWG&xO|emi+Ck(kaN2LMA1v4hkh8~3xNw~(X-_MQ7Efa(COXdnoSOhl0Kz{= zreMD{SRd&f2LOV4`dznYn|4@#Vy!?xMH0Bte434O1^2K@vV5%Uf?ZQy(AEPa{$e5o z-p&C`MpoL4clBwc^sw5KCfa~>&&*d`6RqO3BGw}J99E+Oc?{HHxZAfONI;-NZ$Jbo z2s*Z_|5Fy`Eth77&&qtRSTK!(i_Kbr_OqyUDCK8Te0H{ywlir21`%G3gK-~KFdkj+jUK{CkJgF#M-oP! zWAzcWdp~v2jK5;Ohc%=g0(}k6BFd&W4by&Q2*(=Jw?>z{J$LT@&{ECmy6eVgv{rE; z`8D!2^rydIa0udszLY4unNRh};P^d>L-1+|Jk1Vm$DsrN_N^n2GS*hufV2_SDaL8x zb9{N|TOY5Gw&4XGdt3 zqW2kA{-RWMmDP`h!6}wd5HlOwr|E8$h#3LcFE^;6&Q&aHUg)e+h<(m`fL`CF;(l?# z>Yt~PWAr3?)GZQX?-SG611r%V7QMI{T1T`d45?851kR<^zzytK*#Y+beQz^&l4hhv z&hOrrSnmJz_6Is3=JKeO^gVJ_p!vN6iX*qrt}2@WSdiKgmp%@exNd@H&jh5lggZ08 z%Gdj?&b8?G!{UJ2T=5be5MoJ-W9DKD9+|&aA**XRF1`Y%4J+hf1K4Xyoh*pSmWvf7 zf#cx=SMW4ynpNR1r|sjoK`-_5eV%kX4fvN7B8zUV>R|gmk++kPq)gT@Wq8kVv}9mr z|C{fgc>zfRFqK%6U+~g^szj+jidnJ}#&k)HlsvXebrW>r9ar#ri?~UJBW@vmW-4|C zO0h~pWj2y9;zV_?~1O~;TZ(1CyLr171+rN_o z&+Uzbx=;@K|90{M2`Gu&f@y(Lz;l}sd6tB@%|5d=yv|{u%67+|&Mi_0aABHUzWVN) zg@pX)@bHk&w(ohoJODj!B57>=J~!0}CjF7pCBLcky%IlkHxe={;HXw$>d8xN-k5ly zqdwuzv&#?Vx0Ya9JX&s^AvB9M)QSflZxs#{cIR}O61>ezS{x|-d6gtr8S9`U&9N?Yk83nh8WEFkE>)V}*+T<9S@#A{rT)9d6 zZ6CRPM|oOM(u(cjQS`~==w!UDlZi(SYE-&GJA#;X9WzaMwhdeV&^S&Jp9Y3b3+7BP zZ}vr-e$l7WS7@Oc)(GsL1mFg0!*N;c^{(;DMj!OI_NNSx2mVv>FumeET&$jH&)%k6 z*jT5hvbkLgq;jq0^KL~Ol8J&XbDB$aG@0hAa+007vEAK9Kv<+BMuN*E-zWVF2-Sl& zzn|4?r6LTER$LYKCMJ9a$Y$X1nId2@LREzJcx=~Gs~ zcZ>IhQi`96NH@zN(Bu_Hb(>BaZZb9og+mQ2K_Kr%7-U2lPVE5R$~ms z#4=9tjaXglX~A%r$U5jmY*v1Vl`h3i)zI+tq_-*# zYmk#E=uHPfLDeC@sk+PWZ=12^i>cl}vkt`Y=C8QMuhQiZTu3Vo)eD$dduEWUqh1UA zMK%%l{YhCnHh<`#Q#0_!m>ArSM>(MKBH8A8CrqnborxB??UDP`jOFknizfSR+?{s0 zWskbY@}+^sw7_GcEx~>X@3!Xell-g?hIdhEP{h)rsgpN!D2_(*GP4flw$6bx!!-Wn@o5f2 zkjfMu=4y<|ObfCRJLmp7m_7wk;Wp{;dy^5!R~r9CKJ;+IBr+{f7OPI0j3W$%!6sU7 zaBzL!wyPf+zjjg1U^sAoq#=C!n}c@3Ofxr`Jt;GRSz&Wqe1SBS^t- z004}mGoGE2+HxtsFp2b@v>FM&yQDlmyZGgpOa4hMZl2~AXU+AB@$uQv+t`GG(J7oJ zIbz^tB0!`S=#1;=lvE{xr?>rL90tJ&*&4&NB1H5HoHb|GybU||uldu4bx{f3XuIC` zwiLgol5IuaB-riSRj+Gm2!S`tf!mRmoIq$h-AJtwPH$Q@UGR+CSK4JJbvSz-%j{i` zA`v7!S*{(lyGEu+RP^v&TxYe6xxZ~s*SU^5|NGf<@9;ZNZ({Am%m-hr{ebH@mUyLJED#$b8d&76QB>z-0o-20X z`UjJ@EfC|425@Z5ZCE8fxM1Z4zsZr^#ArfCn5*Qk0|Tg9PqzS3_+8OHKcESjm%WBd zEW+k!w#3Zc>sckKT?2U+t;wQz-@rTRjGzlEzAyrk3AZ0}_QwO8@fetBMB0;K2t&+q zq$yA?B-?*nN>!QSJok?e6sxVGPDWHGsD!(#ANEAlFDS}3J{nPkvsUsC``b{ z@|jZDS%Om#LysK%pcHVGUe=q22*T7Ledthp+tn#?>=nn>N)r6l1J?F3 znucb=8g*p?Q>m@IAFx2qjgrdBSQga+uF|4dQ3?ZBzEKdS`s^5Z+WA#sMX0)(B4f`2 zGe0|Pc{y``HZJ8RFy1ad>k$-@0Jh zrIRFOJm@H`m~yOrs z`{A^oMguMeGo&5A?No|}!P_IxF0i{lLiw$_hGWDxGwq)uLN5hU)mkH>S4 z09XNt`v|Z<>PUMot|@kpt%s}zTTp!Z>zj(ayx>>KVw00)fW}qcPZ6LEQI=U&_1Cb* zU9JP=MAF5r+z>7GJ9Kw1GgK_COqnO~rNkfaPBeX5&?xQKQ9$ErWLpLU*D3KR3`Q3@ z9@vs}T0LGkJ?+lg6sa1Bgr9%&DnC34iq-1QOjf!iTu?7<`STI}-U=uT(1zc4Pf!m4 ze)njX`=Zp~jKhvt-2LN54}NlH+cENFS$^NSegjDT4yzNDz@742oOE;O$>{$)bem28 zn2zFZMEv7ET!B;*P9G@Le&L3k!hR3EmbZK$vn449&`UdZV=~RDT1tY?#@w%MwL(^j zzNjs?@?r59GgNM1&WL%UUzKDTdyIk#+MamQ!Dj=g203+Qa>M4^I!U`L1YyoI>V`mq zQPaU}|IUJBYB@k{4Bx?y;Z_*4>W^uq)x@)vwHdP*vNj{`z7INi@Km<8hBwEc2Xwu0QS?|2_8 zErq+p@{zwA9#BEVpX+l?p$hy2fY-){NIF(pOn2;hJyDFR(7M?hxe(#4_s4lPbM@!Y zjWEU8pu`VH28NH8%^!49obQFL=i0uBQfSVRTTh-V5U@vE96<1*Gk!*kA1%p=No!A& zW;I<9yDw5B`DwDLo69d#zU!a%6nRr$`iR~#(~+S;;<$w*xbJ04-$&z&d71*JF6Nx( zMpyTRg6-)Vq}pnZX7Qx9k~@`xL@<$*Gq)GsKD<|s?Dhbg1&97V-2ozaq=z12!D$dW znEFzI&Oy}qBQI^8**`v{ALu&_?8(0Wcq^*rb>%gHh~QUYVLy>)BCs;+ z7?+=|DOsDuHz=*k_56`yrXaOkw!Q>djxa7Cc4#S?mk&AiIM`!PQf* zDxSDBy=a-ByYgIiN6(dN^kKj0i>M3KwWcFKUa4ArmZ<%#SJmjb0NwuAK8 z=CPnRQ&iG4gei@&BO}|eaB<=_ykArhq@y*#m%yGET2hF(UvfnpivqC|2#FB1mQ|lF zmD87bFxT*xp+8>gm-~z-7_=|nmFZruVWU0t3t3qEYVW1eym#}De7e%v=>*HC`qEn3 zuRk(=swt!>UIi0sJCDa`U0i1G*$R;sO*4}8!TXeQEyB+#p&XO!Z6~|#?&YqL~gU>-T6UXBy35iB4Z6+N-GTyQWCh zX#Dr-t!7kiV-DKe^N>VtrxgZUo%@gQ%uTwr*IlgO((miKh%oSlGOOF_N7k9wa=)ib zzt=UB!NuKwUYI;WiYQ}^k7(mR{Cgr|D&4llMUu)5-*I6X0>F+#F{Z8r83D+V49UZ) z_eJ)i<#4>P0m9DR0Dq<%H6MX6NDRC{+ZDd>4yd2Pt``leCWvX{+FAYVitO8v^#*!3 zj3iGIH>Kug&Uy5R^}!q%zdHWi2YR9|GH5{SLO!OaJo8U5@!s)mU-KYw0m+0at@!9$ zj!z2lhRzer)=yWiwN?8L9VTPm&rvzm?>-ibUinX%Bft?YoJ_3t^b6 z|MXT+Qci6Hf7N+KM_$Vl7n~7vwS^^SW`-gF)iLN+)WS?~U2JRIc3J1S;zb8Gz9@m% zz8ek0`yBU$#gIsYmTSy$lvbU1!#qSr&vA6v#o$S$6z~N&ya9=j zy9vvAaO0&3dwV`KPf|S@r@N%#8&!wesh%MwaYkoo$9;H3eci4thS(;VBLV`});}x& zaDKw~$Pg?$U>CCP??Cvlkc{;Ng{ERXdZyc;J955|uDa?qs+1f+d1O6GNAmDW2noDT z5jaIpU78P3c=8iBQ>)fwV>r@56F+v+fQAB1X&>59fm+t!bZq9(9ir+}$(Lj+HX1qO zm-<=Hjq8g4rk06}?%*fXXmOC=D?vLc&g=Vl)lWt)^P|paGSGxkH1(*GeM7Y?wlxu2 z-P`>Z@b41@JVs6l##{X;G^%>j=Wp#Bfx*A;7o+=7^vr_EZ&+U5wu|#7>xpx|+&HO} zxBs@EJNA-!SL$AI;zPTN>Q9g^8n=a{;k?djZH>mxR=j|S>YmwyBdqN;+hDy=L!`_& zA{GNJWOv@bW&a#Q@|x_wpRv3C7z~=wNm@jTa$Kns_$*Y9i#o&kM1l8oj`m?uw??PZ zkCMr_u8Ef7u2uN^^(^+x$LP0eS7h=tkMfK0V2rW3OV^}D4$8Gk=dOn{4nBr}2Xx1d zLa5>Bm^tFe3He-hCc3jiNDZdLfGf&H!vX6Kk6A7_8}`AVmP6CWsw)$!pW z5_i*^cyDJRFH7g%)%@gU%#yacF!P%w*{20d#FX|m*)Ij7H`*n67&=ej1K=5UAjYv3 z#|yQgW&4RsWF~)%M{D}-vk$A>@iXA;wdF7wK=azh(_*t&n#D#lH*L=iUXwpS!>VCO zsV_{ERICQ7Faj+@2l}P9EP>~Fp|7Rv$SJM&WEp;`+w~Hv?F?oso2AlVv6b(}H|Tyy zhskQO!EIXGtEvY)uad-2K+Q4^1QA6Z$)wPy->$N*4 zb#&;W`up!tySb~j=DlQ4e!$NnHi0hbT<)>EPR&%W`(Dbq_UMkML*7#V^L#w&`VY$32=dNDYpO`z4wfv&o0BInCY3n%-HDl$BUl& z^T)8hn)Q?RixOJ}f!SwSp>w>KLZ98)t4(T}z5{)g3b-ykyjfP=+WrfWJPbdgZ?aUq zKfI1DhQlV5pMmqx;0CDlbRS{s^Ngq{a`QBzejwXId@029^-F43Sbo_PuE@DTFQPC6de^QP zb&B`ZNP#T1d!9L#)>xkjNoRaffByP~2%t+Mk*m>ICNI)WRu{eqPsiRA)h{)?M^Jj6 zjnX=!-qCkQHm7Iu*bWMCKSt&JK8Jj{6jn2~o?+A8y+fqrcmfmuos_7AULZ7*Xwf{Mw1v6?^zDAX69?gz<_eqUFGPZT18T zlgaVC8PVS{cx&TeXK_W?VL9(B&d|{q2|r^Z7-i)@S_;~5X3TI!8+~ZF z7_c*Z%}QQ2Jn$~1$WKjgPuC-DQg|ZadaCy>iRb%#jvB!00FkbJb2hoyANAhK_XOdx`bE)N!VJ`t`sJ zFhrPvWEZFr1B+ZUeqz!p`$rD^%04(Xb*cnRCVhe;s>s}p-&|R*H6DzmL2(dU6ylTl zn&i=R{wp#{l^oY7s=6Et!{R0%Q%2;z;j7?;^wWM zBaO)?ZFHh9?sd0#hG)V7?}6v204G;J01HvvjmcyE6J9J)KlQgLKw zr}m0E(zZ^WRdJKiy{lbNt7mJ_IKTmOfk}UC{70d4z}74gU@38$qvemG0ZtKeVSEL~ z9nRN$zrXiVbBjU?Hlr@Q1*O*Y%g*dq9ffnS`z<-i-(6*8u1KmiAbG_DR$cD(~Q zLJlMeh%tyXqu~Ae>!XHu=u+<>pA;sY{eg#5E-BCcX!KtjKL@6A+xCudeBhcKCV@!7 z*$e&sODGUtk~n(Z{e`8reumbXEVZ{oWN-8po40+zKjGpaQNksZHJMHhfHh$pS|si> z$r`rd@^s3dys>5oN@sOxS*K=mOUw3rZv?>TF&Og|{3U^}D_oZm$|(@Wc!6D{!%;Rv z6^f59xbIe#zGl;Va|@{Z`Is@cRBp?> zL1Z_>LzB;pk&-urTf|eFtUUM&XF8klCd8BI z_Kf+j0Ye)aW6?g^h}ahi&{3a6%h{HScd@KdE~>Wy7rHRp~V{^-;4kT$aP$CSES%zp7lTVPz?u*;gqi;J*3f zTj;PNzB97)90#SaI~yTmWTDp<1YQDXVSDEYnUzZ_u9gRSzG_A zstOAUL32NxlaQ0cN}<`8QNN-=KK=)6p+kz5t{y`*m0AkqByM=E{5(FcJjN~ur#0bj zr7;;9{R4_gz+emH|2c5Y9KTvxlTfPKB~Q0wV&c5JP(hzKdj>H^?<+GgKlfJ` kUGX)R490MxTzf&@ALrs-WY;}=1qdTRr4+&CpNxY359m-RyZ`_I literal 0 HcmV?d00001