From 2fffa7917455a301445bfc2f15ae67ef4143083a Mon Sep 17 00:00:00 2001 From: cepthomas Date: Tue, 13 Nov 2018 11:52:08 -0600 Subject: [PATCH] Added template to create new VS2017 applications easily. --- INSTALL.md | 2 +- README.md | 8 ++++---- doc/README-Win.txt | 23 ++++++++++------------- doc/doxygen/filtering.txt | 2 +- doc/doxygen/information.txt | 6 +++--- doc/doxygen/polyvoices.txt | 2 +- doc/doxygen/usage.txt | 4 ++-- projects/stk-template.zip | Bin 0 -> 9512 bytes 8 files changed, 22 insertions(+), 25 deletions(-) create mode 100644 projects/stk-template.zip diff --git a/INSTALL.md b/INSTALL.md index ff52c9d..3a9c676 100644 --- a/INSTALL.md +++ b/INSTALL.md @@ -51,7 +51,7 @@ If you wish to use a different compiler than that selected by configure, specify ## Windows -MinGW support is provided in the configure script. In addition, Visual C++ 6.0 project files are included for each of the example STK projects, though these may not work with more recent versions of Visual Studio. +MinGW support is provided in the configure script. In addition, Visual Studio 2017 project files are included for each of the example STK projects. ##iOS diff --git a/README.md b/README.md index 3611c52..8b05222 100644 --- a/README.md +++ b/README.md @@ -63,7 +63,7 @@ against one of the fundamental design goals of the ToolKit - platform independence. For those instances where a simple GUI with sliders and buttons is -helpful, we use Tcl/Tk (http://dev.scriptics.com) which is freely +helpful, we use Tcl/Tk (https://www.tcl.tk/) which is freely distributed for all the supported ToolKit platforms. A number of Tcl/Tk GUI scripts are distributed with the ToolKit release. For control, the Synthesis Toolkit uses raw MIDI (on supported platforms), @@ -76,7 +76,7 @@ text message synthesis control format). See the individual README's (e.g. README-linux) in the /doc directory for platform specific information and system requirements. In general, you will use the configure script to create Makefiles on unix -platforms (and MinGW) or the VC++ workspace files to compile the +platforms (and MinGW) or the VS2017 workspace files to compile the example programs. To use the Tcl/Tk GUIs, you will need Tcl/Tk version 8.0 or higher. @@ -104,10 +104,10 @@ Md2Skini program. Realtime audio input capabilities were added to STK with release 3.0, though the behavior of such is very hardware dependent. Under Linux and Macintosh OS-X, audio input and output are possible with very low -latency. Using the Windoze DirectSound API, minimum dependable output +latency. Using the Windows DirectSound API, minimum dependable output sound latency seems to be around 20 milliseconds or so, while input sound latency is generally higher. Performance with the ASIO audio -API on Windoze provides much better performance. +API on Windows provides much better performance. As mentioned above, it is possible to record the audio ouput of an STK program to .snd, .wav, .raw, .aif, and .mat (Matlab MAT-file) output diff --git a/doc/README-Win.txt b/doc/README-Win.txt index 77a27ec..5c67a17 100644 --- a/doc/README-Win.txt +++ b/doc/README-Win.txt @@ -2,27 +2,24 @@ The Synthesis ToolKit in C++ (STK) By Perry R. Cook and Gary P. Scavone, 1995--2017. -Please read the file README for more general STK information. +Please read the file README.md for more general STK information. The configure script supports MinGW. -Alternatively Visual Studio may be used. The demo project contains a VS2017 build file - demo.sln. Note that if -you are creating a brand new VS project it's probably easiest to copy those .sln and .vcxproj files and manually -edit them to taste. -The other projects in the projects directories contain VS6 build files which cannot be used directly with VS2017. -However if you do want to use VS2017 there is an update process. -- Open the .dsw file with VS2017. -- Accept the one-way upgrade dialog. This will create new .sln and .vcxproj files. -- You will probably get a bad sdk version error. Right-click the solution, select Retarget solution and pick one. -- Open the project properties and select Debug configuration then C/C++ General tab. Set Debug Information Format - to Program Database (/Zi). -- Optionally in project properties you can disable warning 4996. +Alternatively Visual Studio may be used. The folders in the projects directory contain VS2017 solution files. +If you are creating a new stk application, it's easiest to use the supplied template: +- Copy stk\projects\stk-template.zip to C:\Users\\Documents\Visual Studio 2017\Templates\ProjectTemplates\Visual C++ Project\ +- Start VS2017. +- Select create new project... +- Select Visual C++. +- Select stk-template and enter your preferred project name and location. Note that if you do not put the project at the same level as stk\projects you will have to fix all paths in the project properties to match. +- The template is based on one of the projects in the examples directory. Add/remove files as needed and edit main.cpp to taste. To use the Tcl/Tk GUIs, you will have to install Tcl/Tk and build using MinGW. With Windows XP and later, piping works as under unix. Simply fire up the script files (e.g. StkDemo.bat) by either double-clicking on them or from within a shell. -The DirectSound, WASAPI and Steinberg ASIO audio APIs are supported for realtime audio input/output. The Visual C++ project files included with this distribution are configured to use all supported APIs. In order to use the ASIO API, it is necessary to use the preprocessor definition __WINDOWS_ASIO__, as well as include most of the files in the /src/include/ directory (i.e. asio.h, asio.cpp, ...). If you have a good quality soundcard and a native ASIO driver (not emulated), you are likely to get much better input/output response using that. +The DirectSound, WASAPI and Steinberg ASIO audio APIs are supported for realtime audio input/output. The VS2017 project files included with this distribution are configured to use all supported APIs. In order to use the ASIO API, it is necessary to use the preprocessor definition __WINDOWS_ASIO__, as well as include most of the files in the /src/include/ directory (i.e. asio.h, asio.cpp, ...). If you have a good quality soundcard and a native ASIO driver (not emulated), you are likely to get much better input/output response using that. When using the DirectSound API for audio input, latency can be high. If you experience realtime audio "stuttering", you should experiment with different "buffer size" and "number of buffers" values. diff --git a/doc/doxygen/filtering.txt b/doc/doxygen/filtering.txt index 67d689c..dac5578 100644 --- a/doc/doxygen/filtering.txt +++ b/doc/doxygen/filtering.txt @@ -33,7 +33,7 @@ The stk::Iir class implements the standard difference equation a[0]*y[n] = b[0]*x[n] + ... + b[nb]*x[n-nb] - a[1]*y[n-1] - ... - a[na]*y[n-na], \endcode -where "b" values are numerator coefficients and "a" values are denominator coefficients. Note that if the first denominator coefficient is not 1.0, the Iir class automatically normalizes all filter coefficients by that value. The coefficient values are passed to the Iir class via a C++ vector, a container object provided by the C++ Standard Library. +where "b" values are numerator coefficients and "a" values are denominator coefficients. Note that if the first denominator coefficient is not 1.0, the Iir class automatically normalizes all filter coefficients by that value. The coefficient values are passed to the Iir class via a C++ vector, a container object provided by the C++ Standard Library. Most STK classes use more specific types of digital filters, such as the stk::OneZero, stk::OnePole, stk::TwoPole, or stk::BiQuad varieties. These classes inherit from the stk::Filter abstract base class and provide specific functionality particular to their use, as well as functions to independently control individual coefficient values. diff --git a/doc/doxygen/information.txt b/doc/doxygen/information.txt index b331abd..01bb172 100644 --- a/doc/doxygen/information.txt +++ b/doc/doxygen/information.txt @@ -20,14 +20,14 @@ Here's a link to a book that includes an chapter on STK. The Synthesis ToolKit in C++ (STK) is a set of open source audio signal processing and algorithmic synthesis classes written in the C++ programming language. STK was designed to facilitate rapid development of music synthesis and audio processing software, with an emphasis on cross-platform functionality, realtime control, ease of use, and educational example code. The Synthesis ToolKit is extremely portable (it's mostly platform-independent C and C++ code), and it's completely user-extensible (all source included, no unusual libraries, and no hidden drivers). We like to think that this increases the chances that our programs will still work in another 5-10 years. In fact, the ToolKit has been working continuously for nearly 20 years now. STK currently runs with realtime support (audio and MIDI) on Linux, Macintosh OS X, and Windows computer platforms. Generic, non-realtime support has been tested under NeXTStep, Sun, and other platforms and should work with any standard C++ compiler. -The Synthesis ToolKit is free. The only parts of the Synthesis ToolKit that are platform-dependent concern real-time audio and MIDI input and output, and that is taken care of with a few special classes. The interface for MIDI input and the simple Tcl/Tk graphical user interfaces (GUIs) provided is the same, so it's easy to experiment in real time using either the GUIs or MIDI. The Synthesis ToolKit can generate simultaneous SND (AU), WAV, AIFF, and MAT-file output soundfile formats (as well as realtime sound output), so you can view your results using one of a large variety of sound/signal analysis tools already available (e.g. Snd, Cool Edit, Matlab). +The Synthesis ToolKit is free. The only parts of the Synthesis ToolKit that are platform-dependent concern real-time audio and MIDI input and output, and that is taken care of with a few special classes. The interface for MIDI input and the simple Tcl/Tk graphical user interfaces (GUIs) provided is the same, so it's easy to experiment in real time using either the GUIs or MIDI. The Synthesis ToolKit can generate simultaneous SND (AU), WAV, AIFF, and MAT-file output soundfile formats (as well as realtime sound output), so you can view your results using one of a large variety of sound/signal analysis tools already available (e.g. Snd, Cool Edit, Matlab).

What the Synthesis ToolKit is not.

The Synthesis Toolkit is not one particular program. Rather, it is a set of C++ classes that you can use to create your own programs. A few example applications are provided to demonstrate some of the ways to use the classes. If you have specific needs, you will probably have to either modify the example programs or write a new program altogether. Further, the example programs don't have a fancy GUI wrapper. It is easy to embed STK classes inside a GUI environment but we have chosen to focus our energy on the audio signal processing issues. Spending hundreds of hours making platform-dependent graphical user interfaces would go against one of the fundamental design goals of the ToolKit - platform independence. -For those instances where a simple GUI with sliders and buttons is helpful, we use Tcl/Tk (that is freely distributed for all the supported ToolKit platforms). A number of Tcl/Tk GUI scripts are distributed with the ToolKit release. For control, the Synthesis Toolkit uses raw MIDI (on supported platforms), and SKINI (Synthesis ToolKit Instrument Network Interface, a MIDI-like text message synthesis control format). +For those instances where a simple GUI with sliders and buttons is helpful, we use Tcl/Tk (that is freely distributed for all the supported ToolKit platforms). A number of Tcl/Tk GUI scripts are distributed with the ToolKit release. For control, the Synthesis Toolkit uses raw MIDI (on supported platforms), and SKINI (Synthesis ToolKit Instrument Network Interface, a MIDI-like text message synthesis control format).

A brief history of the Synthesis ToolKit in C++.

@@ -39,7 +39,7 @@ everything to C++ on SGI hardware, added real-time capabilities, and greatly expanded the synthesis techniques available. With the help of Bill Putnam, Perry also made a port of STK to Windows95. Gary Scavone began using STK extensively in the summer of 1997 and completed a full -port of STK to Linux early in 1998. He finished the fully compatable +port of STK to Linux early in 1998. He finished the fully compatible Windows port (using DirectSound API) in June 1998. Numerous improvements and extensions have been made since then. diff --git a/doc/doxygen/polyvoices.txt b/doc/doxygen/polyvoices.txt index 405da76..e232bc5 100644 --- a/doc/doxygen/polyvoices.txt +++ b/doc/doxygen/polyvoices.txt @@ -14,7 +14,7 @@ We have written this program to accept control messages from \c STDIN. Assuming threebees < scores/bachfugue.ski \endcode -For more fun, surf to Kern Scores for a huge assortment of other scorefiles that can be downloaded in the SKINI format. +For more fun, surf to Kern Scores for a huge assortment of other scorefiles that can be downloaded in the SKINI format. Another easy extension would be to add the \c stk::Messager::startMidiInput() function to the program and then play the instruments via a MIDI keyboard. diff --git a/doc/doxygen/usage.txt b/doc/doxygen/usage.txt index 74004ea..b322b40 100644 --- a/doc/doxygen/usage.txt +++ b/doc/doxygen/usage.txt @@ -94,7 +94,7 @@ All STK programs in this distribution take input control data in the form of Acquire realtime MIDI messages from a MIDI port on your computer. -Tcl/Tk graphical user interfaces (GUI) are provided with this distribution that can generate realtime SKINI messages. Note that the Messager class allows multiple simultaneous socket client connections, together with MIDI and/or piped input. The Md2Skini program (in the demo directory) is mostly obsolete but can be used to create SKINI scorefiles from realtime MIDI input. +Tcl/Tk graphical user interfaces (GUI) are provided with this distribution that can generate realtime SKINI messages. Note that the Messager class allows multiple simultaneous socket client connections, together with MIDI and/or piped input. The Md2Skini program (in the demo directory) is mostly obsolete but can be used to create SKINI scorefiles from realtime MIDI input. \section voices Demo: STK Instruments @@ -178,7 +178,7 @@ from the demo directory will play the scorefile bookert.ski \section tcl Realtime Control Input using Tcl/Tk Graphical User Interfaces: -There are a number of Tcl/Tk GUIs supplied with the STK projects. These scripts require Tcl/Tk version 8.0 or later, which can be downloaded for free over the WWW. On Unix and Windows2000/XP platforms, you can run the various executable scripts (e.g. StkDemo.bat) provided with each project to start everything up (you may need to symbolically link the wishXX executable to the name wish). The Physical.bat script just implements the following command-line sequence: +There are a number of Tcl/Tk GUIs supplied with the STK projects. These scripts require Tcl/Tk version 8.0 or later, which can be downloaded for free over the WWW. On Unix and Windows2000/XP platforms, you can run the various executable scripts (e.g. StkDemo.bat) provided with each project to start everything up (you may need to symbolically link the wishXX executable to the name wish). The Physical.bat script just implements the following command-line sequence: \code wish < tcl/Physical.tcl | stk-demo Clarinet -or -ip diff --git a/projects/stk-template.zip b/projects/stk-template.zip new file mode 100644 index 0000000000000000000000000000000000000000..3d76ff7844908fdafb926a2c9cc17969418189dd GIT binary patch literal 9512 zcmZ{K1yCK&vNsSU=m7#jgA?2W1a~>O26uON2$F-l1P|^`aCdhP?s9Mm&H>KjzVEyB z>i+A!-I|%*-s-NI*`Dd1{d;Lm6G<*X&^#?0^YGrh;G|JbB@ zkJH?=s>bf`6dRmeWRm(@8aUt4+?iH};?ZL4!C%=hN)-EH|Lm?_{2Ya_V^VcsQHaE$ z8mB2k@M6B&tFwcN%s@qA0b(lHubIBPV#3f2YWWn=qGEQz^$W>usYcxfK!q{I9htv^ zIpH*2YD3u?#XRgb9v`$WPLH;uR^9-63tAe=^af1ro+zq{0`A!14P|;2DCQc+ezu&N z1?+*Yrlk|>&%RgOHZF*IDAG|7w+!N!o-Na^+e_?rhMBA_j+ zm@_LMbMds{k^EZ8F?_E!bs^7!?JBd&qiWm02AsWCWU4I-dK7H?KsWS-hNC4zea>3D z(m)$2RK3nlh(6t0-C5!TLlk}rXNOyHXWe~GIYFhZy>7H~f_wh(Y(^8sG}ZA+el(_t zoG-?u#YOI#VDW&>lJSgu*%HDKSu4xZSi}B*>HpwQ+-G zM3ymg^^Z|GnfTZ8V4?TlYw(%)EntgLZ$^jGuw?t=Y1lkq*+EiqKYdCqn+3Z#msny| z=@>c#r3hwg<%V!{M;BjZjLW{jx+f`3yB&zu;?)9rvM2V&**(I0{yqngcq7g1nhcu8 zUdnI&xvMe89LvyS$EXgAGj_N~@OCF^sgcfwE4qmjPqXZx)mHo@?bQUB;RFf_?lV3w z`L3>U=Psf`lKUToE~n7HoB612M8&B!`2Q%=9eo5tlDg$O68OJ5$>6AotrOxqA2isV_-h>c5V6eJt7hW zSa&|q;=^{@ckIZTh6bs7^>T3hjsX|^Yzg1T<)d@Mg)>*~!Q4v;j{$}~5Gxs{_h#(4 z<5yQ`H2(AHPGtkq#bE3*d`g>KOpnz_rx3LsK~MWt<2`4wQfyiad5bx5U;=5`xf5JB zjT-fB9(H{BDb^1%GGUKc#<1cv+KfJri;c!JyYgj+@(GF=5|bX|^KGPteAH4Bms1Xn ziM|6q;o~cpv^(cAVY4z0`qH-QggJYDj|+rEBP9AtLlMw$QN*qRjml#NV|%YOz^glr zLe_`7cYbJI_3fWfiHUy@26@?*>D4uGz5lNnWt;d{JM69 zvC`9`5OknWy0I&vHidaF_1c}_iySFU#+DNAiw3fX0H zd=jEXAMDyh4_A-A*Hw32XBy#CgmW?ckaW;{?bNYg({=C}2y_~21p#pS%6GH)8rx~L zeIzeSo{{JZneYxgrjOi)-N##WEdPZR~4%Y)9=mg08(ThtG*ah`?nlDqbmJ}jZl!{j`fCvf!PMYz!3i*HiFsQ z%GTA)*`*_8-F}W0XXql{GnDq;Dm}J=PJu6)O_G{ki7z$C{cV`hKx3rUBYN_zC{&Vg zjqVrCMY|j|xtMPn&aQuvBlF~es zpTaU5tD^gEW-=JF@aa1dY4uJtoQ7D_bgSP!BmzgtXrUB8UNl_SBdp{*3M#Dx`fT;L zKfe>6jGBmAB$u6LYeJ57BZ~ALCW4zP=E*YIXw1Zn4kyJak+~1P(0UM=_6j=PRsLW@ zsM4Agj_LgAC$&p^;v?ceeZ514#1bC(15ahR&VHlV6!S&u1;}+yHI+>GF#3xyzEu)F zeji&JH2xw*AtKv9PJe8ZXq5Tnv%Nb1B7Y8b{)@rN2`SEmf58Vhf&|j5GxkLG%+~D> zJ`Ipl39Ow+5b(@P8(~)|8)e|&8n-{kwioAM2n50)!30v>J0=o)u|-n=EO@SV^uu;v zmBZ>pE~du`u);X7&D5eTdAMk>(hHRbxf5K14;X=qw`+`={sQ}qw-<{myR&>uiV|u> zKRq`1G8wLw6Ld4%)8zSznD3q)2JRVdwjGWxH~^q_#AaHm0BR+~mAt3SX!cI8oytIU zLe*={2Dnz;s21PpeqQ5QOHJ)!xm#(mG|L|@Ef3R{Cm960j^TKBHr_>D+7`NNVJu{4 zq?0nc9hkRuBB2}?Oi&{d+q!j*%N?hW5R*q1E!zc*!Bg#K-}$PE72p}69bbuCxgCNT z{0fY`c0k5Er0@pIzUfp3CWb1eymQGUU%sZkQ9&y%Np0aY5#wxUKA9COv=bv^(ghXh za(fGZtc(AbqSw2rr$fMh>MR3RDYO6{2Bz@M)p`G>vvx*S_RJ=Zj+JVgij-WKe!w07 zR29w@VfzoX8kq^A2*FY%x;)g|g)GC%nWlQ}cUgz2uA%;dJ=uvaV?oQ9ttn9(TALli1Z!5P~^v82&z78gd6s?GT6r3`RFW z!^3R^n&pzoIN*wAf3RQ-UnqsIH z6It{qi)I5k*ueBXY8wCMdzxYU@_x0C)r>12fc_7o4KAWLiRS>MYwn94>y?HfXA?UXH8H z%FrstZ%9L)9%_I+objO@KdrZ>l$hFa!UM5E{y3&|woun*w0m>Dhqob1IWPbhT2Q1- zKgAMBVK7XLq;%~#S;Vs-l|lPB*Iz1AKMpJU(y)riZJwYfJg@yUO$|L`$tZb0CmRC?5{Bg?Blim4^wWQD?Rk!udu`JJ*t=6wPqusW79{{+zc8x zTYFR)Wsh(|-OH97ph#5w2K`)jTzo{DdV<(VL4`YywjVOCbLND3-u_%9j_nuK(uWiN z8={XHYkt-#msWc&<&UIa1)55~p{zy4Nnj(RQ)<_;#Og8^#H3?jFCHAGrrVe$7kF{b zRBA}EkgD5$-9gC3WTuQ!Ww1mEqnJb;;OhuK(ISm4J>cO>kI#NTIi(1MSJl&VG5)CQ zPd5N%j5LYRWfd zTeU<6MmRe$kSp%-UcBvPiISg^=db(xD`puxk#d*JW@Xe@gnE^F068$xM%B@umLh-Z zA2TJ-I2rCXzX*T%5TKJ1V$tp!SgN-vANlC}QRu(I)eS7{POSIM-MnsFU(NB9ZfETe zvAef(364!J#oaIO96dSlc4P`nT)Z~#?@rnijY2?jKX|*bM5>t#VY-AiHUY={NSJQ< zH)8oZByq2It?^bz#c@>#KaTD-fp9YXu;GrH&y?X-B_>C7DYG`tC$buX!$$CDN|BMhnR8PmM#YY z-N74N9Q-uvSAIy+d2-=UE~?yD!gw|h0IvKvqZw)i3=H<$ zPG(^6?f;+8q)i;`nXOD5&h(IURTuBO$jMKYYv8mcO9zxSKIK%1A3w972umm{;RMsu z!^b7j3Mu=S;1p_y2%o?piD4?S#=SZ!!+%RIi7N>cO*Pg;-h+~0qQ9rYVinokcJaK} zaM|bp`<(k_z{4mBqjU$sCFF=<2dGZJRA{Xq;d{X-h#JdJWN}a}YQPFB*YI`d5eKBC z=YYNBg#-6KufS|wtsjjH!aQ^QRL%Mv_J|dbpfFFi-&jw=Zy{-a(c`WWf?!p}@pYm<>1C}-Gvwg-{C5iil%yTY zB3`Ypqrc(>&sT}lp(!rjMPl7y|a*5`2?YfD-RbL=mC;<1qO^I<2R+{q2R+~+zv_Jy=`8Wt9Vw6g8lhaGn-A0NIk zyRl@ZOl*viwT-2~bO%FBg}bv$+bZVPHTAZOR*%)yOpAs6)34QALG3yJv6L_3k!-!s1US21h}`V^ai{8 z`XV6RKRI(|hsNnu|vMkDqIip3j;-jQ{?)6>Z>FmPCl(UV#F9(b?mqD!~_#! z<&R+A>s#6sT{UTMywS~MkB_>%k&~(7X~$)9)?HKH*O#Z)&Woa%D(IuT90U=34JMn& zH;;*tbj}_qk+oM*F?W%-E*+Yc8c7)Csg-GBvu&rkdij4_qBr&$ zLX;ZR2_X(Ab3rYFL12?_e#(*qCCkwo>xwAP1?ImKJx_uQUv9l2GE z0t&`|+BP#XGX5L~$B&q{m2KAFM878LFQnq!T* zTeHr#^9^jjxh7n@|KvHCH=NV*g*MhdeH>Nc;)K(&p;FVlsITw-!*DqvZuh$ZN2TnG z4#KN^5GuFNCwQ(;G%qGt)xnM95NWhX_5v|g?Etsn;w2f}Kl^BIqttnbRe?1Fu#6LP zs@B6}q&~6~^twp1x{m^vb=;CqG(wsQz51*OlaH`#w^?YLa`0&!fZ=&mC{mQA9?y#K zt_DZa!KDKf!-i3WMYggiAG@OI_GIX@*le=3M@@4ympQwZ{I_Lc^-hGUzT!u-fWITI zlqv$F`r$VKj&|$b3_c4s8ySjyIIZyb)4`(j;>pv;r)zL|iAFFiq{zW??~2hkuXqS` zMGi40e&peNg22&5UI5j4jq&dYg?o)`q7Nng=WN`^ud&TNth}OwtirGct2zE&PC?^0 zeJF{N&cK@mA7=k>uKY{nN-Zj5paS+h`S-M=n+n|cT{JTt2A4k5+WL8OF<8euBsP`v6d7>^qb}x0QhYuS6=6 zVTNPbKQUa2eEW{~UXB6Fmx$Jn#@7-~gN;a^`-oV>?0mkO>CJZlcTekE2`EfVOn%$1 z^BOuh0PegzVf_95F>!Fm?9GGjSEBxMLco063DDdJU_BTj(-7P9pM|8h=rzS(gz06&M9@&QlWfVdU! zqEaaJWk(O$$?tZ+M`efq_K`{i^^wE((oaezKbN?kBer|Ec2?+(#mEbvFy{%l2JKvG74&A$>Z&24(}HyIzJlo7q7B zf-97=*ar(tUv&4y5v$=vEb0|J@8GG@bj)4YMIPLDf=WW*Zx7$o0~Ofpr&kRc1(4gn|zlMa!2eOvIPj#I);<&IvJS*#$i<^!jqHU4M6n_qDlC@zWEOKFQi&Z1&o$ z%gghwxEoxmystBS(N{OD&tyfz6?e@bnUq z@>@&zzSx}Q5*Q~x-7_}}R%NFXd+2@<*+9%+E^*G6u8_@JGxYxJy^$oP_Ph)+Jj<22 zxj?R7W>8GbFrrO(F6`bnc5tM)4C_R+YWRsowiafPBtLci{DJen(^dncP#fDY<3@PY zuWfHy&P~SnAZ_QSQv9GMu`$zgHLE1ki?9IYX^e^+7fr9=$ zMo20xAKNJP;ScdI%Z@AMW<tAA(76|c9k(dw zU&-3ZP>Xc_&SMKUM&`R{EN)V!(%x2gW<4waH63*w)uX;pfX9%cqC(;5ZiU4rOpjxb zNl<)jmLNuPZdL0bSbBtHQ|xTjg(i>b6OoKxT_xRRaTh}uzKH(dpDf`7BRNAqpPZbW zEiX*U!8D^g>%a$u;--?5GnbY_lfdvw%`i%~VSo25Q!=3Ok>ayoy*6E!dUO0^lD<%RlY5n6?N&b!u~y{Ft)b zXNt&)8}Hs~+s(YsbK8dHY1+og1CCMZ{Y-N6xB?}x!@z>86Lm2J<7OXH0=6_3EpE z{>YBBsbb5Y5mw!Jh!|}PU&1(D=Vvg?ZPeOB1fRTniBw0a)@0sdzpJK)@t9VL5%(C} z$JSVf;|A#9D4<@oCi13bt~LPN&84bb2}KU5U_*!9klky4p(sYFqP3{2lP+_%cAzYBV^^K`*~)e_iVWi3ZrjY|(Frogj|(15ewQ@tr&sn1 z*{0*>?E7u&H`t+-8VKXCTFrvlgdN10|aJC}A|k(J`&j9M^fZPXh*Z3JCg+jhlH0`)ZZDxIo4J_ ziYL!$pFnOqPmA60n4ITpxb8XCNa|1%06+Q~g>%as0^Ihak&tp$>Hk7ji9W$kJtfFi z%iDA);cDPo`gxbyT9R+28e&8ln}4k%WD2YF58dKp^lTv~dl`vM~EiQNKTQa%7_UZ>+Q-A#PO@cQlzi2N|zF(@BGLkyM}PhVMV zKi)ml*h*eTe)Q9S5=(mf5VN_t*%jF(`OIoRS(m*NI1`mk1Sx*na+$Ds{;TxcKLQXG zeXn{62+>m_eNR-K^YGZi9QH4oEVz1o^SvKD)bPQp1Arg)Ga+GVa&nS12>|Z-VzhgZ zf-s<%KeKdqcgGKQ(?t4%`?YhsAF#{D&c5s8@a`m{6#(BerPy}A_$JJW`?AkOTj`Ye znS|6F(v-R>3A26z3dUVN(o*OqHg zw8bZ+f3+AielY;axkroUD;LlD41XXBG^O{glR_YW!{_#c*cs-3O%c}f@N?*YPgeY+ z;{2)D8!7(Qe-Hm{2B9lg48NBty>UNtk}ZlAP%{54lfR|XvE^-)1VJ`*=FA#qIRzXD+17Q9O$nW!mY^{HRR{~8m~9Mgbvu!) ze94%yLcevf?ET$!VKFX#=3)w3nq)y#{++#O0YU7$HHWSLLdUTWyP z@^#c+VzYZ*nzD((+N*2JUVY8UA?y4@r}@_J&|Ut=b((Je1gG5WS!jNKK0+<&A3SPE zUtiz9o`9#Mov$o1FJRSEyuvF8-CZ9e{WVzWkAbpgmn7uXsN^n^p7JiT=;hrlm+~0! z6i*%kME!3<-k+(i#w!MEcZ%y+%fEPrLVuwr!JcO?&=bzKzfuufl!W20^zXxEUe>O2 z$fD+jYHzP2N->k3LPy1JyGrIaxw19VHD1~~8N8`Zz~HuY;3)LjPvfuS0<=YQ$sNGq zaI-KrJbZ{d1-IGf)n}*Zf7^G9HoqCV8uEHf${2%`99<6uI!}IZf9bvJ`VGncJw)1d z>(BhL;R!)cC^Y@84LqPF=NL7>-*u|xq#G^4C+&slJOOu5K{?Zw?Df>nx` z26wQllRB15x=CXv}sAsv1cH)Np@ z%+k=7i#KOck2Vxa`k%4IEVH@r3|JVLPj5&G?pth8-s|77MP_%Gf2V;Iev?<+WyS2M z?)U%AShe&6SKDg;K{yv1+jyq&7?;2T4v{A2)XE6@vQjx0gx&0T-OfeoAZS{n&6s;s zAxg$@+0)!uAf(lUBC|ob8j>JL?%u@%ctR$`)ikO1=vf%9xA8~jMfT!|iq+Bw*8(c{)XGU1zk#|!>n>u> zN>MNL-|1Fh?J|0pbvh2yRk?lN+`Nxe_{_e7+)3RC>=x4Pd1W@QlCZooWHK#%rrcW7 zl*&wU<)>+!aj=3WQoXXDvxp1#W&UM@9Ta1+Iu1LK5vx4G=iAp~APVqPa?Vh!j{f6h z5VJ5?L`z@Xe{=fUt}=3QY?)}4cFs!=S^V}S;Ql+z=oADX1wFrkUa)XDF#mTt&)YwJ zyU57?yZK*}d;TfmpJ4C*{B|6N396NlR~t+`j?2e{%gZ-2FdX qdFcOJ@cW