iem_utils-v0.0.20180206/DEVELOPER.md0000644000175000017500000000147712661077632016556 0ustar zmoelnigzmoelnigDeveloper information for iem_utils =================================== "iem_utils" is META-library that aggragates a number of small (dependency-free) libraries and GUI-plugins for Pd. All libraries are developped separately, and are included here by means of git-submodules. ## Checkout ~~~sh git clone https://git.iem.at/pd/iem_utils cd iem_utils git submodule update --init ~~~ ## Building There is a master Makefile that recursively builds all the libraries (that need building) ~~~sh make ~~~ ## Updating git-submodules are set to a specific commit (each) - rather than tracking a remote ("live") branch. The following brings all submodules up-to-date with their current 'master' branches. ~~~sh git submodule foreach git checkout master git submodule foreach git pull ~~~ ## Pushing changes in submodules TODO iem_utils-v0.0.20180206/Makefile0000644000175000017500000000205613236306545016336 0ustar zmoelnigzmoelnigsubprojects = iem_adaptfilt iem_dp iem_roomsim iem_spec2 iem_tab punish all: $(subprojects) .PHONY: all clean archive release submodule update dummy .PHONY: $(subprojects) library=iem_utils version=0.0.$(shell date +%Y%m%d) archivefile=$(library)-v$(version).tgz IEM_CFLAGS=-DPD $(CPPFLAGS) -fPIC $(CFLAGS) IEM_LDFLAGS=-export-dynamic -fPIC -shared $(LDFLAGS) clean: -find . -name "*.o" -delete -find . -name "*.pd_*" -delete -find . -name "*.dll" -delete -find . -name "*.tgz" -delete dummy: @echo -n archive: $(archivefile) release: $(archivefile) git tag -m "released iem_utils $(version)" "v$(version)" submodule: .gitmodules git submodule init git submodule update update: git submodule foreach git checkout master git submodule foreach git pull %.tgz: dummy -rm -f $@ tar --transform "s|^|$(@:.tgz=)/|" --exclude-vcs --exclude='.gitmodules' --exclude $@ -czf $@ * iem_adaptfilt punish: $(MAKE) -C $@ \ $(empty) iem_dp iem_roomsim iem_spec2 iem_tab: $(MAKE) -C $@/src -f makefile_linux \ CFLAGS="$(IEM_CFLAGS)" LDFLAGS="$(IEM_LDFLAGS)" iem_utils-v0.0.20180206/README.md0000644000175000017500000000257613004410431016143 0ustar zmoelnigzmoelnigiem - collection of utility libraries for Pure Data (Pd) ======================================================== This is a collection of (unrelated) external libraries for Pd, developed at the Institute of Electronic Music and Acoustics (iem) at the University of Music and Performing Arts Graz, Austria. # LICENSE Each library comes with their own license, but all are released under an open source license (GPL2+, BSD-3). # CONTENTS ## Pd libraries ### iem_adaptfilt adaptive filtering https://git.iem.at/pd/iem_adaptfilt ### iem_dp double precision https://git.iem.at/pd/iem_dp ### iem_roomsim room simulation https://git.iem.at/pd/iem_roomsim ### iem_spec2 optimized objects for spectral processing https://git.iem.at/pd/iem_spec2 ### iem_tab table maths https://git.iem.at/pd/iem_tab ## Pd GUI plugins ### kiosk-plugin run Pure Data in kiosk mode https://git.iem.at/pd-gui/kiosk-plugin ### patch2svg-plugin save patches as SVG https://git.iem.at/pd-gui/patch2svg-plugin ### tclprompt-plugin pd-gui plugin that (re)adds a wee tcl-prompt to the Pd-console https://git.iem.at/pd-gui/tclprompt-plugin ### punish/triggerize-plugin pd-gui plugin that helps avoiding fan-outs by inserting [trigger] as appropriate. https://git.iem.at/pd-gui/punish ### punish/patcherize-plugin pd-gui plugin that helps refactoring code into abstraction/subpatches. https://git.iem.at/pd-gui/punish iem_utils-v0.0.20180206/iem16/0000755000175000017500000000000013236307025015606 5ustar zmoelnigzmoelnigiem_utils-v0.0.20180206/iem16/tab16play~-help.pd0000644000175000017500000000333013236306553021066 0ustar zmoelnigzmoelnig#N canvas 159 54 804 495 10; #X msg 639 93 \; pd dsp 0; #X floatatom 11 342 0 0 0 0 - - -; #X msg 11 109 set array99; #X text 93 109 "set" message permits you to switch between arrays; #X text 138 228 creation argument initializes array name; #X obj 11 316 env~ 16384; #X obj 87 360 dac~ 1; #X obj 87 323 *~; #X obj 100 304 line~; #X msg 100 263 0.1 100; #X msg 116 284 0 100; #X text 162 264 on; #X text 157 283 off; #X text 148 301 envelope; #X text 148 312 generator; #X text 101 248 amplitude controls:; #X text 131 362 audio output; #X obj 87 342 hip~ 5; #X msg 26 179 0 44100; #X msg 27 158 44100; #X msg 26 138 bang; #X text 80 136 "bang" or 0 plays whole sample; #X text 82 157 play starting at 44100th sample; #X text 93 177 play starting at beginning for 44100 samples; #X msg 25 199 44100 1000; #X text 103 198 play from 44100 through 45099 (1000 samples); #X obj 589 205 table16 array99; #X text 389 444 updated for iem16 version1.0; #X obj 5 439 tab16write~; #X obj 5 458 tab16read4~; #X obj 89 458 tab16read; #X obj 89 439 tab16write; #X obj 166 439 tab16send~; #X obj 166 458 tab16receive~; #X obj 32 13 tab16play~; #X text 29 43 The [tab16play~] object is the same as the [tabplay~] object \, but it refers to 16bit-arrays stored in [table16] instead of floating-point arrays (stored in normal pd-tables/arrays); #X obj 328 444 table16; #X text 11 417 see also:; #X text 108 14 play a 16bit-table as a sample (non-transposing); #X obj 11 228 tab16play~ array99; #X connect 2 0 39 0; #X connect 5 0 1 0; #X connect 7 0 17 0; #X connect 8 0 7 1; #X connect 9 0 8 0; #X connect 10 0 8 0; #X connect 17 0 6 0; #X connect 18 0 39 0; #X connect 19 0 39 0; #X connect 20 0 39 0; #X connect 24 0 39 0; #X connect 39 0 5 0; #X connect 39 0 7 0; iem_utils-v0.0.20180206/iem16/iem16_delay.h0000644000175000017500000000227413236306553020070 0ustar zmoelnigzmoelnig/* copyleft (c) 2003 forum::für::umläute -- IOhannes m zmölnig @ IEM * based on d_array.c from pd: * Copyright (c) 1997-1999 Miller Puckette and others. * For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. */ #ifndef INCLUDE_IEM16_DELAY_H__ #define INCLUDE_IEM16_DELAY_H__ /* sampling */ #include "iem16.h" #include #if defined __WIN32 || defined __WIN32__ static int ugen_getsortno(void){return 0;} #else extern int ugen_getsortno(void); #endif t_class *sigdel16write_class; typedef struct del16writectl{ int c_n; t_iem16_16bit *c_vec; int c_phase; } t_del16writectl; typedef struct _sigdel16write{ t_object x_obj; t_symbol *x_sym; t_del16writectl x_cspace; int x_sortno; /* DSP sort number at which this was last put on chain */ int x_rsortno; /* DSP sort # for first del16read or write in chain */ int x_vecsize; /* vector size for del16read~ to use */ float x_f; } t_sigdel16write; void sigdel16write_checkvecsize(t_sigdel16write *x, int vecsize); # define XTRASAMPS 4 # define SAMPBLK 4 #define DEFDELVS 64 /* LATER get this from canvas at DSP time */ #endif iem_utils-v0.0.20180206/iem16/iem16.c0000644000175000017500000000357013236306562016705 0ustar zmoelnigzmoelnig/* ...this is a very IEM16 external ... it allows for 16bit-constructs where float would eat too much memory forum::für::umläute@IEM:2003 */ #include "iem16.h" /* do a little help thing */ typedef struct iem16 { t_object x_obj; } t_iem16; static t_class *iem16_class; static void *iem16_new(void){ t_iem16 *x = (t_iem16 *)pd_new(iem16_class); post("iem16: 16bit objects for low memory usage"); return(x); } /* include some externals */ void del16read_tilde_setup(); void del16write_tilde_setup(); void tab16play_tilde_setup(); void tab16read4_setup(); void tab16read4_tilde_setup(); void tab16read_setup(); void tab16read_tilde_setup(); void tab16receive_tilde_setup(); void tab16send_tilde_setup(); void tab16write_setup(); void tab16write_tilde_setup(); void table16_setup(); void vd16_tilde_setup(); void iem16_setup(void) { static unsigned int setupcount=0; if(setupcount>0) { post("iem16:\tsetup called several times, skipping..."); return; } setupcount++; del16read_tilde_setup(); del16write_tilde_setup(); tab16play_tilde_setup(); tab16read4_setup(); tab16read4_tilde_setup(); tab16read_setup(); tab16read_tilde_setup(); tab16receive_tilde_setup(); tab16send_tilde_setup(); tab16write_setup(); tab16write_tilde_setup(); table16_setup(); vd16_tilde_setup(); /* ************************************** */ post("iem16:\t16bit-objects for low memory usage"); post("iem16:\t(l) forum::für::umläute\t\tIOhannes m zmölnig"); post("iem16:\tInstitute of Electronic Music and Acoustics, Graz - iem"); post("iem16:\tcompiled: "__DATE__); iem16_class = class_new(gensym("iem16"), iem16_new, 0, sizeof(t_iem16), CLASS_NOINLET, 0); class_addcreator((t_newmethod)iem16_new, gensym("IEM16"), 0); } void IEM16_setup(void){ iem16_setup(); } iem_utils-v0.0.20180206/iem16/table16.c0000644000175000017500000001366313236306562017226 0ustar zmoelnigzmoelnig/* copyleft (c) 2003 forum::für::umläute -- IOhannes m zmölnig @ IEM * based on d_array.c from pd: * Copyright (c) 1997-1999 Miller Puckette and others. * For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. */ /* sampling */ #include "iem16_table.h" #include #include #include /* for read/write to files */ #if (defined(_MSC_VER) && (_MSC_VER > 600)) # define fdopen(fd,type) _fdopen(fd,type) #endif static int am_bigendian(void){ /* actually this should be in m_pd.h */ unsigned short s = 1; unsigned char c = *(char *)(&s); return (c==0); } static void table16_const(t_table16*x, t_float f); static void *table16_new(t_symbol *s, t_float f){ t_table16 *x = (t_table16*)pd_new(table16_class); int i=f; if(i<1)i=100; x->x_tablename=s; x->x_size=i; x->x_table=getbytes(x->x_size*sizeof(t_iem16_16bit)); x->x_usedindsp=0; pd_bind(&x->x_obj.ob_pd, x->x_tablename); x->x_canvas = canvas_getcurrent(); table16_const(x, 0); return(x); } static void table16_free(t_table16 *x){ if(x->x_table)freebytes(x->x_table, x->x_size*sizeof(t_iem16_16bit)); pd_unbind(&x->x_obj.ob_pd, x->x_tablename); } int table16_getarray16(t_table16*x, int*size,t_iem16_16bit**vec){ *size=x->x_size; *vec =x->x_table; return 1; } void table16_usedindsp(t_table16*x){ x->x_usedindsp=1; } static void table16_resize(t_table16*x, t_float f){ int i=f; int was=x->x_size; if (i<1){ error("can only resize to sizes >0"); return; } x->x_table=resizebytes(x->x_table, was*sizeof(t_iem16_16bit), i*sizeof(t_iem16_16bit)); if(i>was)memset(x->x_table+was, 0, (i-was)*sizeof(t_iem16_16bit)); x->x_size =i; if (x->x_usedindsp) canvas_update_dsp(); } static void table16_const(t_table16*x, t_float f){ t_iem16_16bit s = (t_iem16_16bit)f; int i = x->x_size; t_iem16_16bit*buf=x->x_table; while(i--)*buf++=s; } static void table16_from(t_table16*x, t_symbol*s, int argc, t_atom*argv){ float scale=IEM16_SCALE_UP; int resize=0; int startfrom=0, startto=0, endfrom=0, endto=x->x_size; t_garray *a=0; int npoints; t_word *vec=(0), *src=(0); t_iem16_16bit *dest; int i,length=0; if(argc<1 || argv->a_type!=A_SYMBOL){ error("you have to specify the from-table !"); return; } s=atom_getsymbol(argv); argc--;argv++; if (!(a = (t_garray *)pd_findbyclass(s, garray_class))){ error("%s: no such array", s->s_name); return; } else if (!garray_getfloatwords(a, &npoints, &vec)){ error("%s: bad template for tabread4", s->s_name); return; } if(argc>0 && atom_getsymbol(argv+argc-1)==gensym("resize")){ resize=1; argc--; } endfrom=npoints; switch(argc){ case 0:break; case 4: endto =atom_getfloat(argv+3); case 3: startto =atom_getfloat(argv+2); case 2: endfrom =atom_getfloat(argv+1); case 1: startfrom=atom_getfloat(argv); break; default: error("table16: from [ [ [ []]]] [resize]"); return; } if(startfrom<0)startfrom=0; if (startto<0)startto=0; if(endfrom<=startfrom)return; if(endto <=startto) return; length=endfrom-startfrom; if(resize){ if(x->x_size < (startto+length))table16_resize(x, startto+length); } else{ if(x->x_size < (startto+length))length=x->x_size-startto; } endfrom=startfrom+length; endto =startto+length; dest=x->x_table+startto; src =vec+startfrom; i=length; while(i--)*dest++=(*src++).w_float * scale; //post("from %s (%d, %d) --> (%d, %d)\tresize=%s", s->s_name, startfrom, endfrom, startto, endto, (resize)?"yes":"no"); } #define BINREADMODE "rb" #define BINWRITEMODE "wb" static void table16_read16(t_table16 *x, t_symbol *filename, t_symbol *endian, t_floatarg fskip) { int skip = fskip, filedesc; int i, nelem; t_iem16_16bit *vec; FILE *fd; char buf[MAXPDSTRING], *bufptr; short s; int cpubig = am_bigendian(), swap = 0; char c = endian->s_name[0]; if (c == 'b') { if (!cpubig) swap = 1; } else if (c == 'l') { if (cpubig) swap = 1; } else if (c) { error("array_read16: endianness is 'l' (low byte first ala INTEL)"); post("... or 'b' (high byte first ala MIPS,DEC,PPC)"); } if (!table16_getarray16(x, &nelem, &vec)) { error("%s: not a 16bit array", x->x_tablename->s_name); return; } if ((filedesc = open_via_path( canvas_getdir(x->x_canvas)->s_name, filename->s_name, "", buf, &bufptr, MAXPDSTRING, 1)) < 0 || !(fd = fdopen(filedesc, BINREADMODE)) ) { error("%s: can't open", filename->s_name); return; } if (skip) { long pos = fseek(fd, (long)skip, SEEK_SET); if (pos < 0) { error("%s: can't seek to byte %d", buf, skip); fclose(fd); return; } } for (i = 0; i < nelem; i++) { if (fread(&s, sizeof(s), 1, fd) < 1) { post("%s: read %d elements into table of size %d", filename->s_name, i, nelem); break; } if (swap) s = ((s & 0xff) << 8) | ((s & 0xff00) >> 8); vec[i] = s; } while (i < nelem) vec[i++] = 0; fclose(fd); } void table16_setup(void){ table16_class = class_new(gensym("table16"), (t_newmethod)table16_new, (t_method)table16_free, sizeof(t_table16), 0, A_DEFSYM, A_DEFFLOAT, 0); class_addmethod(table16_class, (t_method)table16_resize, gensym("resize"), A_DEFFLOAT, 0); class_addmethod(table16_class, (t_method)table16_const, gensym("const"), A_DEFFLOAT, 0); class_addmethod(table16_class, (t_method)table16_from, gensym("from"), A_GIMME, 0); class_addmethod(table16_class, (t_method)table16_read16, gensym("read16"), A_SYMBOL, A_DEFFLOAT, A_DEFSYM, 0); } void iem16_table_setup(void) { table16_setup(); } iem_utils-v0.0.20180206/iem16/build/0000755000175000017500000000000013236306553016712 5ustar zmoelnigzmoelnigiem_utils-v0.0.20180206/iem16/build/win-vs2003/0000755000175000017500000000000013236306553020442 5ustar zmoelnigzmoelnigiem_utils-v0.0.20180206/iem16/build/win-vs2003/iem16.vcproj0000644000175000017500000000737313236306553022622 0ustar zmoelnigzmoelnig iem_utils-v0.0.20180206/iem16/build/win-vs2003/iem16.sln0000644000175000017500000000134413236306553022103 0ustar zmoelnigzmoelnigMicrosoft Visual Studio Solution File, Format Version 8.00 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "iem16", "iem16.vcproj", "{C8DAED0C-AB39-4D01-976B-7E4E9E0E10DD}" ProjectSection(ProjectDependencies) = postProject EndProjectSection EndProject Global GlobalSection(SolutionConfiguration) = preSolution Release = Release EndGlobalSection GlobalSection(ProjectConfiguration) = postSolution {C8DAED0C-AB39-4D01-976B-7E4E9E0E10DD}.Release.ActiveCfg = Release|Win32 {C8DAED0C-AB39-4D01-976B-7E4E9E0E10DD}.Release.Build.0 = Release|Win32 EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution EndGlobalSection GlobalSection(ExtensibilityAddIns) = postSolution EndGlobalSection EndGlobal iem_utils-v0.0.20180206/iem16/build/win-vs6/0000755000175000017500000000000013236306553020223 5ustar zmoelnigzmoelnigiem_utils-v0.0.20180206/iem16/build/win-vs6/iem16.dsw0000755000175000017500000000106113236306553021664 0ustar zmoelnigzmoelnigMicrosoft Developer Studio Workspace File, Format Version 6.00 # WARNUNG: DIESE ARBEITSBEREICHSDATEI DARF NICHT BEARBEITET ODER GELÖSCHT WERDEN! ############################################################################### Project: "iem16"=.\iem16.dsp - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ }}} ############################################################################### Global: Package=<5> {{{ }}} Package=<3> {{{ }}} ############################################################################### iem_utils-v0.0.20180206/iem16/build/win-vs6/iem16.dsp0000755000175000017500000000571213236306553021664 0ustar zmoelnigzmoelnig# Microsoft Developer Studio Project File - Name="iem16" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** NICHT BEARBEITEN ** # TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 CFG=IEM16 - WIN32 RELEASE !MESSAGE Dies ist kein gültiges Makefile. Zum Erstellen dieses Projekts mit NMAKE !MESSAGE verwenden Sie den Befehl "Makefile exportieren" und führen Sie den Befehl !MESSAGE !MESSAGE NMAKE /f "iem16.mak". !MESSAGE !MESSAGE Sie können beim Ausführen von NMAKE eine Konfiguration angeben !MESSAGE durch Definieren des Makros CFG in der Befehlszeile. Zum Beispiel: !MESSAGE !MESSAGE NMAKE /f "iem16.mak" CFG="IEM16 - WIN32 RELEASE" !MESSAGE !MESSAGE Für die Konfiguration stehen zur Auswahl: !MESSAGE !MESSAGE "iem16 - Win32 Release" (basierend auf "Win32 (x86) Dynamic-Link Library") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 1 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" CPP=cl.exe MTL=midl.exe RSC=rc.exe # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "Release" # PROP BASE Intermediate_Dir "Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "" # PROP Intermediate_Dir "obj\" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "IEM16_EXPORTS" /YX /FD /c # ADD CPP /nologo /MT /W3 /GX /I "..\..\pd\src" /D "WIN32" /D "NT" /D "_WINDOWS" /D "IEM16" /FR /YX /FD /c # ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD MTL /nologo /win32 # SUBTRACT MTL /mktyplib203 # ADD BASE RSC /l 0xc07 /d "NDEBUG" # ADD RSC /l 0xc07 BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 # ADD LINK32 kernel32.lib wsock32.lib uuid.lib libc.lib oldnames.lib pd.lib /nologo /dll /machine:I386 /nodefaultlib /out:"..\iem16.dll" /libpath:"../../pd/bin" /export:iem16_setup # SUBTRACT LINK32 /pdb:none # Begin Target # Name "iem16 - Win32 Release" # Begin Group "Quellcodedateien" # PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" # Begin Source File SOURCE=.\iem16.c # End Source File # Begin Source File SOURCE=.\iem16_array.c # End Source File # Begin Source File SOURCE=.\iem16_array_tilde.c # End Source File # Begin Source File SOURCE=.\iem16_delay.c # End Source File # Begin Source File SOURCE=.\iem16_table.c # End Source File # End Group # Begin Group "Header-Dateien" # PROP Default_Filter "h;hpp;hxx;hm;inl" # Begin Source File SOURCE=.\iem16.h # End Source File # Begin Source File SOURCE=.\iem16_table.h # End Source File # Begin Source File SOURCE=..\..\pd\src\m_pd.h # End Source File # End Group # End Target # End Project iem_utils-v0.0.20180206/iem16/examples/0000755000175000017500000000000013236306553017431 5ustar zmoelnigzmoelnigiem_utils-v0.0.20180206/iem16/examples/tab16send~.pd0000644000175000017500000000126213236306553021744 0ustar zmoelnigzmoelnig#N canvas 151 91 705 277 12; #X text 113 26 writes one block of a signal continuously to an array ; #X text 41 60 creation argument: name of array; #X text 29 96 By default a block is 64 samples \; this can be reset using the block~ object.; #X text 376 239 updated for iem16 version1.0; #X obj 5 216 tab16write~; #X obj 5 235 tab16read4~; #X obj 109 235 tab16read; #X obj 109 216 tab16write; #X obj 204 216 tab16send~; #X obj 204 235 tab16receive~; #X obj 328 221 table16; #X text 17 195 see also:; #X text 14 137 16bit-signals are limited to 65536 values between -1.0..+1.0 ; #X text 16 157 if your signal has absolute values >1.0 \, these are wrapped around...; #X obj 11 27 tab16send~; iem_utils-v0.0.20180206/iem16/examples/del16write~.pd0000644000175000017500000000174213236306553022146 0ustar zmoelnigzmoelnig#N canvas 83 192 678 431 12; #X text 88 202 signal input; #X text 136 16 writes a signal in a delay line; #X text 281 235 1st argument: name of delay line; #X obj 24 203 sig~ 0; #X text 304 265 (= max. delay time); #X text 281 251 2nd argument: length of delay line in msec; #X text 24 292 see also:; #X obj 24 16 del16write~; #X obj 112 294 delread16~; #X obj 209 294 vd16~; #X text 16 353 similar pd-objects:; #X obj 201 352 delread~; #X obj 285 352 delwrite~; #X obj 378 352 vd~; #X obj 24 237 del16write~ del_line_xxx 500; #X text 21 51 This is very similar to the pd-object; #X text 49 81 It uses only 16bit to store the samples \, which will need only half of the memory of pd's floatingpoint-based object.; #X text 50 119 However \, there are 2 drawbacks: there will be some additional noise (because floats are more precise than 16bit) \, and you cannot have values>1 stored in the delay-line; #X obj 368 51 delwrite~; #X text 411 306 updated for iem16 version1.0; #X connect 3 0 14 0; iem_utils-v0.0.20180206/iem16/examples/table16.pd0000644000175000017500000000465513236306553021226 0ustar zmoelnigzmoelnig#N canvas 37 0 856 640 10; #X obj 30 21 table16; #X text 97 22 16bit-table; #X text 32 51 [table16] stores 16bit values. The normal pd-tables ([table] \, array) store the values as floating-points. While floating points are (often) more precise (this is of course not really true... \, esp. when comparing integer(4byte) to floating-point.) they use a lot of memory (4byte).; #X text 32 121 [table16] uses only 16bit (2bytes) to store the values \, which is half of the memory.; #X text 32 155 However there are 2 major drawbacks; #X text 53 172 a) less precision means less SNR - you can only store 65536 different values \, but this is what CD-quality is (should be good enough for most musical applications); #X text 55 221 b) the 65536 values (-32678..+32767) are mapped to -1.0..+1.0! This means you cannot store signals that exceed this magical limit. Please make sure \, that the signal has correct values (use [clip~]) or the unclipped values will get wrapped!; #X text 20 323 There are several objects to access the data of [table16]: ; #X obj 55 344 tab16write~; #X obj 55 363 tab16read4~; #X obj 279 363 tab16read; #X obj 279 344 tab16write; #X obj 164 344 tab16send~; #X obj 164 363 tab16receive~; #X obj 55 382 tab16read~; #X text 19 410 The message-objects [tab16read]/[tab16write] store the values directly (-32767..+32768) \, while the signal-objects convert the floats -1.0..+1.0 to the correct values or vice-versa.; #X text 270 21 updated for iem16 version1.0; #X msg 496 53 resize 100; #X obj 496 308 table16 array16 99; #N canvas 0 0 450 300 graph6 0; #X array array100 10 float 1; #A 0 1 2 3 4 5 6 7 8 9 0; #X coords 0 10 9 0 200 140 1; #X restore 477 452 graph; #X msg 478 409 \; array100 0 1 2 3 4 5 6 7 8 9; #X text 481 389 click to init float-array; #X msg 502 114 from array100; #X text 21 497 There is no beautiful graphical representation as with pd's arrays.; #X msg 508 139 from array100 resize; #X msg 516 190 from array100 20 30; #X msg 517 213 from array100 20 30 resize; #X msg 527 259 from array100 20 30 95; #X msg 527 279 from array100 20 30 95 resize; #X text 502 95 copy the data from a float-array; #X text 603 117 and resize the 16bit-array; #X text 513 173 copy floats (index20..30); #X text 653 192 and resize to 30-20; #X text 526 241 copy indexed values and insert at index95; #X connect 17 0 18 0; #X connect 22 0 18 0; #X connect 24 0 18 0; #X connect 25 0 18 0; #X connect 26 0 18 0; #X connect 27 0 18 0; #X connect 28 0 18 0; iem_utils-v0.0.20180206/iem16/examples/tab16read.pd0000644000175000017500000000154213236306553021531 0ustar zmoelnigzmoelnig#N canvas 245 143 703 316 12; #X text 62 102 index; #X floatatom 25 103 0 0 0 0 - - -; #X floatatom 25 199 0 0 0 0 - - -; #X text 70 197 output = array99[index]; #X text 189 157 creation argument; #X text 185 175 gives array name; #X msg 35 125 set array99; #X text 147 125 change array name; #X obj 25 165 tab16read array99; #X obj 422 131 table16 array99; #X obj 17 13 tab16read; #X text 412 257 updated for iem16 version1.0; #X obj 16 252 tab16write~; #X obj 16 271 tab16read4~; #X obj 120 271 tab16read; #X obj 120 252 tab16write; #X obj 217 252 tab16send~; #X obj 217 271 tab16receive~; #X obj 339 257 table16; #X text 108 15 - read numbers from a 16bit-table; #X text 21 42 since [table16] can only hold 16bit values \, the output of [tab16read] is limited to integer-values between -32768..+32767 ; #X connect 1 0 8 0; #X connect 6 0 8 0; #X connect 8 0 2 0; iem_utils-v0.0.20180206/iem16/examples/tab16play~.pd0000644000175000017500000000333013236306553021756 0ustar zmoelnigzmoelnig#N canvas 159 54 804 495 10; #X msg 639 93 \; pd dsp 0; #X floatatom 11 342 0 0 0 0 - - -; #X msg 11 109 set array99; #X text 93 109 "set" message permits you to switch between arrays; #X text 138 228 creation argument initializes array name; #X obj 11 316 env~ 16384; #X obj 87 360 dac~ 1; #X obj 87 323 *~; #X obj 100 304 line~; #X msg 100 263 0.1 100; #X msg 116 284 0 100; #X text 162 264 on; #X text 157 283 off; #X text 148 301 envelope; #X text 148 312 generator; #X text 101 248 amplitude controls:; #X text 131 362 audio output; #X obj 87 342 hip~ 5; #X msg 26 179 0 44100; #X msg 27 158 44100; #X msg 26 138 bang; #X text 80 136 "bang" or 0 plays whole sample; #X text 82 157 play starting at 44100th sample; #X text 93 177 play starting at beginning for 44100 samples; #X msg 25 199 44100 1000; #X text 103 198 play from 44100 through 45099 (1000 samples); #X obj 11 228 tab16play~ array99; #X obj 589 205 table16 array99; #X text 389 444 updated for iem16 version1.0; #X obj 5 439 tab16write~; #X obj 5 458 tab16read4~; #X obj 89 458 tab16read; #X obj 89 439 tab16write; #X obj 166 439 tab16send~; #X obj 166 458 tab16receive~; #X obj 32 13 tab16play~; #X text 29 43 The [tab16play~] object is the same as the [tabplay~] object \, but it refers to 16bit-arrays stored in [table16] instead of floating-point arrays (stored in normal pd-tables/arrays); #X obj 328 444 table16; #X text 11 417 see also:; #X text 108 14 play a 16bit-table as a sample (non-transposing); #X connect 2 0 26 0; #X connect 5 0 1 0; #X connect 7 0 17 0; #X connect 8 0 7 1; #X connect 9 0 8 0; #X connect 10 0 8 0; #X connect 17 0 6 0; #X connect 18 0 26 0; #X connect 19 0 26 0; #X connect 20 0 26 0; #X connect 24 0 26 0; #X connect 26 0 5 0; #X connect 26 0 7 0; iem_utils-v0.0.20180206/iem16/examples/tab16write~.pd0000644000175000017500000000200113236306553022135 0ustar zmoelnigzmoelnig#N canvas 119 134 697 433 10; #X msg 43 131 bang; #X obj 23 82 sig~ 3000; #X obj 23 110 phasor~; #X text 158 213 creation argument initializes array name; #X msg 40 181 set array99; #X msg 445 35 \; pd dsp 1; #X msg 524 37 \; pd dsp 0; #X text 85 133 bang to start recording; #X text 126 180 set the destination array; #X msg 43 153 stop; #X text 85 154 stop recording; #X text 385 366 updated for iem16 version1.0; #X obj 14 343 tab16write~; #X obj 14 362 tab16read4~; #X obj 118 362 tab16read; #X obj 118 343 tab16write; #X obj 213 343 tab16send~; #X obj 213 362 tab16receive~; #X obj 337 348 table16; #X text 26 322 see also:; #X obj 22 211 tab16write~ array99; #X obj 492 160 table16 array99; #X obj 31 27 tab16write~; #X text 120 27 object to write a 16bit-signal in an array; #X text 261 261 since [table16] can only hold 16bit-values \, the incoming signal (-1.0..+1.0) is stored as integer values -32768..+32767; #X connect 0 0 20 0; #X connect 1 0 2 0; #X connect 2 0 20 0; #X connect 4 0 20 0; #X connect 9 0 20 0; iem_utils-v0.0.20180206/iem16/examples/del16read~.pd0000644000175000017500000000267513236306553021735 0ustar zmoelnigzmoelnig#N canvas 24 20 800 531 12; #X text 372 274 1st argument: name of delay line; #X floatatom 116 253 0 0 0 0 - - -; #X text 151 255 float input (delay time in ms); #X text 127 310 signal output (delayed signal); #X floatatom 383 177 0 0 0 0 - - -; #X obj 116 375 snapshot~; #X floatatom 116 399 0 0 0 0 - - -; #X obj 24 246 loadbang; #X obj 24 313 metro 200; #X msg 32 273 \; pd dsp 1; #X text 424 176 input to delay line; #X obj 383 201 sig~; #X text 372 290 2nd argument: (initial) delay time in ms; #X text 36 443 see also:; #X obj 116 286 del16read~ del_example 1000; #X obj 383 226 del16write~ del_example 1000; #X obj 24 16 del16read~; #X obj 126 444 del16write~; #X obj 239 444 vd16~; #X text 133 14 - read a 16bit signal from a 16bit-delay line; #X obj 368 52 delread~; #X text 21 52 This is very similar to the pd-object; #X text 49 82 It uses only 16bit to store the samples \, which will need only half of the memory of pd's floatingpoint-based object.; #X text 50 120 However \, there are 2 drawbacks: there will be some additional noise (because floats are more precise than 16bit) \, and you cannot have values>1 stored in the delay-line; #X text 38 490 similar pd-objects:; #X obj 223 489 delread~; #X obj 307 489 delwrite~; #X obj 400 489 vd~; #X text 433 443 updated for iem16 version1.0; #X connect 1 0 14 0; #X connect 4 0 11 0; #X connect 5 0 6 0; #X connect 7 0 8 0; #X connect 7 0 9 0; #X connect 8 0 5 0; #X connect 11 0 15 0; #X connect 14 0 5 0; iem_utils-v0.0.20180206/iem16/examples/tab16read4~.pd0000644000175000017500000000253613236306553022017 0ustar zmoelnigzmoelnig#N canvas 59 33 741 466 10; #X text 21 207 signal input x(n); #X text 127 21 4-point-interpolating table lookup; #X obj 11 316 snapshot~; #X obj 30 290 metro 200; #X obj 11 124 sig~; #X floatatom 11 98 0 0 0 0 - - -; #X obj 30 264 r readout; #X floatatom 11 342 0 0 0 0 - - -; #X text 49 94 incoming signal is index. Indices should range from 1 to (size-2) so that the 4-point interpolation is meaningful. You can shift-drag the number box to see the effect of interpolation.; #X msg 34 158 set array99; #X text 116 158 "set" message permits you to switch between arrays ; #X text 149 228 creation argument initializes array name; #X obj 10 228 tab16read4~ array99; #X obj 460 301 table16 array99; #X text 395 400 updated for iem16 version1.0; #X obj 11 395 tab16write~; #X obj 11 414 tab16read4~; #X obj 95 414 tab16read; #X obj 95 395 tab16write; #X obj 172 395 tab16send~; #X obj 172 414 tab16receive~; #X obj 334 400 table16; #X obj 47 21 tab16read4~; #X text 7 51 tab16read4~ is used to build samplers and other table lookup algorithms. The interpolation scheme is 4-point polynomial. ; #X text 185 266 since [table16] can only hold 16bit-values \, the stored integer values -32768..+32767 are converted to floats -1.0..+1.0; #X connect 2 0 7 0; #X connect 3 0 2 0; #X connect 4 0 12 0; #X connect 5 0 4 0; #X connect 6 0 3 0; #X connect 9 0 12 0; #X connect 12 0 2 0; iem_utils-v0.0.20180206/iem16/examples/tab16write.pd0000644000175000017500000000162413236306553021751 0ustar zmoelnigzmoelnig#N canvas 44 17 653 456 12; #X floatatom 39 96 0 0 0 0 - - -; #X floatatom 176 170 0 0 0 0 - - -; #X text 208 192 creation argument; #X text 210 210 is array name; #X text 76 87 set y value; #X text 74 152 right inlet selects x value; #X msg 55 117 set array99; #X text 163 116 change array name; #X obj 39 195 tab16write array99; #X obj 31 27 tab16write; #X text 388 378 updated for iem16 version1.0; #X obj 17 355 tab16write~; #X obj 17 374 tab16read4~; #X obj 121 374 tab16read; #X obj 121 355 tab16write; #X obj 216 355 tab16send~; #X obj 216 374 tab16receive~; #X obj 340 360 table16; #X text 29 334 see also:; #X obj 438 156 table16 array99; #X text 133 28 write numbers to a 16bit-table; #X text 20 256 since [table16] can only hold 16bit-values \, the stored numbers have to be integer (ok \, we take care of this!) values between -32768..+32767.; #X connect 0 0 8 0; #X connect 1 0 8 1; #X connect 6 0 8 0; iem_utils-v0.0.20180206/iem16/examples/vd16~.pd0000644000175000017500000000240513236306553020735 0ustar zmoelnigzmoelnig#N canvas 88 40 717 480 12; #X floatatom 50 254 0 0 0 0 - - -; #X obj 50 347 outlet~; #X text 130 346 signal output (delayed signal); #X obj 50 282 sig~; #X text 99 279 signal input (delay time in ms); #X text 218 310 creation argument: name of delay line; #X text 35 400 see also:; #X obj 24 16 vd16~; #X text 77 10 reads a signal from a 16bit delay line at a variable delay time (4-point-interpolation); #X text 31 51 vd16~ implements a 4-point interpolating delay tap from a corresponding delwrite~ object. The delay in milliseconds of the tap is specified by the incoming signal.; #X obj 50 314 vd16~ del_example; #X text 16 433 similar pd-objects:; #X obj 201 432 delread~; #X obj 285 432 delwrite~; #X obj 378 432 vd~; #X obj 123 403 del16write~; #X obj 242 403 del16read~; #X text 411 386 updated for iem16 version1.0; #X text 28 116 This is very similar to the pd-object; #X text 56 137 It uses only 16bit to store the samples \, which will need only half of the memory of pd's floatingpoint-based object.; #X text 57 175 However \, there are 2 drawbacks: there will be some additional noise (because floats are more precise than 16bit) \, and you cannot have values>1 stored in the delay-line; #X obj 375 112 vd~; #X connect 0 0 3 0; #X connect 3 0 10 0; #X connect 10 0 1 0; iem_utils-v0.0.20180206/iem16/examples/tab16receive~.pd0000644000175000017500000000114413236306553022434 0ustar zmoelnigzmoelnig#N canvas 109 83 646 239 12; #X text 17 53 creation argument: name of array; #X text 16 83 By default a block is 64 samples \; this can be reset using the block~ object.; #X obj 21 18 tab16receive~; #X text 376 199 updated for iem16 version1.0; #X obj 5 176 tab16write~; #X obj 5 195 tab16read4~; #X obj 109 195 tab16read; #X obj 109 176 tab16write; #X obj 204 176 tab16send~; #X obj 204 195 tab16receive~; #X obj 328 181 table16; #X text 17 155 see also:; #X text 129 18 - read a block of a 16bit-signal from an array continuously ; #X text 10 129 16bit-signals are limited to 65536 values between -1.0..+1.0 ; iem_utils-v0.0.20180206/iem16/tab16play~.c0000644000175000017500000000673313236306562017771 0ustar zmoelnigzmoelnig/* copyleft (c) 2003 forum::für::umläute -- IOhannes m zmölnig @ IEM * based on d_array.c from pd: * Copyright (c) 1997-1999 Miller Puckette and others. * For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. */ /* tab16write~, tab16play~, tab16read~, tab16read4~, tab16send~, tab16receive~ */ #include "iem16_table.h" /* ------------ tab16play~ - non-transposing sample playback --------------- */ static t_class *tab16play_tilde_class; typedef struct _tab16play_tilde{ t_object x_obj; t_outlet *x_bangout; int x_phase; int x_nsampsintab; int x_limit; t_iem16_16bit *x_vec; t_symbol *x_arrayname; } t_tab16play_tilde; static void *tab16play_tilde_new(t_symbol *s){ t_tab16play_tilde *x = (t_tab16play_tilde *)pd_new(tab16play_tilde_class); x->x_phase = 0x7fffffff; x->x_limit = 0; x->x_arrayname = s; outlet_new(&x->x_obj, gensym("signal")); x->x_bangout = outlet_new(&x->x_obj, gensym("bang")); return (x); } static t_int *tab16play_tilde_perform(t_int *w){ t_tab16play_tilde *x = (t_tab16play_tilde *)(w[1]); t_float *out = (t_float *)(w[2]); t_iem16_16bit *fp; int n = (int)(w[3]), phase = x->x_phase, endphase = (x->x_nsampsintab < x->x_limit ? x->x_nsampsintab : x->x_limit), nxfer, n3; if (!x->x_vec || phase >= endphase) goto zero; nxfer = endphase - phase; fp = x->x_vec + phase; if (nxfer > n) nxfer = n; n3 = n - nxfer; phase += nxfer; while (nxfer--) *out++ = *fp++*IEM16_SCALE_DOWN; if (phase >= endphase) { x->x_phase = 0x7fffffff; while (n3--) *out++ = 0; } else x->x_phase = phase; return (w+4); zero: while (n--) *out++ = 0; return (w+4); } void tab16play_tilde_set(t_tab16play_tilde *x, t_symbol *s){ t_table16 *a; x->x_arrayname = s; if (!(a = (t_table16 *)pd_findbyclass(x->x_arrayname, table16_class))) { if (*s->s_name) pd_error(x, "tab16play~: %s: no such table16", x->x_arrayname->s_name); x->x_vec = 0; } else if (!table16_getarray16(a, &x->x_nsampsintab, &x->x_vec)) { error("%s: bad template for tab16play~", x->x_arrayname->s_name); x->x_vec = 0; } else table16_usedindsp(a); } static void tab16play_tilde_dsp(t_tab16play_tilde *x, t_signal **sp){ tab16play_tilde_set(x, x->x_arrayname); dsp_add(tab16play_tilde_perform, 3, x, sp[0]->s_vec, sp[0]->s_n); } static void tab16play_tilde_list(t_tab16play_tilde *x, t_symbol *s, int argc, t_atom *argv){ long start = atom_getfloatarg(0, argc, argv); long length = atom_getfloatarg(1, argc, argv); if (start < 0) start = 0; if (length <= 0)x->x_limit = 0x7fffffff; else x->x_limit = start + length; x->x_phase = start; } static void tab16play_tilde_stop(t_tab16play_tilde *x){ x->x_phase = 0x7fffffff; } void tab16play_tilde_setup(void){ tab16play_tilde_class = class_new(gensym("tab16play~"), (t_newmethod)tab16play_tilde_new, 0, sizeof(t_tab16play_tilde), 0, A_DEFSYM, 0); class_addmethod(tab16play_tilde_class, (t_method)tab16play_tilde_dsp, gensym("dsp"), 0); class_addmethod(tab16play_tilde_class, (t_method)tab16play_tilde_stop, gensym("stop"), 0); class_addmethod(tab16play_tilde_class, (t_method)tab16play_tilde_set, gensym("set"), A_DEFSYM, 0); class_addlist(tab16play_tilde_class, tab16play_tilde_list); } iem_utils-v0.0.20180206/iem16/iem16.h0000644000175000017500000000643713236307025016712 0ustar zmoelnigzmoelnig/* ********************************************** */ /* the IEM16 external */ /* ********************************************** */ /* forum::für::umläute */ /* ********************************************** */ /* the IEM16 external is a runtime-library for miller s. puckette's realtime-computermusic-software "pure data" * therefore you NEED "pure data" to make any use of the IEM16 external * (except if you want to use the code for other things) * download "pure data" at https://puredata.info * if you are looking for the latest release of the IEM16-external you should have another look at https://git.iem.at/pd/iem16 * * IEM16 is published under the GNU GeneralPublicLicense, that must be shipped with IEM16. * if you are using Debian GNU/linux, the GNU-GPL can be found under /usr/share/common-licenses/GPL * if you still haven't found a copy of the GNU-GPL, have a look at http://www.gnu.org * * "pure data" has it's own license, that comes shipped with "pure data". * * there are ABSOLUTELY NO WARRANTIES for anything */ #ifndef INCLUDE_IEM16_H__ #define INCLUDE_IEM16_H__ #include "m_pd.h" typedef short t_iem16_16bit; #define IEM16_SCALE_UP (32767) #define IEM16_SCALE_DOWN (1./32767) #define VERSION "1.1" #define UNITBIT32 1572864. /* 3*2^19; bit 32 has place value 1 */ /* machine-dependent definitions. These ifdefs really should have been by CPU type and not by operating system! */ #ifdef __irix__ /* big-endian. Most significant byte is at low address in memory */ # define HIOFFSET 0 /* word offset to find MSB */ # define LOWOFFSET 1 /* word offset to find LSB */ # define int32 long /* a data type that has 32 bits */ #elif defined __WIN32__ /* little-endian; most significant byte is at highest address */ # define HIOFFSET 1 # define LOWOFFSET 0 # define int32 long #elif defined __FreeBSD__ # include # if BYTE_ORDER == LITTLE_ENDIAN # define HIOFFSET 1 # define LOWOFFSET 0 # else # define HIOFFSET 0 /* word offset to find MSB */ # define LOWOFFSET 1 /* word offset to find LSB */ # endif /* BYTE_ORDER */ # include # define int32 int32_t #elif defined __linux__ # include # if !defined(__BYTE_ORDER) || !defined(__LITTLE_ENDIAN) # error No byte order defined # endif # if __BYTE_ORDER == __LITTLE_ENDIAN # define HIOFFSET 1 # define LOWOFFSET 0 # else # define HIOFFSET 0 /* word offset to find MSB */ # define LOWOFFSET 1 /* word offset to find LSB */ # endif /* __BYTE_ORDER */ # include # define int32 int32_t #elif defined __APPLE__ # ifdef __BIG_ENDIAN__ # define HIOFFSET 0 /* word offset to find MSB */ # define LOWOFFSET 1 /* word offset to find LSB */ # else # define HIOFFSET 1 # define LOWOFFSET 0 # endif # define int32 int /* a data type that has 32 bits */ #endif /* system */ #endif iem_utils-v0.0.20180206/iem16/tab16read.c0000644000175000017500000000325013236306562017530 0ustar zmoelnigzmoelnig/* copyleft (c) 2003 forum::für::umläute -- IOhannes m zmölnig @ IEM * based on d_array.c from pd: * Copyright (c) 1997-1999 Miller Puckette and others. * For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. */ /* tab16read, tab16read4, tab16write */ #include "iem16_table.h" /* ---------- tab16read: control, non-interpolating ------------------------ */ static t_class *tab16read_class; typedef struct _tab16read{ t_object x_obj; t_symbol *x_arrayname; } t_tab16read; static void tab16read_float(t_tab16read *x, t_float f){ t_table16 *a; int npoints; t_iem16_16bit *vec; if (!(a = (t_table16 *)pd_findbyclass(x->x_arrayname, table16_class))) error("%s: no such table16", x->x_arrayname->s_name); else if (!table16_getarray16(a, &npoints, &vec)) error("%s: bad template for tab16read", x->x_arrayname->s_name); else { int n = f; if (n < 0) n = 0; else if (n >= npoints) n = npoints - 1; outlet_float(x->x_obj.ob_outlet, (npoints ? vec[n] : 0)); } } static void tab16read_set(t_tab16read *x, t_symbol *s){ x->x_arrayname = s; } static void *tab16read_new(t_symbol *s){ t_tab16read *x = (t_tab16read *)pd_new(tab16read_class); x->x_arrayname = s; outlet_new(&x->x_obj, gensym("float")); return (x); } void tab16read_setup(void){ tab16read_class = class_new(gensym("tab16read"), (t_newmethod)tab16read_new, 0, sizeof(t_tab16read), 0, A_DEFSYM, 0); class_addfloat(tab16read_class, (t_method)tab16read_float); class_addmethod(tab16read_class, (t_method)tab16read_set, gensym("set"), A_SYMBOL, 0); } iem_utils-v0.0.20180206/iem16/tab16read4~.c0000644000175000017500000000606313236306562020017 0ustar zmoelnigzmoelnig/* copyleft (c) 2003 forum::für::umläute -- IOhannes m zmölnig @ IEM * based on d_array.c from pd: * Copyright (c) 1997-1999 Miller Puckette and others. * For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. */ /* tab16write~, tab16play~, tab16read~, tab16read4~, tab16send~, tab16receive~ */ #include "iem16_table.h" /******************** tab16read4~ ***********************/ static t_class *tab16read4_tilde_class; typedef struct _tab16read4_tilde{ t_object x_obj; int x_npoints; t_iem16_16bit *x_vec; t_symbol *x_arrayname; float x_f; } t_tab16read4_tilde; static void *tab16read4_tilde_new(t_symbol *s){ t_tab16read4_tilde *x = (t_tab16read4_tilde *)pd_new(tab16read4_tilde_class); x->x_arrayname = s; x->x_vec = 0; outlet_new(&x->x_obj, gensym("signal")); x->x_f = 0; return (x); } static t_int *tab16read4_tilde_perform(t_int *w){ t_tab16read4_tilde *x = (t_tab16read4_tilde *)(w[1]); t_float *in = (t_float *)(w[2]); t_float *out = (t_float *)(w[3]); int n = (int)(w[4]); int maxindex; t_iem16_16bit *buf = x->x_vec; t_iem16_16bit *fp; int i; maxindex = x->x_npoints - 3; if (!buf) goto zero; for (i = 0; i < n; i++) { float findex = *in++; int index = findex; float frac, a, b, c, d, cminusb; if (index < 1) index = 1, frac = 0; else if (index > maxindex) index = maxindex, frac = 1; else frac = findex - index; fp = buf + index; a = fp[-1]*IEM16_SCALE_DOWN; b = fp[0]*IEM16_SCALE_DOWN; c = fp[1]*IEM16_SCALE_DOWN; d = fp[2]*IEM16_SCALE_DOWN; cminusb = c-b; *out++ = b + frac * (cminusb - 0.5f * (frac-1.) * ((a - d + 3.0f * cminusb) * frac + (b - a - cminusb))); } return (w+5); zero: while (n--) *out++ = 0; return (w+5); } void tab16read4_tilde_set(t_tab16read4_tilde *x, t_symbol *s){ t_table16 *a; x->x_arrayname = s; if (!(a = (t_table16 *)pd_findbyclass(x->x_arrayname, table16_class))) { if (*s->s_name) error("tab16read4~: %s: no such table16", x->x_arrayname->s_name); x->x_vec = 0; } else if (!table16_getarray16(a, &x->x_npoints, &x->x_vec)) { error("%s: bad template for tab16read4~", x->x_arrayname->s_name); x->x_vec = 0; } else table16_usedindsp(a); } static void tab16read4_tilde_dsp(t_tab16read4_tilde *x, t_signal **sp){ tab16read4_tilde_set(x, x->x_arrayname); dsp_add(tab16read4_tilde_perform, 4, x, sp[0]->s_vec, sp[1]->s_vec, sp[0]->s_n); } void tab16read4_tilde_setup(void){ tab16read4_tilde_class = class_new(gensym("tab16read4~"), (t_newmethod)tab16read4_tilde_new, 0, sizeof(t_tab16read4_tilde), 0, A_DEFSYM, 0); CLASS_MAINSIGNALIN(tab16read4_tilde_class, t_tab16read4_tilde, x_f); class_addmethod(tab16read4_tilde_class, (t_method)tab16read4_tilde_dsp, gensym("dsp"), 0); class_addmethod(tab16read4_tilde_class, (t_method)tab16read4_tilde_set, gensym("set"), A_SYMBOL, 0); } iem_utils-v0.0.20180206/iem16/vd16~.c0000644000175000017500000000562713236306562016747 0ustar zmoelnigzmoelnig/* copyleft (c) 2003 forum::für::umläute -- IOhannes m zmölnig @ IEM * based on d_delay.c from pd: * Copyright (c) 1997-1999 Miller Puckette. * For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. */ /* del16read~, del16write~, vd16~ */ #include "iem16_delay.h" /* ----------------------------- vd~ ----------------------------- */ static t_class *sig16vd_class; typedef struct _sig16vd{ t_object x_obj; t_symbol *x_sym; t_float x_sr; /* samples per msec */ int x_zerodel; /* 0 or vecsize depending on read/write order */ float x_f; } t_sig16vd; static void *sig16vd_new(t_symbol *s){ t_sig16vd *x = (t_sig16vd *)pd_new(sig16vd_class); if (!*s->s_name) s = gensym("vd~"); x->x_sym = s; x->x_sr = 1; x->x_zerodel = 0; outlet_new(&x->x_obj, gensym("signal")); x->x_f = 0; return (x); } static t_int *sig16vd_perform(t_int *w){ t_float *in = (t_float *)(w[1]); t_float *out = (t_float *)(w[2]); t_del16writectl *ctl = (t_del16writectl *)(w[3]); t_sig16vd *x = (t_sig16vd *)(w[4]); int n = (int)(w[5]); int nsamps = ctl->c_n; float limit = nsamps - n - 1; float fn = n-4; t_iem16_16bit *vp = ctl->c_vec, *bp, *wp = vp + ctl->c_phase; float zerodel = x->x_zerodel; while (n--) { float delsamps = x->x_sr * *in++ - zerodel, frac; int idelsamps; float a, b, c, d, cminusb; if (delsamps < 1.00001f) delsamps = 1.00001f; if (delsamps > limit) delsamps = limit; delsamps += fn; fn = fn - 1.0f; idelsamps = delsamps; frac = delsamps - (float)idelsamps; bp = wp - (idelsamps + 3); if (bp < vp + 4) bp += nsamps; d = bp[-3]*IEM16_SCALE_DOWN; c = bp[-2]*IEM16_SCALE_DOWN; b = bp[-1]*IEM16_SCALE_DOWN; a = bp[00]*IEM16_SCALE_DOWN; cminusb = c-b; *out++ = b + frac * (cminusb - 0.5f * (frac-1.) * ((a - d + 3.0f * cminusb) * frac + (b - a - cminusb))); } return (w+6); } static void sig16vd_dsp(t_sig16vd *x, t_signal **sp){ t_sigdel16write *delwriter = (t_sigdel16write *)pd_findbyclass(x->x_sym, sigdel16write_class); x->x_sr = sp[0]->s_sr * 0.001; if (delwriter) { sigdel16write_checkvecsize(delwriter, sp[0]->s_n); x->x_zerodel = (delwriter->x_sortno == ugen_getsortno() ? 0 : delwriter->x_vecsize); dsp_add(sig16vd_perform, 5, sp[0]->s_vec, sp[1]->s_vec, &delwriter->x_cspace, x, sp[0]->s_n); } else error("vd~: %s: no such del16write~",x->x_sym->s_name); } static void sig16vd_setup(void){ sig16vd_class = class_new(gensym("vd16~"), (t_newmethod)sig16vd_new, 0, sizeof(t_sig16vd), 0, A_DEFSYM, 0); class_addmethod(sig16vd_class, (t_method)sig16vd_dsp, gensym("dsp"), 0); CLASS_MAINSIGNALIN(sig16vd_class, t_sig16vd, x_f); } // G.Holzmann: for PD-extended build system void vd16_tilde_setup(void) { sig16vd_setup(); } iem_utils-v0.0.20180206/iem16/tab16receive~.c0000644000175000017500000000414313236306562020437 0ustar zmoelnigzmoelnig/* copyleft (c) 2003 forum::für::umläute -- IOhannes m zmölnig @ IEM * based on d_array.c from pd: * Copyright (c) 1997-1999 Miller Puckette and others. * For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. */ /* tab16write~, tab16play~, tab16read~, tab16read4~, tab16send~, tab16receive~ */ #include "iem16_table.h" /* ------------------------ tab16receive~ ------------------------- */ static t_class *tab16receive_class; typedef struct _tab16receive{ t_object x_obj; t_iem16_16bit *x_vec; t_symbol *x_arrayname; } t_tab16receive; static t_int *tab16receive_perform(t_int *w){ t_tab16receive *x = (t_tab16receive *)(w[1]); t_float *out = (t_float *)(w[2]); int n = w[3]; t_iem16_16bit *from = x->x_vec; if (from) while (n--) *out++ = *from++*IEM16_SCALE_DOWN; else while (n--) *out++ = 0; return (w+4); } static void tab16receive_dsp(t_tab16receive *x, t_signal **sp){ t_table16 *a; int vecsize; if (!(a = (t_table16 *)pd_findbyclass(x->x_arrayname, table16_class))) { if (*x->x_arrayname->s_name) error("tab16send~: %s: no such table16", x->x_arrayname->s_name); } else if (!table16_getarray16(a, &vecsize, &x->x_vec)) error("%s: bad template for tab16receive~", x->x_arrayname->s_name); else { int n = sp[0]->s_n; if (n < vecsize) vecsize = n; table16_usedindsp(a); dsp_add(tab16receive_perform, 3, x, sp[0]->s_vec, vecsize); } } static void *tab16receive_new(t_symbol *s){ t_tab16receive *x = (t_tab16receive *)pd_new(tab16receive_class); x->x_arrayname = s; outlet_new(&x->x_obj, gensym("signal")); return (x); } static void tab16receive_setup(void){ tab16receive_class = class_new(gensym("tab16receive~"), (t_newmethod)tab16receive_new, 0, sizeof(t_tab16receive), 0, A_DEFSYM, 0); class_addmethod(tab16receive_class, (t_method)tab16receive_dsp, gensym("dsp"), 0); } // G.Holzmann: for PD-extended build system void tab16receive_tilde_setup(void) { tab16receive_setup(); } iem_utils-v0.0.20180206/iem16/tab16read4~-help.pd0000644000175000017500000000253613236306553021127 0ustar zmoelnigzmoelnig#N canvas 59 33 741 466 10; #X text 21 207 signal input x(n); #X text 127 21 4-point-interpolating table lookup; #X obj 11 316 snapshot~; #X obj 30 290 metro 200; #X obj 11 124 sig~; #X floatatom 11 98 0 0 0 0 - - -; #X obj 30 264 r readout; #X floatatom 11 342 0 0 0 0 - - -; #X text 49 94 incoming signal is index. Indices should range from 1 to (size-2) so that the 4-point interpolation is meaningful. You can shift-drag the number box to see the effect of interpolation.; #X msg 34 158 set array99; #X text 116 158 "set" message permits you to switch between arrays ; #X text 149 228 creation argument initializes array name; #X obj 460 301 table16 array99; #X text 395 400 updated for iem16 version1.0; #X obj 11 395 tab16write~; #X obj 11 414 tab16read4~; #X obj 95 414 tab16read; #X obj 95 395 tab16write; #X obj 172 395 tab16send~; #X obj 172 414 tab16receive~; #X obj 334 400 table16; #X obj 47 21 tab16read4~; #X text 7 51 tab16read4~ is used to build samplers and other table lookup algorithms. The interpolation scheme is 4-point polynomial. ; #X text 185 266 since [table16] can only hold 16bit-values \, the stored integer values -32768..+32767 are converted to floats -1.0..+1.0; #X obj 10 228 tab16read4~ array99; #X connect 2 0 7 0; #X connect 3 0 2 0; #X connect 4 0 24 0; #X connect 5 0 4 0; #X connect 6 0 3 0; #X connect 9 0 24 0; #X connect 24 0 2 0; iem_utils-v0.0.20180206/iem16/del16read~.c0000644000175000017500000000633113236306562017727 0ustar zmoelnigzmoelnig/* copyleft (c) 2003 forum::für::umläute -- IOhannes m zmölnig @ IEM * based on d_delay.c from pd: * Copyright (c) 1997-1999 Miller Puckette. * For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. */ /* del16read~, del16write~, vd16~ */ #include "iem16_delay.h" /* ----------------------------- del16read~ ----------------------------- */ static t_class *sigdel16read_class; typedef struct _sigdel16read{ t_object x_obj; t_symbol *x_sym; t_float x_deltime; /* delay in msec */ int x_delsamps; /* delay in samples */ t_float x_sr; /* samples per msec */ t_float x_n; /* vector size */ int x_zerodel; /* 0 or vecsize depending on read/write order */ } t_sigdel16read; static void sigdel16read_16bit(t_sigdel16read *x, t_float f); static void *sigdel16read_new(t_symbol *s, t_floatarg f){ t_sigdel16read *x = (t_sigdel16read *)pd_new(sigdel16read_class); x->x_sym = s; x->x_sr = 1; x->x_n = 1; x->x_zerodel = 0; sigdel16read_16bit(x, f); outlet_new(&x->x_obj, gensym("signal")); return (x); } static void sigdel16read_16bit(t_sigdel16read *x, t_float f){ t_sigdel16write *delwriter = (t_sigdel16write *)pd_findbyclass(x->x_sym, sigdel16write_class); x->x_deltime = f; if (delwriter) { x->x_delsamps = (int)(0.5 + x->x_sr * x->x_deltime) + x->x_n - x->x_zerodel; if (x->x_delsamps < x->x_n) x->x_delsamps = x->x_n; else if (x->x_delsamps > delwriter->x_cspace.c_n - DEFDELVS) x->x_delsamps = delwriter->x_cspace.c_n - DEFDELVS; } } static t_int *sigdel16read_perform(t_int *w){ t_float *out = (t_float *)(w[1]); t_del16writectl *c = (t_del16writectl *)(w[2]); int delsamps = *(int *)(w[3]); int n = (int)(w[4]); int phase = c->c_phase - delsamps, nsamps = c->c_n; t_iem16_16bit *vp = c->c_vec, *bp, *ep = vp + (c->c_n + XTRASAMPS); if (phase < 0) phase += nsamps; bp = vp + phase; while (n--) { *out++ = *bp++*IEM16_SCALE_DOWN; if (bp == ep) bp -= nsamps; } return (w+5); } static void sigdel16read_dsp(t_sigdel16read *x, t_signal **sp){ t_sigdel16write *delwriter = (t_sigdel16write *)pd_findbyclass(x->x_sym, sigdel16write_class); x->x_sr = sp[0]->s_sr * 0.001; x->x_n = sp[0]->s_n; if (delwriter) { sigdel16write_checkvecsize(delwriter, sp[0]->s_n); x->x_zerodel = (delwriter->x_sortno == ugen_getsortno() ? 0 : delwriter->x_vecsize); sigdel16read_16bit(x, x->x_deltime); dsp_add(sigdel16read_perform, 4, sp[0]->s_vec, &delwriter->x_cspace, &x->x_delsamps, sp[0]->s_n); } else if (*x->x_sym->s_name) error("delread~: %s: no such del16write~",x->x_sym->s_name); } static void sigdel16read_setup(void){ sigdel16read_class = class_new(gensym("del16read~"), (t_newmethod)sigdel16read_new, 0, sizeof(t_sigdel16read), 0, A_DEFSYM, A_DEFFLOAT, 0); class_addmethod(sigdel16read_class, (t_method)sigdel16read_dsp, gensym("dsp"), 0); class_addfloat(sigdel16read_class, (t_method)sigdel16read_16bit); } // G.Holzmann: for PD-extended build system void del16read_tilde_setup(void) { sigdel16read_setup(); } iem_utils-v0.0.20180206/iem16/del16write~-help.pd0000644000175000017500000000174213236306553021256 0ustar zmoelnigzmoelnig#N canvas 83 192 678 431 12; #X text 88 202 signal input; #X text 136 16 writes a signal in a delay line; #X text 281 235 1st argument: name of delay line; #X obj 24 203 sig~ 0; #X text 304 265 (= max. delay time); #X text 281 251 2nd argument: length of delay line in msec; #X text 24 292 see also:; #X obj 24 16 del16write~; #X obj 112 294 del16read~; #X obj 209 294 vd16~; #X text 16 353 similar pd-objects:; #X obj 201 352 delread~; #X obj 285 352 delwrite~; #X obj 378 352 vd~; #X obj 24 237 del16write~ del_line_xxx 500; #X text 21 51 This is very similar to the pd-object; #X text 49 81 It uses only 16bit to store the samples \, which will need only half of the memory of pd's floatingpoint-based object.; #X text 50 119 However \, there are 2 drawbacks: there will be some additional noise (because floats are more precise than 16bit) \, and you cannot have values>1 stored in the delay-line; #X obj 368 51 delwrite~; #X text 411 306 updated for iem16 version1.0; #X connect 3 0 14 0; iem_utils-v0.0.20180206/iem16/tab16read4.c0000644000175000017500000000431313236306562017615 0ustar zmoelnigzmoelnig/* copyleft (c) 2003 forum::für::umläute -- IOhannes m zmölnig @ IEM * based on d_array.c from pd: * Copyright (c) 1997-1999 Miller Puckette and others. * For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. */ /* tab16read, tab16read4, tab16write */ #include "iem16_table.h" /* ---------- tab16read4: control, non-interpolating ------------------------ */ static t_class *tab16read4_class; typedef struct _tab16read4{ t_object x_obj; t_symbol *x_arrayname; } t_tab16read4; static void tab16read4_float(t_tab16read4 *x, t_float f){ t_table16 *array; int npoints; t_iem16_16bit *vec; if (!(array = (t_table16 *)pd_findbyclass(x->x_arrayname, table16_class))) error("%s: no such table16", x->x_arrayname->s_name); else if (!table16_getarray16(array, &npoints, &vec)) error("%s: bad template for tab16read4", x->x_arrayname->s_name); else if (npoints < 4) outlet_float(x->x_obj.ob_outlet, 0); else if (f <= 1) outlet_float(x->x_obj.ob_outlet, vec[1]); else if (f >= npoints - 2) outlet_float(x->x_obj.ob_outlet, vec[npoints - 2]); else { int n = f; float a, b, c, d, cminusb, frac; t_iem16_16bit *fp; if (n >= npoints - 2) n = npoints - 3; fp = vec + n; frac = f - n; a = fp[-1]; b = fp[0]; c = fp[1]; d = fp[2]; cminusb = c-b; outlet_float(x->x_obj.ob_outlet, b + frac * (cminusb - 0.5f * (frac-1.) * ((a - d + 3.0f * cminusb) * frac + (b - a - cminusb)))); } } static void tab16read4_set(t_tab16read4 *x, t_symbol *s){ x->x_arrayname = s; } static void *tab16read4_new(t_symbol *s){ t_tab16read4 *x = (t_tab16read4 *)pd_new(tab16read4_class); x->x_arrayname = s; outlet_new(&x->x_obj, gensym("float")); return (x); } void tab16read4_setup(void){ tab16read4_class = class_new(gensym("tab16read4"), (t_newmethod)tab16read4_new, 0, sizeof(t_tab16read4), 0, A_DEFSYM, 0); class_addfloat(tab16read4_class, (t_method)tab16read4_float); class_addmethod(tab16read4_class, (t_method)tab16read4_set, gensym("set"), A_SYMBOL, 0); } iem_utils-v0.0.20180206/iem16/del16read~-help.pd0000644000175000017500000000267513236306553021045 0ustar zmoelnigzmoelnig#N canvas 24 20 800 531 12; #X text 372 274 1st argument: name of delay line; #X floatatom 116 253 0 0 0 0 - - -; #X text 151 255 float input (delay time in ms); #X text 127 310 signal output (delayed signal); #X floatatom 383 177 0 0 0 0 - - -; #X obj 116 375 snapshot~; #X floatatom 116 399 0 0 0 0 - - -; #X obj 24 246 loadbang; #X obj 24 313 metro 200; #X msg 32 273 \; pd dsp 1; #X text 424 176 input to delay line; #X obj 383 201 sig~; #X text 372 290 2nd argument: (initial) delay time in ms; #X text 36 443 see also:; #X obj 383 226 del16write~ del_example 1000; #X obj 24 16 del16read~; #X obj 126 444 del16write~; #X obj 239 444 vd16~; #X text 133 14 - read a 16bit signal from a 16bit-delay line; #X obj 368 52 delread~; #X text 21 52 This is very similar to the pd-object; #X text 49 82 It uses only 16bit to store the samples \, which will need only half of the memory of pd's floatingpoint-based object.; #X text 50 120 However \, there are 2 drawbacks: there will be some additional noise (because floats are more precise than 16bit) \, and you cannot have values>1 stored in the delay-line; #X text 38 490 similar pd-objects:; #X obj 223 489 delread~; #X obj 307 489 delwrite~; #X obj 400 489 vd~; #X text 433 443 updated for iem16 version1.0; #X obj 116 286 del16read~ del_example 1000; #X connect 1 0 28 0; #X connect 4 0 11 0; #X connect 5 0 6 0; #X connect 7 0 8 0; #X connect 7 0 9 0; #X connect 8 0 5 0; #X connect 11 0 14 0; #X connect 28 0 5 0; iem_utils-v0.0.20180206/iem16/tab16write~-help.pd0000644000175000017500000000200113236306553021245 0ustar zmoelnigzmoelnig#N canvas 119 134 697 433 10; #X msg 43 131 bang; #X obj 23 82 sig~ 3000; #X obj 23 110 phasor~; #X text 158 213 creation argument initializes array name; #X msg 40 181 set array99; #X msg 445 35 \; pd dsp 1; #X msg 524 37 \; pd dsp 0; #X text 85 133 bang to start recording; #X text 126 180 set the destination array; #X msg 43 153 stop; #X text 85 154 stop recording; #X text 385 366 updated for iem16 version1.0; #X obj 337 348 table16; #X text 26 322 see also:; #X obj 22 211 tab16write~ array99; #X obj 492 160 table16 array99; #X obj 31 27 tab16write~; #X text 120 27 object to write a 16bit-signal in an array; #X text 261 261 since [table16] can only hold 16bit-values \, the incoming signal (-1.0..+1.0) is stored as integer values -32768..+32767; #X obj 14 343 tab16write~; #X obj 14 362 tab16read4~; #X obj 118 362 tab16read; #X obj 118 343 tab16write; #X obj 213 343 tab16send~; #X obj 213 362 tab16receive~; #X connect 0 0 14 0; #X connect 1 0 2 0; #X connect 2 0 14 0; #X connect 4 0 14 0; #X connect 9 0 14 0; iem_utils-v0.0.20180206/iem16/GnuGPL.LICENSE0000644000175000017500000003574513236306553017731 0ustar zmoelnigzmoelnigGNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS iem_utils-v0.0.20180206/iem16/tab16read-help.pd0000644000175000017500000000154513236306553020644 0ustar zmoelnigzmoelnig#N canvas 245 143 703 316 12; #X text 62 102 index; #X floatatom 25 103 0 0 0 0 - - -; #X floatatom 25 199 0 0 0 0 - - -; #X text 70 197 output = array99[index]; #X text 189 157 creation argument; #X text 185 175 gives array name; #X msg 35 125 set array99; #X text 147 125 change array name; #X obj 422 131 table16 array99; #X obj 17 13 tab16read; #X text 412 257 updated for iem16 version1.0; #X obj 16 252 tab16write~; #X obj 16 271 tab16read4~; #X obj 120 271 tab16read; #X obj 120 252 tab16write; #X obj 217 252 tab16send~; #X obj 217 271 tab16receive~; #X obj 339 257 table16; #X text 108 15 - read numbers from a 16bit-table; #X text 21 42 since [table16] can only hold 16bit values \, the output of [tab16read] is limited to integer-values between -32768..+32767 ; #X obj 25 165 tab16read array99; #X connect 1 0 20 0; #X connect 6 0 20 0; #X connect 20 0 2 0; iem_utils-v0.0.20180206/iem16/tab16read~.c0000644000175000017500000000520013236306562017723 0ustar zmoelnigzmoelnig/* copyleft (c) 2003 forum::für::umläute -- IOhannes m zmölnig @ IEM * based on d_array.c from pd: * Copyright (c) 1997-1999 Miller Puckette and others. * For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. */ /* tab16write~, tab16play~, tab16read~, tab16read4~, tab16send~, tab16receive~ */ #include "iem16_table.h" /******************** tab16read~ ***********************/ static t_class *tab16read_tilde_class; typedef struct _tab16read_tilde{ t_object x_obj; int x_npoints; t_iem16_16bit *x_vec; t_symbol *x_arrayname; float x_f; } t_tab16read_tilde; static void *tab16read_tilde_new(t_symbol *s){ t_tab16read_tilde *x = (t_tab16read_tilde *)pd_new(tab16read_tilde_class); x->x_arrayname = s; x->x_vec = 0; outlet_new(&x->x_obj, gensym("signal")); x->x_f = 0; return (x); } static t_int *tab16read_tilde_perform(t_int *w){ t_tab16read_tilde *x = (t_tab16read_tilde *)(w[1]); t_float *in = (t_float *)(w[2]); t_float *out = (t_float *)(w[3]); int n = (int)(w[4]); int maxindex; t_iem16_16bit *buf = x->x_vec; int i; maxindex = x->x_npoints - 1; if (!buf) goto zero; for (i = 0; i < n; i++) { int index = *in++; if (index < 0) index = 0; else if (index > maxindex) index = maxindex; *out++ = buf[index]*IEM16_SCALE_DOWN; } return (w+5); zero: while (n--) *out++ = 0; return (w+5); } void tab16read_tilde_set(t_tab16read_tilde *x, t_symbol *s){ t_table16 *a; x->x_arrayname = s; if (!(a = (t_table16 *)pd_findbyclass(x->x_arrayname, table16_class))) { if (*s->s_name) error("tab16read~: %s: no such table16", x->x_arrayname->s_name); x->x_vec = 0; } else if (!table16_getarray16(a, &x->x_npoints, &x->x_vec)) { error("%s: bad template for tab16read~", x->x_arrayname->s_name); x->x_vec = 0; } else table16_usedindsp(a); } static void tab16read_tilde_dsp(t_tab16read_tilde *x, t_signal **sp){ tab16read_tilde_set(x, x->x_arrayname); dsp_add(tab16read_tilde_perform, 4, x, sp[0]->s_vec, sp[1]->s_vec, sp[0]->s_n); } void tab16read_tilde_setup(void){ tab16read_tilde_class = class_new(gensym("tab16read~"), (t_newmethod)tab16read_tilde_new, 0, sizeof(t_tab16read_tilde), 0, A_DEFSYM, 0); CLASS_MAINSIGNALIN(tab16read_tilde_class, t_tab16read_tilde, x_f); class_addmethod(tab16read_tilde_class, (t_method)tab16read_tilde_dsp, gensym("dsp"), 0); class_addmethod(tab16read_tilde_class, (t_method)tab16read_tilde_set, gensym("set"), A_SYMBOL, 0); } iem_utils-v0.0.20180206/iem16/tab16write.c0000644000175000017500000000330413236306562017747 0ustar zmoelnigzmoelnig/* copyleft (c) 2003 forum::für::umläute -- IOhannes m zmölnig @ IEM * based on d_array.c from pd: * Copyright (c) 1997-1999 Miller Puckette and others. * For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. */ /* tab16read, tab16read4, tab16write */ #include "iem16_table.h" /* ------------------ tab16write: control ------------------------ */ static t_class *tab16write_class; typedef struct _tab16write { t_object x_obj; t_symbol *x_arrayname; float x_ft1; int x_set; } t_tab16write; static void tab16write_float(t_tab16write *x, t_float f) { int vecsize; t_table16 *a; t_iem16_16bit *vec; if (!(a = (t_table16 *)pd_findbyclass(x->x_arrayname, table16_class))) error("%s: no such table16", x->x_arrayname->s_name); else if (!table16_getarray16(a, &vecsize, &vec)) error("%s: bad template for tab16write", x->x_arrayname->s_name); else { int n = x->x_ft1; if (n < 0) n = 0; else if (n >= vecsize) n = vecsize-1; vec[n] = f; } } static void tab16write_set(t_tab16write *x, t_symbol *s){ x->x_arrayname = s; } static void *tab16write_new(t_symbol *s){ t_tab16write *x = (t_tab16write *)pd_new(tab16write_class); x->x_ft1 = 0; x->x_arrayname = s; floatinlet_new(&x->x_obj, &x->x_ft1); return (x); } void tab16write_setup(void){ tab16write_class = class_new(gensym("tab16write"), (t_newmethod)tab16write_new, 0, sizeof(t_tab16write), 0, A_DEFSYM, 0); class_addfloat(tab16write_class, (t_method)tab16write_float); class_addmethod(tab16write_class, (t_method)tab16write_set, gensym("set"), A_SYMBOL, 0); } iem_utils-v0.0.20180206/iem16/tab16send~.c0000644000175000017500000000436613236306562017755 0ustar zmoelnigzmoelnig/* copyleft (c) 2003 forum::für::umläute -- IOhannes m zmölnig @ IEM * based on d_array.c from pd: * Copyright (c) 1997-1999 Miller Puckette and others. * For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. */ /* tab16write~, tab16play~, tab16read~, tab16read4~, tab16send~, tab16receive~ */ #include "iem16_table.h" /* ------------------------ tab16send~ ------------------------- */ static t_class *tab16send_class; typedef struct _tab16send{ t_object x_obj; t_iem16_16bit *x_vec; int x_graphperiod; int x_graphcount; t_symbol *x_arrayname; float x_f; } t_tab16send; static void *tab16send_new(t_symbol *s){ t_tab16send *x = (t_tab16send *)pd_new(tab16send_class); x->x_graphcount = 0; x->x_arrayname = s; x->x_f = 0; return (x); } static t_int *tab16send_perform(t_int *w){ t_tab16send *x = (t_tab16send *)(w[1]); t_float *in = (t_float *)(w[2]); int n = w[3]; t_iem16_16bit *dest = x->x_vec; int i = x->x_graphcount; if (!x->x_vec) goto bad; while (n--) *dest = *in++*IEM16_SCALE_UP; if (!i--)i = x->x_graphperiod; x->x_graphcount = i; bad: return (w+4); } static void tab16send_dsp(t_tab16send *x, t_signal **sp){ int vecsize; t_table16 *a; if (!(a = (t_table16 *)pd_findbyclass(x->x_arrayname, table16_class))) { if (*x->x_arrayname->s_name) error("tab16send~: %s: no such table16", x->x_arrayname->s_name); } else if (!table16_getarray16(a, &vecsize, &x->x_vec)) error("%s: bad template for tab16send~", x->x_arrayname->s_name); else { int n = sp[0]->s_n; int ticksper = sp[0]->s_sr/n; if (ticksper < 1) ticksper = 1; x->x_graphperiod = ticksper; if (x->x_graphcount > ticksper) x->x_graphcount = ticksper; if (n < vecsize) vecsize = n; table16_usedindsp(a); dsp_add(tab16send_perform, 3, x, sp[0]->s_vec, vecsize); } } void tab16send_tilde_setup(void){ tab16send_class = class_new(gensym("tab16send~"), (t_newmethod)tab16send_new, 0, sizeof(t_tab16send), 0, A_DEFSYM, 0); CLASS_MAINSIGNALIN(tab16send_class, t_tab16send, x_f); class_addmethod(tab16send_class, (t_method)tab16send_dsp, gensym("dsp"), 0); } iem_utils-v0.0.20180206/iem16/Makefile.pdlibbuilder0000644000175000017500000011303513236306553021716 0ustar zmoelnigzmoelnig# Makefile.pdlibbuilder version 0.0.1, dated 2015-10-31 # # Helper makefile for Pure Data external libraries. # Written by Katja Vetter March-June 2015 for the public domain. No warranties. # Inspired by Hans Christoph Steiner's Makefile Template and Stephan Beal's # ShakeNMake. # # GNU make version >= 3.81 required. # # #=== characteristics =========================================================== # # # - defines build settings based on autodetected OS and architecture # - defines rules to build Pd class- or lib executables from C or C++ sources # - defines rules for libdir installation # - defines convenience targets for developer and user # - evaluates implicit dependencies for non-clean builds # # #=== basic usage =============================================================== # # # In your Makefile, define your Pd lib name and class files, and include # Makefile.pdlibbuilder at the end of the Makefile. Like so: # # ________________________________________________________________________ # # # Makefile for mylib # # lib.name = mylib # # class.sources = myclass1.c myclass2.c # # datafiles = myclass1-help.pd myclass2-help.pd README.txt LICENSE.txt # # include Makefile.pdlibbuilder # ________________________________________________________________________ # # # For files in class.sources it is assumed that class basename == source file # basename. The default target builds all classes as individual executables # with Pd's default extension for the platform. For anything more than the # most basic usage, continue reading. # # #=== list of Makefile.pdlibbuilder API variables =============================== # # # Variables available for definition in your library Makefile: # # - lib.name # - lib.setup.sources # - class.sources # - common.sources # - shared.sources # - .class.sources # - .class.ldflags # - .class.ldlibs # - cflags # - ldflags # - ldlibs # - datafiles # - datadirs # - makefiles # - makefiledirs # - externalsdir # # Variables avaialable for (re)definition via command arguments: # # - pdbinpath (Windows only) # - pdincludepath # - DESTDIR # - prefix # - libdir # - pkglibdir # - CFLAGS # - CC # - CXX # - INSTALL # - INSTALL_PROGRAM # - INSTALL_DATA # - INSTALL_DIR # # Variables available for your makefile or as command argument: # # - objectsdir # - make-lib-executable # - suppress-wunused # # #=== descriptions of Makefile.pdlibbuilder API variables ======================= # # # lib.name: # Name of the library directory as it will be installed / distributed. Also the # name of the lib executable in the case where all classes are linked into # a single binary. # # lib.setup.sources: # Source file(s) (C or C++) which must be compiled only when linking all classes # into a single lib binary. # # class.sources: # All sources files (C or C++) for which the condition holds that # class name == source file basename. # # .class.sources: # Source file(s) (C or C++) specific to class . Use this for # multiple-source classes or when class name != source file basename. # # common.sources: # Source file(s) which must be statically linked to each class in the library. # # shared.sources: # Source file(s) (C or C++) to build a shared dynamic link lib, to be linked # with all class executables. # # cflags, ldflags, ldlibs: # Define cflags (preprocessor&compiler), ldflags (linker) and ldlibs (dynamic # link libs) for the whole library. These flags are added to platform-specific # flags defined by Makefile.pdlibbuilder. # # .class.ldflags and .class.ldlibs: # Define ldflags resp. ldlibs specific to class . These flags are # added to platform-specific flags defined by Makefile.pdlibbuilder, and flags # defined in your Makefile for the whole library. Note: cflags can not be # defined per class in the current implementation. # # datafiles and datadirs: # All extra files you want to include in binary distributions of the # library: abstractions and help patches, example patches, meta patch, readme # and license texts, manuals, sound files, etcetera. Use 'datafiles' for all # files that should go into your lib rootdir and 'datadirs' for complete # directories you want to copy from source to distribution. # # externalsdir: # Relative path to directory 'externals' in the context of pd-extended SVN, or # any other centralized build layout for multiple libraries. Default value # is '..', meaning the direct parent. The value is used in search paths for # pd core components (header files, and executable in the case of Windows). # # makefiles and makefiledirs: # Extra makefiles or directories with makefiles that should be made in sub-make # processes. # # pdbinpath: # For Windows only. Directory where pd.dll can be found for linking. # # pdincludepath: # Directory where Pd API m_pd.h can be found, and other Pd header files. # # DESTDIR, prefix, libdir: # Components of the path for installation as conventionally used on Linux. # # pkglibdir: # Base path for installation of Pd library directories. Default is specified # per OS, see section about paths below. # # objectsdir: # Alias of pkglibdir. Can be defined in your makefile to enable project- # dependent relative install locations. # # CFLAGS: # Compiler (notably optimization) flags which are defined by # Makefile.pdlibbuilder, but may be overriden via command argument. # # CC and CXX: # C and C++ compiler programs as defined in your build environment. # # INSTALL, INSTALL_PROGRAM, INSTALL_DATA, INSTALL_DIR: # Definitions of install program, may be overriden via command argument. # # make-lib-executable: # When this variable is defined 'yes' in your makefile or as command argument, # Makefile.pdlibbuilder will try to build all classes into a single library # executable (but it will force exit if lib.setup.sources is undefined). # If your makefile defines 'make-lib-executable=yes' as the library default, # this can still be overriden with 'make-lib-executable=no' as command argument # to build individual class executables (the Makefile.pdlibbuilder default.) # # suppress-wunused: # When this variable is defined ('yes' or any other value), -Wunused-variable, # -Wunused-parameter, -Wunused-value and -Wunused-function are suppressed, # but the other warnings from -Wall are retained. # # #=== paths ===================================================================== # # # Source files in directories other than current working directory must be # prefixed with their relative path. Do not rely on VPATH or vpath. # Object (.o) files are built in the directory of their source files. # Executables are built in current working directory. # # Variable 'pdincludepath' stores the location where m_pd.h was found. # Locations where Makefile.pdlibbuilder tries to find it, in order of priority: # # any OS: $(externalsdir)../pd/src/ # # Linux: /usr/include/pdextended/ # /usr/include/pd/ # # OSX: /Applications/Pd-extended.app/Contents/Resources/include/pdextended/ # /Applications/Pd.app/Contents/Resources/src/ # # Windows: %PROGRAMFILES%/pd/include/pdextended/ # %PROGRAMFILES%/pd/src/ # # The path for installation of all library components is constructed as: # # installpath := $(DESTDIR)$(objectsdir)/$(lib.name) # # Default for 'objectsdir' is defined per platform and follows this convention: # https://puredata.info/docs/faq/how-do-i-install-externals-and-help-files # # Linux: /usr/local/lib/pd-externals # OSX: ~/Library/Pd # Windows: %APPDATA%/Pd # # The rationale for not installing to ~/pd-externals by default on Linux # is that some people share the home dir between 32 and 64 bit installations. # # #=== targets =================================================================== # # # all: build classes (default) or library blob (if make-lib-executable=true) # alldebug: build all with -g option turned on for debug symbols # : force clean build of an individual class # .pre: make preprocessor output file in current working directory # .lst: make asm/source output file in current working directory # # install: install executables and data files # clean: remove build products from source tree # # help: print help text # vars: print makefile variables # allvars: print all variables # depend: print generated prerequisites # coffee: dummy target # # #=== Pd-extended libdir concept ================================================ # # # For libdir layout as conceived by Hans-Christoph Steiner, see: # # https://puredata.info/docs/developer/Libdir # # Files README.txt, LICENSE.txt and -meta.pd are part of the libdir # convention. Help patches for each class and abstraction are supposed to be # available. Makefile.pdlibbuilder does not force the presence of these files # however. It does not automatically include such files in libdir installations. # Data files you want to include in distributions must be defined explicitly in # your Makefile. # # #=== Makefile.pdlibbuilder syntax conventions ================================== # # # Makefile.pdlibbuilder variable names are lower case. Default make variables, # environment variables, and standard user variables (CC, CXX, CFLAGS, DESTDIR) # are upper case. Use target 'allvars' to print all variables and their values. # # 'Fields' in data variables are separated by dots, like in 'foo.class.sources'. # Words in variables expressing a function or command are separated by dashes, # like in 'make-lib-executable'. # # #=== useful make options ======================================================= # # # Use 'make -d ' to print debug details of the make process. # Use 'make -p ' to print make's database. # # #=== TODO ====================================================================== # # # - decide whether to use -static-libgcc or shared dll in MinGW # - cygwin support # - android support # - Windows 64 bit support # - figure out how to handle '$' in filenames # - add makefile template targets dpkg-source dist libdir distclean tags? # # #=== end of documentation sections ============================================= # # ################################################################################ ################################################################################ ################################################################################ # GNU make version 3.81 (2006) or higher is required because of the following: # - function 'info' # - variable '.DEFAULT_GOAL' # force exit when make version is < 3.81 ifneq ($(firstword $(sort 3.81 $(MAKE_VERSION))), 3.81) $(error GNU make version 3.81 or higher is required) endif # Relative path to externals root dir in multi-lib source tree like # pd-extended SVN. Default is parent of current working directory. May be # defined differently in including makefile. This variable is used to probe for # paths. externalsdir ?= .. # variable you can use to check if Makefile.pdlibbuilder is already included Makefile.pdlibbuilder = true ################################################################################ ### variables: library name and version ######################################## ################################################################################ # strip possibles spaces from lib.name, they mess up calculated file names lib.name := $(strip $(lib.name)) # if meta file exists, check library version metafile := $(wildcard $(lib.name)-meta.pd) ifdef metafile lib.version := $(shell sed -n \ 's|^\#X text [0-9][0-9]* [0-9][0-9]* VERSION \(.*\);|\1|p' \ $(metafile)) endif ################################################################################ ### variables: files ########################################################### ################################################################################ #=== sources =================================================================== # (re)define .class.sources using file names in class.sources define add-class-source $(notdir $(basename $v)).class.sources += $v endef $(foreach v, $(class.sources), $(eval $(add-class-source))) # derive class names from .class.sources variables sourcevariables := $(filter %.class.sources, $(.VARIABLES)) classes := $(basename $(basename $(sourcevariables))) # accumulate all source files specified in makefile classes.sources := $(sort $(foreach v, $(sourcevariables), $($v))) all.sources := $(classes.sources) $(lib.setup.sources) \ $(shared.sources) $(common.sources) #=== object files ============================================================== # construct object filenames from all C and C++ source file names classes.objects := $(addsuffix .o, $(basename $(classes.sources))) common.objects := $(addsuffix .o, $(basename $(common.sources))) shared.objects := $(addsuffix .o, $(basename $(shared.sources))) lib.setup.objects := $(addsuffix .o, $(basename $(lib.setup.sources))) all.objects = $(classes.objects) $(common.objects) $(shared.objects) \ $(lib.setup.objects) #=== executables =============================================================== # use recursive variables here because executable extension is not yet known # construct class executable names from class names classes.executables = $(addsuffix .$(extension), $(classes)) # construct shared lib executable name if shared sources are defined ifdef shared.sources shared.lib = lib$(lib.name).$(shared.extension) else shared.lib = endif ################################################################################ ### variables per platform ##################################################### ################################################################################ #=== flags per architecture ==================================================== # Set architecture-dependent flags, mainly for Linux. For Mac and Windows, # arch.flags are overriden below. machine := $(shell uname -m) # Raspberry Pi 1st generation ifeq ($(machine), armv6l) arch.flags = -march=armv6 -mfpu=vfp -mfloat-abi=hard endif # Beagle, Udoo, RPi2 etc. ifeq ($(machine), armv7l) arch.flags = -march=armv7-a -mfpu=vfpv3 -mfloat-abi=hard endif # Intel 32 bit, build with SSE and SSE2 instructions ifeq ($(findstring $(machine), i386 i686), $(machine)) arch.flags = -march=pentium4 -mfpmath=sse -msse -msse2 endif # Intel/AMD 64 bit, build with SSE, SSE2 and SSE3 instructions ifeq ($(findstring $(machine), ia64 x86_64), $(machine)) arch.flags = -march=core2 -mfpmath=sse -msse -msse2 -msse3 endif #=== operating system ========================================================== # The following systems are defined: Linux, Darwin, Windows. GNU and # GNU/kFreeBSD are treated as Linux to get the same options. uname := $(shell uname) ifeq ($(findstring $(uname), Linux GNU GNU/kFreeBSD), $(uname)) system = Linux endif ifeq ($(uname), Darwin) system = Darwin endif ifeq ($(findstring MINGW, $(uname)), MINGW) system = Windows endif # TODO: Cygwin, Android #=== flags and paths for Linux ================================================= ifeq ($(system), Linux) prefix = /usr/local libdir := $(prefix)/lib pkglibdir = $(libdir)/pd-externals pdincludepath := $(firstword $(dir $(wildcard \ $(externalsdir)/../pd/src/m_pd.h \ /usr/include/pdextended/m_pd.h \ /usr/include/pd/m_pd.h))) extension = pd_linux cpp.flags := -DUNIX c.flags := -fpic c.ldflags := -rdynamic -shared -fpic -Wl,-rpath,"\$$ORIGIN",--enable-new-dtags c.ldlibs := -lc -lm cxx.flags := -fpic -fcheck-new cxx.ldflags := -rdynamic -shared -fpic -Wl,-rpath,"\$$ORIGIN",--enable-new-dtags cxx.ldlibs := -lc -lm -lstdc++ shared.extension = so shared.ldflags := -rdynamic -fpic -shared -Wl,-soname,$(shared.lib) stripflags = --strip-unneeded -R .note -R .comment endif #=== flags and paths for Darwin ================================================ # On OSX we try to build fat binaries by default. It is assumed that OSX i386 # can build for ppc and OSX x86_64 can't. TODO: try to refine this condition. # LLVM-clang doesn't support -fcheck-new, therefore this flag is omitted for # OSX x86_64. ifeq ($(system), Darwin) pkglibdir = $(HOME)/Library/Pd pdincludepath := $(firstword $(dir $(wildcard \ $(externalsdir)/../pd/src/m_pd.h \ /Applications/Pd-extended.app/Contents/Resources/include/pdextended/m_pd.h \ /Applications/Pd.app/Contents/Resources/src/m_pd.h))) extension = pd_darwin arch.flags = cpp.flags := -DUNIX -DMACOSX -I /sw/include c.flags := c.ldflags := -undefined suppress -flat_namespace -bundle c.ldlibs := -lc cxx.ldflags := -undefined suppress -flat_namespace -bundle cxx.ldlibs := -lc shared.extension = dylib shared.ldflags = -dynamiclib -undefined dynamic_lookup \ -install_name @loader_path/$(shared.lib) \ -compatibility_version 1 -current_version 1.0 stripflags = -x ifeq ($(machine), i386) cxx.flags := -fcheck-new arch.flags := -arch ppc -arch i386 -arch x86_64 -mmacosx-version-min=10.4 endif ifeq ($(machine), x86_64) arch.flags := -arch i386 -arch x86_64 -mmacosx-version-min=10.5 endif endif #=== flags and paths for Windows =============================================== # Standard paths on Windows contain spaces, and GNU make functions treat such # paths as lists, with unintended effects. Therefore we must use shell function # ls instead of make's wildcard, and probe for each standard path individually. # Using double quotes around paths with spaces is obligatory. Since some path # variables are assembled or re-expanded later, great care must be taken to put # quotes at appropriate points throughout the makefile. Thanks, Bill. # paths for 32-bit executables on 64-bit Windows aren't yet defined here (TODO) ifeq ($(system), Windows) pkglibdir := $(APPDATA)/Pd pdbinpath := $(wildcard $(externalsdir)/../pd/bin/) pdincludepath := $(wildcard $(externalsdir)/../pd/src/) ifndef pdbinpath pdbinpath := $(shell ls -d "$(PROGRAMFILES)/pd/bin/") endif ifndef pdincludepath pdincludepath := $(shell ls -d "$(PROGRAMFILES)/pd/include/pdextended/") endif ifndef pdincludepath pdincludepath := $(shell ls -d "$(PROGRAMFILES)/pd/src/") endif endif # On Windows we build 32 bit by default to match Pd(-extended) binary # distributions. This may change in the future. # TODO: decide whether -mms-bitfields should be specified. ifeq ($(system), Windows) extension = dll CC = gcc CXX = g++ arch.flags := -march=pentium4 -msse -msse2 -mfpmath=sse cpp.flags := -DMSW -DNT c.flags := c.ldflags := -static-libgcc -shared \ -Wl,--enable-auto-import "$(pdbinpath)pd.dll" c.ldlibs := cxx.flags := -fcheck-new cxx.ldflags := -static-libstdc++ -shared \ -Wl,--enable-auto-import "$(pdbinpath)pd.dll" cxx.ldlibs := shared.extension = dll shared.ldflags := -static-libgcc -shared "$(pdbinpath)pd.dll" stripflags = --strip-unneeded -R .note -R .comment endif #=== paths ===================================================================== # Default pkglibdir is specified above per operating system. It is aliased as # 'objectsdir' to retain compatibility with pd-extended template. Assignment # operator '?=' is used to enable a project-relative path definition in the # including makefile. objectsdir ?= $(pkglibdir) # base path where all components of the lib will be installed by default installpath := $(DESTDIR)$(objectsdir)/$(lib.name) # check if pdincludepath contains spaces (as is often the case on Windows) # if so, store the path so we can later do checks with it pdincludepathwithspaces := $(if $(word 2, $(pdincludepath)), $(pdincludepath)) #=== accumulated build flags =================================================== # From GNU make docs: 'Users expect to be able to specify CFLAGS freely # themselves.' So we use CFLAGS to define platform-independent options which # are not strictly required for compilation: optimizations and warnings. CFLAGS # can be safely overriden using a make command argument. # Variables cflags, ldflags and ldlibs may be defined in including makefile. optimization.flags = -O3 -ffast-math -funroll-loops -fomit-frame-pointer warn.flags = -Wall -Wextra -Wshadow -Winline -Wstrict-aliasing # suppress -Wunused-variable & Co if you don't want to clutter a build log ifdef suppress-wunused warn.flags += $(addprefix -Wno-unused-, function parameter value variable) endif CFLAGS = $(warn.flags) $(optimization.flags) # preprocessor flags cpp.flags += -DPD -I "$(pdincludepath)" # flags for C compiler / linker c.flags := $(cpp.flags) $(c.flags) $(cflags) $(CFLAGS) c.ldflags := $(c.ldflags) $(ldflags) c.ldlibs := $(c.ldlibs) $(ldlibs) # flags for C++ compiler / linker cxx.flags := $(cpp.flags) $(cxx.flags) $(cflags) $(CFLAGS) cxx.ldflags := $(cxx.ldflags) $(ldflags) cxx.ldlibs := $(cxx.ldlibs) $(ldlibs) ################################################################################ ### variables: tools ########################################################### ################################################################################ # aliases so we can later define 'compile-$1' and set 'c' or 'cxx' as argument compile-c := $(CC) compile-cxx := $(CXX) ################################################################################ ### checks ##################################################################### ################################################################################ # At this point most variables are defined. Now do some checks and info's # before rules begin. # 'forward declaration' of default target, needed to do checks all: # To avoid unpredictable results, make sure the default target is not redefined # by including makefile. ifneq ($(.DEFAULT_GOAL), all) $(error Default target must be 'all'.) endif # find out which target(s) will be made ifdef MAKECMDGOALS goals := $(MAKECMDGOALS) else goals := all endif # check if m_pd.h is found and print info about it $(if $(shell ls "$(pdincludepath)m_pd.h"), \ $(info ++++ info: using Pd API $(pdincludepath)m_pd.h), \ $(warning Where is your m_pd.h? Do 'make help' for info.)) # print target info $(info ++++ info: making target $(goals) $(if $(lib.name),in lib $(lib.name))) # when installing, print installpath info $(if $(filter install install-lib, $(goals)), $(info ++++ info: \ installpath is '$(installpath)')) #=== define executables ======================================================== # By default we build class executables, and optionally a shared dynamic link # lib. When make-lib-executable=yes we build all classes into a single lib # executable, on the condition that variable lib.setup.sources is defined. ifeq ($(make-lib-executable),yes) $(if $(lib.setup.sources), ,\ $(error Can not build library blob because lib.setup.sources is undefined)) executables := $(lib.name).$(extension) else executables := $(classes.executables) $(shared.lib) endif ################################################################################ ### rules: special targets ##################################################### ################################################################################ # Disable built-in rules. If some target can't be built with the specified # rules, it should not be built at all. MAKEFLAGS += --no-builtin-rules .PRECIOUS: .SUFFIXES: .PHONY: all build-classes build-lib $(classes) $(makefiledirs) $(makefiles)\ install install-executables install-datafiles install-datadirs \ force clean vars allvars depend help ################################################################################ ### rules: build targets ####################################################### ################################################################################ # target all builds class executables plus optional shared lib # or alternatively a single lib executable when make-lib-executable=true all: $(executables) $(info ++++ info: $(if $(executables),executables in $(lib.name) completed)) # build all with -g option turned on for debug symbols alldebug: c.flags += -g alldebug: cxx.flags += -g alldebug: all #=== class executable ========================================================== # recipe for linking objects in class executable # argument $1 = compiler type (c or cxx) # argument $2 = class basename define link-class $(compile-$1) \ $(arch.flags) \ $($1.ldflags) $($2.class.ldflags) \ -o $2.$(extension) \ $(addsuffix .o, $(basename $($2.class.sources))) \ $(addsuffix .o, $(basename $(common.sources))) \ $($1.ldlibs) $($2.class.ldlibs) $(shared.lib) endef # general rule for linking object files in class executable %.$(extension): $(shared.lib) $(info ++++ info: linking objects in $@ for lib $(lib.name)) $(if $(filter %.cc %.cpp, $($*.class.sources)), \ $(call link-class,cxx,$*), \ $(call link-class,c,$*)) #=== library blob ============================================================== # build all classes into single executable build-lib: $(lib.name).$(extension) $(info ++++ info: library blob $(lib.name).$(extension) completed) # recipe for linking objects in lib executable # argument $1 = compiler type (c or cxx) define link-lib $(compile-$1) \ $(arch.flags) \ $($1.ldflags) $(lib.ldflags) \ -o $(lib.name).$(extension) $(all.objects) \ $($1.ldlibs) $(lib.ldlibs) endef # rule for linking objects in lib executable # declared conditionally to avoid name clashes ifeq ($(make-lib-executable),yes) $(lib.name).$(extension): $(all.objects) $(if $(filter %.cc %.cpp, $(all.sources)), \ $(call link-lib,cxx), \ $(call link-lib,c)) endif #=== shared dynamic lib ======================================================== # recipe for linking objects in shared executable # argument $1 = compiler type (c or cxx) define link-shared $(compile-$1) \ $(arch.flags) \ $(shared.ldflags) \ -o lib$(lib.name).$(shared.extension) $(shared.objects) \ $($1.ldlibs) $(shared.ldlibs) endef # rule for linking objects in shared executable # build recipe is in macro 'link-shared' lib$(lib.name).$(shared.extension): $(shared.objects) $(info ++++ info: linking objects in shared lib $@) $(if $(filter %.cc %.cpp, $(shared.sources)), \ $(call link-shared,cxx), \ $(call link-shared,c)) #=== object files ============================================================== # recipe to make .o file from source # argument $1 is compiler type (c or cxx) define make-object-file $(info ++++ info: making $@ in lib $(lib.name)) $(compile-$1) \ $($1.flags) \ $(arch.flags) -o $@ -c $< endef # Three rules to create .o files. These are double colon 'terminal' rules, # meaning they are the last in a rules chain. %.o:: %.c $(call make-object-file,c) %.o:: %.cc $(call make-object-file,cxx) %.o:: %.cpp $(call make-object-file,cxx) #=== explicit prerequisites for class executables ============================== # For class executables, prerequisite rules are declared in run time. Target # 'depend' prints these rules for debugging purposes. # declare explicit prerequisites rule like 'class: class.extension' # argument $v is class basename define declare-class-target $v: $v.$(extension) endef # declare explicit prerequisites rule like 'class.extension: object1.o object2.o' # argument $v is class basename define declare-class-executable-target $v.$(extension): $(addsuffix .o, $(basename $($v.class.sources))) \ $(addsuffix .o, $(basename $(common.sources))) endef # evaluate explicit prerequisite rules for all classes $(foreach v, $(classes), $(eval $(declare-class-target))) $(foreach v, $(classes), $(eval $(declare-class-executable-target))) #=== implicit prerequisites for class executables ============================== # Evaluating implicit prerequisites (header files) with help from the # preprocessor is 'expensive' so this is done conditionally and selectively. # Note that it is also possible to trigger a build via install targets, in # which case implicit prerequisites are not checked. # When the Pd include path contains spaces it will mess up the implicit # prerequisites rules so we do not evaluate them in that case. ifndef pdincludepathwithspaces must-build-everything := $(filter all default lib, $(goals)) must-build-class := $(filter $(classes), $(goals)) must-build-sources := $(foreach v, $(must-build-class), $($v.class.sources)) endif # declare implicit prerequisites rule like 'object.o: header1.h header2.h ...' # argument $1 is input source file(s) define declare-object-target $(filter %.o: %.h, $(shell $(CPP) $(c.flags) -MM $1)) $(MAKEFILE_LIST) endef # evaluate implicit prerequisite rules when rebuilding everything ifdef must-build-everything $(if $(wildcard $(all.objects)), \ $(info ++++ info: evaluating implicit prerequisites in lib $(lib.name).....) \ $(foreach v, $(all.sources), $(eval $(call declare-object-target, $v)))) endif # evaluate implicit prerequisite rules when selectively building classes ifdef must-build-class $(foreach v, $(must-build-sources), \ $(eval $(call declare-object-target, $v))) $(foreach v, $(shared.sources), \ $(eval $(call declare-object-target, $v))) endif ################################################################################ ### rules: preprocessor and assembly files ##################################### ################################################################################ # Preprocessor and assembly output files for bug tracing etc. They are not part # of the build processes for executables. By default these files are created in # the current working directory. Dependency tracking is not performed, the build # is forced instead to make sure it's up to date. force: #=== preprocessor file ========================================================= # make preprocessor output file with extension .pre # argument $1 = compiler type (c or cxx) define make-preprocessor-file $(info ++++ info: making preprocessor output file $(notdir $*.pre) \ in current working directory) $(compile-$1) -E $< $(c.flags) $($1.flags) -o $(notdir $*.pre) endef %.pre:: %.c force $(call make-preprocessor-file,c) %.pre:: %.cc force $(call make-preprocessor-file,cxx) %.pre:: %.cpp force $(call make-preprocessor-file,cxx) #=== assembly file ============================================================= # make C / assembly interleaved output file with extension .lst # argument $1 = compiler type (c or cxx) define make-assembly-file $(info ++++ info: making assembly output file $(notdir $*.lst) \ in current working directory) $(compile-$1) \ -c -Wa,-a,-ad -fverbose-asm \ $($1.flags) \ $(arch.flags) \ $< > $(notdir $*.lst) endef %.lst:: %.c force $(call make-assembly-file,c) %.lst:: %.cc force $(call make-assembly-file,cxx) %.lst:: %.cpp force $(call make-assembly-file,cxx) ################################################################################ ### rules: installation targets ################################################ ################################################################################ # Install targets depend on successful exit status of target all because nothing # must be installed in case of a build error. # -p = preserve time stamps # -m = set permission mode (as in chmod) # -d = create all components of specified directories INSTALL = install INSTALL_PROGRAM := $(INSTALL) -p -m 644 INSTALL_DATA := $(INSTALL) -p -m 644 INSTALL_DIR := $(INSTALL) -m 755 -d # strip spaces from file names executables := $(strip $(executables)) datafiles := $(strip $(datafiles)) datadirs := $(strip $(datadirs)) # Do not make any install sub-target with empty variable definition because the # install program would exit with an error. install: $(if $(executables), install-executables) install: $(if $(datafiles), install-datafiles) install: $(if $(datadirs), install-datadirs) install-executables: all $(INSTALL_DIR) -v "$(installpath)" $(INSTALL_PROGRAM) $(executables) "$(installpath)" $(info ++++ info: executables of lib $(lib.name) installed \ from $(CURDIR) to $(installpath)) install-datafiles: all $(INSTALL_DIR) -v "$(installpath)" $(INSTALL_DATA) $(datafiles) "$(installpath)" $(info ++++ info: data files of lib $(lib.name) installed \ from $(CURDIR) to $(installpath)) install-datadirs: all $(foreach v, $(datadirs), $(INSTALL_DIR) "$(installpath)/$v";) $(foreach v, $(datadirs), \ $(INSTALL_DATA) $(wildcard $v/*) "$(installpath)/$v";) $(info ++++ info: data directories of lib $(lib.name) installed \ from $(CURDIR) to $(installpath)) ################################################################################ ### rules: distribution targets ################################################ ################################################################################ # TODO # These targets are implemented in Makefile Template, but I have to figure out # how to do it under the not-so-strict conditions of Makefile.pdlibbuilder. # make source package dist: @echo "target dist not yet implemented" # make Debian source package dpkg-source: @echo "target dpkg-source not yet implemented" $(ORIGDIR): $(DISTDIR): ################################################################################ ### rules: clean targets ####################################################### ################################################################################ # delete build products from build tree clean: rm -f $(all.objects) rm -f $(classes.executables) $(lib.name).$(extension) $(shared.lib) rm -f *.pre *.lst # remove distribution directories and tarballs from build tree distclean: clean @echo "target distclean not yet implemented" ################################################################################ ### rules: submake targets ##################################################### ################################################################################ # Iterate over sub-makefiles or makefiles in other directories. # When 'continue-make=yes' is set, sub-makes will report 'true' to the parent # process regardless of their real exit status. This prevents the parent make # from being aborted by a sub-make error. Useful when you want to quickly find # out which sub-makes from a large set will succeed. ifeq ($(continue-make),yes) continue = || true endif # These targets will trigger sub-make processes for entries in 'makefiledirs' # and 'makefiles'. all alldebug install clean distclean dist dkpg-source: \ $(makefiledirs) $(makefiles) # this expands to identical rules for each entry in 'makefiledirs' $(makefiledirs): $(MAKE) --directory=$@ $(MAKECMDGOALS) $(continue) # this expands to identical rules for each entry in 'makefiles' $(makefiles): $(MAKE) --directory=$(dir $@) --makefile=$(notdir $@) $(MAKECMDGOALS) $(continue) ################################################################################ ### rules: convenience targets ################################################# ################################################################################ #=== show variables ============================================================ # Several 'function' macro's cause errors when expanded within a rule or without # proper arguments. Variables which are set with the define directive are only # shown by name for that reason. functions = \ add-class-source \ declare-class-target \ declare-class-executable-target \ declare-object-target \ link-class \ link-lib \ link-shared \ make-object-file \ make-preprocessor-file \ make-assembly-file # show variables from makefiles vars: $(info ++++ info: showing makefile variables:) $(foreach v,\ $(sort $(filter-out $(functions) functions, $(.VARIABLES))),\ $(if $(filter file, $(origin $v)),\ $(info variable $v = $($v)))) $(foreach v, $(functions), $(info 'function' name: $v)) @echo # show all variables allvars: $(info ++++ info: showing default, automatic and makefile variables:) $(foreach v, \ $(sort $(filter-out $(functions) functions, $(.VARIABLES))), \ $(info variable ($(origin $v)) $v = $($v))) $(foreach v, $(functions), $(info 'function' name: $v)) @echo #=== show dependencies ========================================================= # show generated prerequisites rules depend: $(info ++++ info: generated prerequisite rules) $(foreach v, $(classes), $(info $(declare-class-target))) $(foreach v, $(classes), $(info $(declare-class-executable-target))) $(foreach v, $(all.sources), $(info $(call declare-object-target, $v))) @echo #=== show help text ============================================================ # brief info about targets and paths mpdh := $(shell ls "$(pdincludepath)m_pd.h") mpdh := $(if $(mpdh), $(mpdh), m_pd.h not found. Is Pd(-extended) installed?) help: @echo @echo " Main targets:" @echo " all: build executables (default target)" @echo " install: install all components of the library" @echo " vars: print makefile variables for troubleshooting" @echo " allvars: print all variables for troubleshooting" @echo " help: print this help text" @echo @echo " Pd API m_pd.h:" @echo " $(shell ls "$(pdincludepath)m_pd.h")" @echo " You may specify your preferred include path as argument to" @echo " the make command, like 'pdincludepath=path/to/pd/src'." @echo @echo " Path for installation of your libdir(s):" @echo " $(objectsdir)" @echo " Alternatively you may specify your path for installation as argument" @echo " to the make command, like 'objectsdir=path/to/pd-externals'." @echo " For detailed info read the doc sections in Makefile.pdlibbuilder." @echo #=== dummy target ============================================================== coffee: @echo "Makefile.pdlibbuilder: Can not make coffee. Sorry." ################################################################################ ### end of rules sections ###################################################### ################################################################################ # for syntax highlighting in vim and github # vim: set filetype=make: iem_utils-v0.0.20180206/iem16/tab16write~.c0000644000175000017500000000570413236306562020153 0ustar zmoelnigzmoelnig/* copyleft (c) 2003 forum::für::umläute -- IOhannes m zmölnig @ IEM * based on d_array.c from pd: * Copyright (c) 1997-1999 Miller Puckette and others. * For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. */ /* tab16write~, tab16play~, tab16read~, tab16read4~, tab16send~, tab16receive~ */ #include "iem16_table.h" /* ------------------------- tab16write~ -------------------------- */ static t_class *tab16write_tilde_class; typedef struct _tab16write_tilde { t_object x_obj; int x_phase; int x_nsampsintab; short *x_vec; t_symbol *x_arrayname; float x_f; } t_tab16write_tilde; static void *tab16write_tilde_new(t_symbol *s) { t_tab16write_tilde *x = (t_tab16write_tilde *)pd_new(tab16write_tilde_class); x->x_phase = 0x7fffffff; x->x_arrayname = s; x->x_f = 0; return (x); } static t_int *tab16write_tilde_perform(t_int *w) { t_tab16write_tilde *x = (t_tab16write_tilde *)(w[1]); t_float *in = (t_float *)(w[2]); int n = (int)(w[3]), phase = x->x_phase, endphase = x->x_nsampsintab; if (!x->x_vec) goto bad; if (endphase > phase) { int nxfer = endphase - phase; t_iem16_16bit *fp = x->x_vec + phase; if (nxfer > n) nxfer = n; phase += nxfer; while (nxfer--)*fp++ = *in++*IEM16_SCALE_UP; x->x_phase = phase; } bad: return (w+4); } void tab16write_tilde_set(t_tab16write_tilde *x, t_symbol *s){ t_table16 *a; x->x_arrayname = s; if (!(a = (t_table16 *)pd_findbyclass(x->x_arrayname, table16_class))) { if (*s->s_name) pd_error(x, "tab16write~: %s: no such table16", x->x_arrayname->s_name); x->x_vec = 0; } else if (!table16_getarray16(a, &x->x_nsampsintab, &x->x_vec)) { error("%s: bad template for tab16write~", x->x_arrayname->s_name); x->x_vec = 0; } else table16_usedindsp(a); } static void tab16write_tilde_dsp(t_tab16write_tilde *x, t_signal **sp){ tab16write_tilde_set(x, x->x_arrayname); dsp_add(tab16write_tilde_perform, 3, x, sp[0]->s_vec, sp[0]->s_n); } static void tab16write_tilde_bang(t_tab16write_tilde *x){ x->x_phase = 0; } static void tab16write_tilde_stop(t_tab16write_tilde *x){ x->x_phase = x->x_nsampsintab; } void tab16write_tilde_setup(void){ tab16write_tilde_class = class_new(gensym("tab16write~"), (t_newmethod)tab16write_tilde_new, 0, sizeof(t_tab16write_tilde), 0, A_DEFSYM, 0); CLASS_MAINSIGNALIN(tab16write_tilde_class, t_tab16write_tilde, x_f); class_addmethod(tab16write_tilde_class, (t_method)tab16write_tilde_dsp, gensym("dsp"), 0); class_addmethod(tab16write_tilde_class, (t_method)tab16write_tilde_set, gensym("set"), A_SYMBOL, 0); class_addmethod(tab16write_tilde_class, (t_method)tab16write_tilde_stop, gensym("stop"), 0); class_addbang(tab16write_tilde_class, tab16write_tilde_bang); } iem_utils-v0.0.20180206/iem16/Makefile0000644000175000017500000000177413236306553017264 0ustar zmoelnigzmoelnig#!/usr/bin/make -f # Makefile for pure data externals in lib creb. # Needs Makefile.pdlibbuilder to work (https://github.com/pure-data/pd-lib-builder) lib.name = iem16 # special file that does not provide a class lib.setup.sources = iem16.c # all other C and C++ files in subdirs are source files per class # (alternatively, enumerate them by hand) class.sources = $(filter-out $(lib.setup.sources),$(wildcard *.c)) datafiles = \ $(wildcard *-help.pd) \ GnuGPL.LICENSE datadirs = examples ################################################################################ ### pdlibbuilder ############################################################### ################################################################################ # Include Makefile.pdlibbuilder from this directory, or else from externals # root directory in pd-extended configuration. PDLIBBUILDER_DIR=pd-lib-builder include $(firstword $(wildcard $(PDLIBBUILDER_DIR)/Makefile.pdlibbuilder Makefile.pdlibbuilder ../Makefile.pdlibbuilder)) iem_utils-v0.0.20180206/iem16/tab16receive~-help.pd0000644000175000017500000000114413236306553021544 0ustar zmoelnigzmoelnig#N canvas 109 83 646 239 12; #X obj 328 181 table16; #X text 17 53 creation argument: name of array; #X text 16 83 By default a block is 64 samples \; this can be reset using the block~ object.; #X obj 21 18 tab16receive~; #X text 376 199 updated for iem16 version1.0; #X obj 5 176 tab16write~; #X obj 5 195 tab16read4~; #X obj 109 195 tab16read; #X obj 109 176 tab16write; #X obj 204 176 tab16send~; #X obj 204 195 tab16receive~; #X text 17 155 see also:; #X text 129 18 - read a block of a 16bit-signal from an array continuously ; #X text 10 129 16bit-signals are limited to 65536 values between -1.0..+1.0 ; iem_utils-v0.0.20180206/iem16/vd16~-help.pd0000644000175000017500000000240513236306553020045 0ustar zmoelnigzmoelnig#N canvas 88 40 717 480 12; #X floatatom 50 254 0 0 0 0 - - -; #X obj 50 347 outlet~; #X text 130 346 signal output (delayed signal); #X obj 50 282 sig~; #X text 99 279 signal input (delay time in ms); #X text 218 310 creation argument: name of delay line; #X text 35 400 see also:; #X text 77 10 reads a signal from a 16bit delay line at a variable delay time (4-point-interpolation); #X text 31 51 vd16~ implements a 4-point interpolating delay tap from a corresponding delwrite~ object. The delay in milliseconds of the tap is specified by the incoming signal.; #X text 16 433 similar pd-objects:; #X obj 201 432 delread~; #X obj 285 432 delwrite~; #X obj 378 432 vd~; #X obj 123 403 del16write~; #X obj 242 403 del16read~; #X text 411 386 updated for iem16 version1.0; #X text 28 116 This is very similar to the pd-object; #X text 56 137 It uses only 16bit to store the samples \, which will need only half of the memory of pd's floatingpoint-based object.; #X text 57 175 However \, there are 2 drawbacks: there will be some additional noise (because floats are more precise than 16bit) \, and you cannot have values>1 stored in the delay-line; #X obj 375 112 vd~; #X obj 50 314 vd16~ del_example; #X obj 24 16 vd16~; #X connect 0 0 3 0; #X connect 3 0 20 0; #X connect 20 0 1 0; iem_utils-v0.0.20180206/iem16/del16write~.c0000644000175000017500000000561213236306553020147 0ustar zmoelnigzmoelnig/* copyleft (c) 2003 forum::für::umläute -- IOhannes m zmölnig @ IEM * based on d_delay.c from pd: * Copyright (c) 1997-1999 Miller Puckette. * For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. */ /* del16read~, del16write~, vd16~ */ #include "iem16_delay.h" /* ----------------------------- del16write~ ----------------------------- */ /* routine to check that all del16writes/del16reads/vds have same vecsize */ void sigdel16write_checkvecsize(t_sigdel16write *x, int vecsize){ if (x->x_rsortno != ugen_getsortno()) { x->x_vecsize = vecsize; x->x_rsortno = ugen_getsortno(); } else if (vecsize != x->x_vecsize) pd_error(x, "del16read/del16write/vd vector size mismatch"); } static void *sigdel16write_new(t_symbol *s, t_floatarg msec){ int nsamps; t_sigdel16write *x = (t_sigdel16write *)pd_new(sigdel16write_class); if (!*s->s_name) s = gensym("del16write~"); pd_bind(&x->x_obj.ob_pd, s); x->x_sym = s; nsamps = msec * sys_getsr() * (float)(0.001f); if (nsamps < 1) nsamps = 1; nsamps += ((- nsamps) & (SAMPBLK - 1)); nsamps += DEFDELVS; x->x_cspace.c_n = nsamps; x->x_cspace.c_vec = (t_iem16_16bit *)getbytes((nsamps + XTRASAMPS) * sizeof(t_iem16_16bit)); x->x_cspace.c_phase = XTRASAMPS; x->x_sortno = 0; x->x_vecsize = 0; x->x_f = 0; return (x); } static t_int *sigdel16write_perform(t_int *w){ t_float *in = (t_float *)(w[1]); t_del16writectl *c = (t_del16writectl *)(w[2]); int n = (int)(w[3]); int phase = c->c_phase, nsamps = c->c_n; t_iem16_16bit *vp = c->c_vec, *bp = vp + phase, *ep = vp + (c->c_n + XTRASAMPS); phase += n; while (n--) { *bp++ = (*in++*IEM16_SCALE_UP); if (bp == ep) { vp[0] = ep[-4]; vp[1] = ep[-3]; vp[2] = ep[-2]; vp[3] = ep[-1]; bp = vp + XTRASAMPS; phase -= nsamps; } } c->c_phase = phase; return (w+4); } static void sigdel16write_dsp(t_sigdel16write *x, t_signal **sp){ dsp_add(sigdel16write_perform, 3, sp[0]->s_vec, &x->x_cspace, sp[0]->s_n); x->x_sortno = ugen_getsortno(); sigdel16write_checkvecsize(x, sp[0]->s_n); } static void sigdel16write_free(t_sigdel16write *x){ pd_unbind(&x->x_obj.ob_pd, x->x_sym); freebytes(x->x_cspace.c_vec, (x->x_cspace.c_n + XTRASAMPS) * sizeof(t_iem16_16bit)); } static void sigdel16write_setup(void){ sigdel16write_class = class_new(gensym("del16write~"), (t_newmethod)sigdel16write_new, (t_method)sigdel16write_free, sizeof(t_sigdel16write), 0, A_DEFSYM, A_DEFFLOAT, 0); CLASS_MAINSIGNALIN(sigdel16write_class, t_sigdel16write, x_f); class_addmethod(sigdel16write_class, (t_method)sigdel16write_dsp, gensym("dsp"), 0); } // G.Holzmann: for PD-extended build system void del16write_tilde_setup(void) { sigdel16write_setup(); } iem_utils-v0.0.20180206/iem16/tab16write-help.pd0000644000175000017500000000162713236306553021064 0ustar zmoelnigzmoelnig#N canvas 44 17 653 456 12; #X floatatom 39 96 0 0 0 0 - - -; #X floatatom 176 170 0 0 0 0 - - -; #X text 208 192 creation argument; #X text 210 210 is array name; #X text 76 87 set y value; #X text 74 152 right inlet selects x value; #X msg 55 117 set array99; #X text 163 116 change array name; #X text 388 378 updated for iem16 version1.0; #X obj 340 360 table16; #X obj 438 156 table16 array99; #X text 133 28 write numbers to a 16bit-table; #X text 20 256 since [table16] can only hold 16bit-values \, the stored numbers have to be integer (ok \, we take care of this!) values between -32768..+32767.; #X obj 39 195 tab16write array99; #X obj 31 27 tab16write; #X obj 17 355 tab16write~; #X obj 17 374 tab16read4~; #X obj 121 374 tab16read; #X obj 121 355 tab16write; #X obj 216 355 tab16send~; #X obj 216 374 tab16receive~; #X text 29 334 see also:; #X connect 0 0 13 0; #X connect 1 0 13 1; #X connect 6 0 13 0; iem_utils-v0.0.20180206/iem16/tab16send~-help.pd0000644000175000017500000000126213236306553021054 0ustar zmoelnigzmoelnig#N canvas 151 91 705 277 12; #X obj 328 221 table16; #X text 113 26 writes one block of a signal continuously to an array ; #X text 41 60 creation argument: name of array; #X text 29 96 By default a block is 64 samples \; this can be reset using the block~ object.; #X text 376 239 updated for iem16 version1.0; #X obj 5 216 tab16write~; #X obj 5 235 tab16read4~; #X obj 109 235 tab16read; #X obj 109 216 tab16write; #X obj 204 216 tab16send~; #X obj 204 235 tab16receive~; #X text 17 195 see also:; #X text 14 137 16bit-signals are limited to 65536 values between -1.0..+1.0 ; #X text 16 157 if your signal has absolute values >1.0 \, these are wrapped around...; #X obj 11 27 tab16send~; iem_utils-v0.0.20180206/iem16/table16-help.pd0000644000175000017500000000465513236306553020336 0ustar zmoelnigzmoelnig#N canvas 37 0 856 640 10; #X obj 30 21 table16; #X text 97 22 16bit-table; #X text 32 51 [table16] stores 16bit values. The normal pd-tables ([table] \, array) store the values as floating-points. While floating points are (often) more precise (this is of course not really true... \, esp. when comparing integer(4byte) to floating-point.) they use a lot of memory (4byte).; #X text 32 121 [table16] uses only 16bit (2bytes) to store the values \, which is half of the memory.; #X text 32 155 However there are 2 major drawbacks; #X text 53 172 a) less precision means less SNR - you can only store 65536 different values \, but this is what CD-quality is (should be good enough for most musical applications); #X text 55 221 b) the 65536 values (-32678..+32767) are mapped to -1.0..+1.0! This means you cannot store signals that exceed this magical limit. Please make sure \, that the signal has correct values (use [clip~]) or the unclipped values will get wrapped!; #X text 20 323 There are several objects to access the data of [table16]: ; #X obj 55 344 tab16write~; #X obj 55 363 tab16read4~; #X obj 279 363 tab16read; #X obj 279 344 tab16write; #X obj 164 344 tab16send~; #X obj 164 363 tab16receive~; #X obj 55 382 tab16read~; #X text 19 410 The message-objects [tab16read]/[tab16write] store the values directly (-32767..+32768) \, while the signal-objects convert the floats -1.0..+1.0 to the correct values or vice-versa.; #X text 270 21 updated for iem16 version1.0; #X msg 496 53 resize 100; #X obj 496 308 table16 array16 99; #N canvas 0 0 450 300 graph6 0; #X array array100 10 float 1; #A 0 1 2 3 4 5 6 7 8 9 0; #X coords 0 10 9 0 200 140 1; #X restore 477 452 graph; #X msg 478 409 \; array100 0 1 2 3 4 5 6 7 8 9; #X text 481 389 click to init float-array; #X msg 502 114 from array100; #X text 21 497 There is no beautiful graphical representation as with pd's arrays.; #X msg 508 139 from array100 resize; #X msg 516 190 from array100 20 30; #X msg 517 213 from array100 20 30 resize; #X msg 527 259 from array100 20 30 95; #X msg 527 279 from array100 20 30 95 resize; #X text 502 95 copy the data from a float-array; #X text 603 117 and resize the 16bit-array; #X text 513 173 copy floats (index20..30); #X text 653 192 and resize to 30-20; #X text 526 241 copy indexed values and insert at index95; #X connect 17 0 18 0; #X connect 22 0 18 0; #X connect 24 0 18 0; #X connect 25 0 18 0; #X connect 26 0 18 0; #X connect 27 0 18 0; #X connect 28 0 18 0; iem_utils-v0.0.20180206/iem16/iem16_table.h0000644000175000017500000000162713236306562020062 0ustar zmoelnigzmoelnig/* copyleft (c) 2003 forum::für::umläute -- IOhannes m zmölnig @ IEM * based on d_array.c from pd: * Copyright (c) 1997-1999 Miller Puckette and others. * For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. */ #ifndef INCLUDE_IEM16_TABLE_H__ #define INCLUDE_IEM16_TABLE_H__ /* sampling */ #include "iem16.h" #include /* ------------------------- table16 -------------------------- */ /* a 16bit table */ t_class *table16_class; typedef struct _table16 { t_object x_obj; t_symbol *x_tablename; long x_size; t_iem16_16bit *x_table; /* hold the data */ int x_usedindsp; t_canvas *x_canvas; /* for file i/o */ } t_table16; int table16_getarray16(t_table16*x, int*size,t_iem16_16bit**vec); void table16_usedindsp(t_table16*x); union tabfudge { double tf_d; int32 tf_i[2]; }; #endif iem_utils-v0.0.20180206/iem_adaptfilt/0000755000175000017500000000000013236306220017463 5ustar zmoelnigzmoelnigiem_utils-v0.0.20180206/iem_adaptfilt/LICENSE.txt0000644000175000017500000000167212630366344021326 0ustar zmoelnigzmoelnigiem_adaptfilt - pd-objects for adaptive filtering Copyright (C) 2004-2006 markus noisternig (noisternig AT iem DOT at) Copyright (C) 2004-2006 thomas musil (musil AT iem DOT at) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. In the official flext distribution, the GNU General Public License is in the file GnuGPL.txt iem_utils-v0.0.20180206/iem_adaptfilt/src/0000755000175000017500000000000013236306220020252 5ustar zmoelnigzmoelnigiem_utils-v0.0.20180206/iem_adaptfilt/src/makefile_lin0000644000175000017500000000145013004407362022616 0ustar zmoelnigzmoelnigcurrent: all .SUFFIXES: .pd_linux INCLUDE = -I. -I/usr/local/src/pd/src LDFLAGS = -export-dynamic -shared LIB = -ldl -lm -lpthread #select either the DBG and OPT compiler flags below: CFLAGS = -DPD -DUNIX -W -Wno-unused \ -Wno-parentheses -Wno-switch -O6 -funroll-loops -fomit-frame-pointer \ -DDL_OPEN SYSTEM = $(shell uname -m) # the sources SRC = NLMS~.c \ NLMSerr_in~.c \ NLMSCC~.c \ n_CNLMS~.c \ n_CLNLMS~.c \ iem_adaptfilt.c TARGET = iem_adaptfilt.pd_linux OBJ = $(SRC:.c=.o) # # ------------------ targets ------------------------------------ # clean: rm ../../lib/$(TARGET) rm *.o all: $(OBJ) @echo :: $(OBJ) ld $(LDFLAGS) -o $(TARGET) *.o $(LIB) strip --strip-unneeded $(TARGET) rm *.o $(OBJ) : %.o : %.c touch $*.c cc $(CFLAGS) $(INCLUDE) -c -o $*.o $*.c iem_utils-v0.0.20180206/iem_adaptfilt/src/iem_adaptfilt.c0000644000175000017500000000237212661105566023237 0ustar zmoelnigzmoelnig/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_adaptfilt written by Markus Noisternig & Thomas Musil noisternig_AT_iem.at; musil_AT_iem.at (c) Institute of Electronic Music and Acoustics, Graz Austria 2005 */ #ifdef NT #pragma warning( disable : 4244 ) #pragma warning( disable : 4305 ) #endif #include "m_pd.h" #include "iemlib.h" static t_class *iem_adaptfilt_class; static void *iem_adaptfilt_new(void) { t_object *x = (t_object *)pd_new(iem_adaptfilt_class); return (x); } void NLMS_tilde_setup(void); void NLMSerr_in_tilde_setup(void); void NLMSCC_tilde_setup(void); void n_CNLMS_tilde_setup(void); void n_CLNLMS_tilde_setup(void); /* ------------------------ setup routine ------------------------- */ void iem_adaptfilt_setup(void) { NLMS_tilde_setup(); NLMSerr_in_tilde_setup(); NLMSCC_tilde_setup(); n_CNLMS_tilde_setup(); n_CLNLMS_tilde_setup(); post("----------------------------------------------"); post("iem_adaptfilt (R-1.02) library loaded!"); post("(c) Markus Noisternig, Thomas Musil"); post(" {noisternig, musil}_AT_iem.at"); post(" IEM Graz, Austria"); post("----------------------------------------------"); } iem_utils-v0.0.20180206/iem_adaptfilt/src/makefile_d_ppc0000644000175000017500000000140312630366344023127 0ustar zmoelnigzmoelnigcurrent: all .SUFFIXES: .d_ppc PD_INSTALL_PATH = "/Applications/Pd.app/Contents/Resources" INCLUDE = -I. -I$(PD_INSTALL_PATH)/src CFLAGS =-DPD -O2 -Wall -W -Wshadow -Wstrict-prototypes \ -Wno-unused -Wno-parentheses -Wno-switch LFLAGS = -bundle -undefined suppress -flat_namespace # the sources SRC = NLMS~.c \ NLMSerr_in~.c \ NLMSCC~.c \ n_CNLMS~.c \ n_CLNLMS~.c \ iem_adaptfilt.c TARGET = iem_adaptfilt.d_ppc OBJ = $(SRC:.c=.o) # # ------------------ targets ------------------------------------ # clean: rm ../$(TARGET) rm *.o all: $(OBJ) @echo :: $(OBJ) $(CC) $(LFLAGS) -o $(TARGET) *.o strip -S -x $(TARGET) mv $(TARGET) .. $(OBJ) : %.o : %.c touch $*.c $(CC) $(CFLAGS) $(INCLUDE) -c -o $*.o $*.c iem_utils-v0.0.20180206/iem_adaptfilt/src/makefile_vc9proj0000644000175000017500000000173412630366344023445 0ustar zmoelnigzmoelnigTARGET = iem_adaptfilt all: ..\$(TARGET).dll VIS_CPP_PATH = "C:\Program Files\Microsoft Visual Studio 9.0\VC" VIS_SDK_PATH = "C:\Program Files\Microsoft SDKs\Windows\v6.0A" PD_INST_PATH = "C:\Program Files\pd-0.43.0" PD_WIN_INCLUDE_PATH = /I. /I$(PD_INST_PATH)\src /I$(VIS_CPP_PATH)\include PD_WIN_C_FLAGS = /nologo /W3 /WX /DMSW /DNT /DPD /DWIN32 /DWINDOWS /Ox -D_CRT_SECURE_NO_WARNINGS PD_WIN_L_FLAGS = /nologo PD_WIN_LIB = /NODEFAULTLIB:libcmt /NODEFAULTLIB:oldnames /NODEFAULTLIB:kernel32 \ $(VIS_CPP_PATH)\lib\libcmt.lib \ $(VIS_CPP_PATH)\lib\oldnames.lib \ $(VIS_SDK_PATH)\lib\kernel32.lib \ $(PD_INST_PATH)\bin\pd.lib SRC = NLMS~.c \ NLMSerr_in~.c \ NLMSCC~.c \ n_CNLMS~.c \ n_CLNLMS~.c \ iem_adaptfilt.c OBJ = $(SRC:.c=.obj) .c.obj: cl $(PD_WIN_C_FLAGS) $(PD_WIN_INCLUDE_PATH) /c $*.c ..\$(TARGET).dll: $(OBJ) link $(PD_WIN_L_FLAGS) /dll /export:$(TARGET)_setup \ /out:..\$(TARGET).dll $(OBJ) $(PD_WIN_LIB) clean: del *.obj iem_utils-v0.0.20180206/iem_adaptfilt/src/n_CLNLMS~.c0000644000175000017500000003676212661105566022152 0ustar zmoelnigzmoelnig/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. n_CLNLMS multichannel-constrained leaky normalized LMS algorithm lib iem_adaptfilt written by Markus Noisternig & Thomas Musil noisternig_AT_iem.at; musil_AT_iem.at (c) Institute of Electronic Music and Acoustics, Graz Austria 2005 */ #ifdef NT #pragma warning( disable : 4244 ) #pragma warning( disable : 4305 ) #endif #include "m_pd.h" #include "iemlib.h" #include #include #include /* ----------------------- n_CLNLMS~ ------------------------------ */ /* -- multiple Constraint LEAKY Normalized Least Mean Square (linear adaptive FIR-filter) -- */ //* -- first input: reference signal -- */ /* -- second input: desired signal -- */ /* -- -- */ /* for further information on adaptive filter design we refer to */ /* [1] Haykin, "Adaptive Filter Theory", 4th ed, Prentice Hall */ /* [2] Benesty, "Adaptive Signal Processing", Springer */ typedef struct n_CLNLMS_tilde_kern { t_symbol *x_w_array_sym_name; t_float *x_w_array_mem_beg; t_float *x_in_ptr_beg;// memory: sig-in vector t_float *x_out_ptr_beg;// memory: sig-out vector t_float *x_in_hist;// start point double buffer for sig-in history } t_n_CLNLMS_tilde_kern; typedef struct n_CLNLMS_tilde { t_object x_obj; t_n_CLNLMS_tilde_kern *x_my_kern; t_float *x_des_in_ptr_beg;// memory: desired-in vector t_float *x_err_out_ptr_beg;// memory: error-out vector t_int x_n_io;// number of in-channels and filtered out-channels t_int x_rw_index;// read-write-index t_int x_n_order;// filter order t_int x_update;// rounded by 2^n, yields downsampling of learn-rate t_float x_beta;// learn rate [0 .. 2] t_float x_gamma;// normalization t_float x_kappa;// constreint: treshold of energy (clipping) t_float x_leakage;// leakage-Faktor for NLMS t_outlet *x_out_compressing_bang; t_clock *x_clock; t_float x_msi; } t_n_CLNLMS_tilde; t_class *n_CLNLMS_tilde_class; static void n_CLNLMS_tilde_tick(t_n_CLNLMS_tilde *x) { outlet_bang(x->x_out_compressing_bang); } static t_float *n_CLNLMS_tilde_check_array(t_symbol *array_sym_name, t_int length) { int n_points; t_garray *a; t_float *vec; if(!(a = (t_garray *)pd_findbyclass(array_sym_name, garray_class))) { error("%s: no such array for n_CLNLMS~", array_sym_name->s_name); return((t_float *)0); } else if(!garray_getfloatarray(a, &n_points, &vec)) { error("%s: bad template for n_CLNLMS~", array_sym_name->s_name); return((t_float *)0); } else if(n_points < length) { error("%s: bad array-size for n_CLNLMS~: %d", array_sym_name->s_name, n_points); return((t_float *)0); } else { return(vec); } } static void n_CLNLMS_tilde_beta(t_n_CLNLMS_tilde *x, t_floatarg f) // learn rate { if(f < 0.0f) f = 0.0f; if(f > 2.0f) f = 2.0f; x->x_beta = f; } static void n_CLNLMS_tilde_gamma(t_n_CLNLMS_tilde *x, t_floatarg f) // regularization (dither) { if(f < 0.0f) f = 0.0f; if(f > 1.0f) f = 1.0f; x->x_gamma = f; } static void n_CLNLMS_tilde_kappa(t_n_CLNLMS_tilde *x, t_floatarg f) // threshold for w_coeff { if(f < 0.0001f) f = 0.0001f; if(f > 10000.0f) f = 10000.0f; x->x_kappa = f; } static void n_CLNLMS_tilde_leakage(t_n_CLNLMS_tilde *x, t_floatarg f) // leakage of NLMS { if(f < 0.0001f) f = 0.0001f; if(f > 1.0f) f = 1.0f; x->x_leakage = f; } static void n_CLNLMS_tilde_update(t_n_CLNLMS_tilde *x, t_floatarg f) // downsample learn rate { t_int i=1, u = (t_int)f; if(u < 0) u = 0; else { while(i <= u) // convert u for 2^N i *= 2; // round down i /= 2; u = i; } x->x_update = u; } /* ============== DSP ======================= */ static t_int *n_CLNLMS_tilde_perform_zero(t_int *w) { t_n_CLNLMS_tilde *x = (t_n_CLNLMS_tilde *)(w[1]); t_int n = (t_int)(w[2]); t_int n_io = x->x_n_io; t_float *out; t_int i, j; out = x->x_err_out_ptr_beg; for(i=0; ix_my_kern[j].x_out_ptr_beg; for(i=0; ix_n_order; /* number of filter-order */ t_int rw_index2, rw_index = x->x_rw_index; t_int n_io = x->x_n_io; t_float *in;// first sig in t_float din;// second sig in t_float *filt_out;// first sig out t_float *err_out, err_sum;// second sig out t_float *read_in_hist; t_float *w_filt_coeff; t_float my, my_err, sum; t_float beta = x->x_beta; t_float hgamma, gammax = x->x_gamma; t_float hkappa, kappa = x->x_kappa; t_float hleakage, leakage = x->x_leakage; t_int i, j, k, update_counter; t_int update = x->x_update; t_int ord8=n_order&0xfffffff8; t_int ord_residual=n_order&0x7; t_int compressed = 0; for(k=0; kx_my_kern[k].x_w_array_mem_beg) goto n_CLNLMS_tildeperfzero;// this is Musil/Miller style } hgamma = gammax * gammax * (float)n_order; //hkappa = kappa * kappa * (float)n_order; hkappa = kappa; // kappa regards to energy value, else use line above for(i=0, update_counter=0; ix_my_kern[k].x_in_hist[rw_index] = x->x_my_kern[k].x_in_ptr_beg[i]; // save inputs into variabel & history x->x_my_kern[k].x_in_hist[rw_index+n_order] = x->x_my_kern[k].x_in_ptr_beg[i]; } din = x->x_des_in_ptr_beg[i]; // begin convolution err_sum = din; for(k=0; kx_my_kern[k].x_w_array_mem_beg; // Musil's special convolution buffer struct read_in_hist = &x->x_my_kern[k].x_in_hist[rw_index2]; for(j=0; jx_my_kern[k].x_out_ptr_beg[i] = sum; err_sum -= sum; } x->x_err_out_ptr_beg[i] = err_sum; // end convolution if(update) // downsampling of learn rate { update_counter++; if(update_counter >= update) { update_counter = 0; for(k=0; kx_my_kern[k].x_in_hist[rw_index2]; for(j=0; jx_my_kern[k].x_w_array_mem_beg; read_in_hist = &x->x_my_kern[k].x_in_hist[rw_index2]; sum = 0.0f; for(j=0; j hkappa) { compressed = 1; my = sqrt(hkappa/sum); w_filt_coeff = x->x_my_kern[k].x_w_array_mem_beg; for(j=0; j= n_order) rw_index -= n_order; } x->x_rw_index = rw_index; // wieder in die garage stellen if(compressed) clock_delay(x->x_clock, 0); return(w+3); n_CLNLMS_tildeperfzero: err_out = x->x_err_out_ptr_beg; for(i=0; ix_my_kern[j].x_out_ptr_beg; for(i=0; is_n; t_int ok_w = 1; t_int m = x->x_n_io; for(i=0; ix_my_kern[i].x_in_ptr_beg = sp[i]->s_vec; x->x_des_in_ptr_beg = sp[m]->s_vec; for(i=0; ix_my_kern[i].x_out_ptr_beg = sp[i+m+1]->s_vec; x->x_err_out_ptr_beg = sp[2*m+1]->s_vec; for(i=0; ix_my_kern[i].x_w_array_mem_beg = n_CLNLMS_tilde_check_array(x->x_my_kern[i].x_w_array_sym_name, x->x_n_order); if(!x->x_my_kern[i].x_w_array_mem_beg) ok_w = 0; } if(!ok_w) dsp_add(n_CLNLMS_tilde_perform_zero, 2, x, n); else dsp_add(n_CLNLMS_tilde_perform, 2, x, n); } /* setup/setdown things */ static void n_CLNLMS_tilde_free(t_n_CLNLMS_tilde *x) { t_int i, n_io=x->x_n_io, n_order=x->x_n_order; for(i=0; ix_my_kern[i].x_in_hist, 2*x->x_n_order*sizeof(t_float)); freebytes(x->x_my_kern, n_io*sizeof(t_n_CLNLMS_tilde_kern)); clock_free(x->x_clock); } static void *n_CLNLMS_tilde_new(t_symbol *s, t_int argc, t_atom *argv) { t_n_CLNLMS_tilde *x = (t_n_CLNLMS_tilde *)pd_new(n_CLNLMS_tilde_class); char buffer[400]; int i; t_int n_order=39, n_io=1; t_symbol *w_name; t_float beta=0.1f; t_float gammax=0.00001f; t_float kappa = 1.0f; t_float leakage = 0.99f; if((argc >= 7) && IS_A_FLOAT(argv,0) && //IS_A_FLOAT/SYMBOL from iemlib.h IS_A_FLOAT(argv,1) && IS_A_FLOAT(argv,2) && IS_A_FLOAT(argv,3) && IS_A_FLOAT(argv,4) && IS_A_FLOAT(argv,5) && IS_A_SYMBOL(argv,6)) { n_io = (t_int)atom_getintarg(0, argc, argv); n_order = (t_int)atom_getintarg(1, argc, argv); beta = (t_float)atom_getfloatarg(2, argc, argv); gammax = (t_float)atom_getfloatarg(3, argc, argv); kappa = (t_float)atom_getfloatarg(4, argc, argv); leakage = (t_float)atom_getfloatarg(5, argc, argv); w_name = (t_symbol *)atom_getsymbolarg(6, argc, argv); if(beta < 0.0f) beta = 0.0f; if(beta > 2.0f) beta = 2.0f; if(gammax < 0.0f) gammax = 0.0f; if(gammax > 1.0f) gammax = 1.0f; if(kappa < 0.0001f) kappa = 0.0001f; if(kappa > 10000.0f) kappa = 10000.0f; if(leakage < 0.0001f) leakage = 0.0001f; if(leakage > 1.0f) leakage = 1.0f; if(n_order < 2) n_order = 2; if(n_order > 11111) n_order = 11111; if(n_io < 1) n_io = 1; if(n_io > 60) n_io = 60; for(i=0; ix_obj, &x->x_obj.ob_pd, &s_signal, &s_signal); for(i=0; i<=n_io; i++) outlet_new(&x->x_obj, &s_signal); x->x_out_compressing_bang = outlet_new(&x->x_obj, &s_bang); x->x_msi = 0; x->x_n_io = n_io; x->x_n_order = n_order; x->x_update = 0; x->x_beta = beta; x->x_gamma = gammax; x->x_kappa = kappa; x->x_leakage = leakage; x->x_my_kern = (t_n_CLNLMS_tilde_kern *)getbytes(x->x_n_io*sizeof(t_n_CLNLMS_tilde_kern)); for(i=0; is_name); x->x_my_kern[i].x_w_array_sym_name = gensym(buffer); x->x_my_kern[i].x_w_array_mem_beg = (t_float *)0; x->x_my_kern[i].x_in_hist = (t_float *)getbytes(2*x->x_n_order*sizeof(t_float)); } x->x_clock = clock_new(x, (t_method)n_CLNLMS_tilde_tick); return(x); } else { post("n_CLNLMSC~-ERROR: need 6 float- + 1 symbol-arguments:"); post(" number_of_filters + order_of_filters + learnrate_beta + security_value_gamma + threshold_kappa + leakage_factor_lambda + array_name_taps"); return(0); } } void n_CLNLMS_tilde_setup(void) { n_CLNLMS_tilde_class = class_new(gensym("n_CLNLMS~"), (t_newmethod)n_CLNLMS_tilde_new, (t_method)n_CLNLMS_tilde_free, sizeof(t_n_CLNLMS_tilde), 0, A_GIMME, 0); CLASS_MAINSIGNALIN(n_CLNLMS_tilde_class, t_n_CLNLMS_tilde, x_msi); class_addmethod(n_CLNLMS_tilde_class, (t_method)n_CLNLMS_tilde_dsp, gensym("dsp"), 0); class_addmethod(n_CLNLMS_tilde_class, (t_method)n_CLNLMS_tilde_update, gensym("update"), A_FLOAT, 0); // method: downsampling factor of learning (multiple of 2^N) class_addmethod(n_CLNLMS_tilde_class, (t_method)n_CLNLMS_tilde_beta, gensym("beta"), A_FLOAT, 0); //method: normalized learning rate class_addmethod(n_CLNLMS_tilde_class, (t_method)n_CLNLMS_tilde_gamma, gensym("gamma"), A_FLOAT, 0); // method: dithering noise related to signal class_addmethod(n_CLNLMS_tilde_class, (t_method)n_CLNLMS_tilde_kappa, gensym("kappa"), A_FLOAT, 0); // method: threshold for compressing w_coeff class_addmethod(n_CLNLMS_tilde_class, (t_method)n_CLNLMS_tilde_leakage, gensym("leakage"), A_FLOAT, 0); // method: leakage factor [0 1] for w update //class_sethelpsymbol(n_CLNLMS_tilde_class, gensym("iemhelp2/n_CLNLMS~")); } iem_utils-v0.0.20180206/iem_adaptfilt/src/NLMSCC~.c0000644000175000017500000003175612661105566021622 0ustar zmoelnigzmoelnig/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. NLMSCC normalized LMS algorithm with coefficient constraints lib iem_adaptfilt written by Markus Noisternig & Thomas Musil noisternig_AT_iem.at; musil_AT_iem.at (c) Institute of Electronic Music and Acoustics, Graz Austria 2005 */ #ifdef NT #pragma warning( disable : 4244 ) #pragma warning( disable : 4305 ) #endif #include "m_pd.h" #include "iemlib.h" #include #include #include /* ----------------------- NLMSCC~ ------------------------------ */ /* -- Normalized Least Mean Square (linear adaptive FIR-filter) -- */ /* -- with Coefficient Constraint -- */ /* -- first input: reference signal -- */ /* -- second input: desired signal -- */ /* -- -- */ /* for further information on adaptive filter design we refer to */ /* [1] Haykin, "Adaptive Filter Theory", 4th ed, Prentice Hall */ /* [2] Benesty, "Adaptive Signal Processing", Springer */ /* */ typedef struct NLMSCC_tilde { t_object x_obj; t_symbol *x_w_array_sym_name; t_float *x_w_array_mem_beg; t_symbol *x_wmin_array_sym_name; t_float *x_wmin_array_mem_beg; t_symbol *x_wmax_array_sym_name; t_float *x_wmax_array_mem_beg; t_float *x_io_ptr_beg[4];// memory: 2 sig-in and 2 sig-out vectors t_float *x_in_hist;// start point double buffer for sig-in history t_int x_rw_index;// read-write-index t_int x_n_order;// order of filter t_int x_update;// 2^n rounded value, downsampling of update speed t_float x_beta;// learn rate [0 .. 2] t_float x_gamma;// regularization t_outlet *x_out_clipping_bang; t_clock *x_clock; t_float x_msi; } t_NLMSCC_tilde; t_class *NLMSCC_tilde_class; static void NLMSCC_tilde_tick(t_NLMSCC_tilde *x) { outlet_bang(x->x_out_clipping_bang); } static t_float *NLMSCC_tilde_check_array(t_symbol *array_sym_name, t_int length) { int n_points; t_garray *a; t_float *vec; if(!(a = (t_garray *)pd_findbyclass(array_sym_name, garray_class))) { error("%s: no such array for NLMSCC~", array_sym_name->s_name); return((t_float *)0); } else if(!garray_getfloatarray(a, &n_points, &vec)) { error("%s: bad template for NLMSCC~", array_sym_name->s_name); return((t_float *)0); } else if(n_points < length) { error("%s: bad array-size for NLMSCC~: %d", array_sym_name->s_name, n_points); return((t_float *)0); } else { return(vec); } } static void NLMSCC_tilde_beta(t_NLMSCC_tilde *x, t_floatarg f) // learn rate { if(f < 0.0f) f = 0.0f; if(f > 2.0f) f = 2.0f; x->x_beta = f; } static void NLMSCC_tilde_gamma(t_NLMSCC_tilde *x, t_floatarg f) // regularization factor (dither) { if(f < 0.0f) f = 0.0f; if(f > 1.0f) f = 1.0f; x->x_gamma = f; } static void NLMSCC_tilde_update(t_NLMSCC_tilde *x, t_floatarg f) // downsample of learn-rate { t_int i=1, u = (t_int)f; if(u < 0) u = 0; else { while(i <= u) // convert u for 2^N i *= 2; // round downwards i /= 2; u = i; } x->x_update = u; } /* ============== DSP ======================= */ static t_int *NLMSCC_tilde_perform_zero(t_int *w) { t_NLMSCC_tilde *x = (t_NLMSCC_tilde *)(w[1]); t_int n = (t_int)(w[2]); t_float **io = x->x_io_ptr_beg; t_float *out; t_int i, j; for(j=0; j<2; j++)/* output-vector-row */ { out = io[j+2]; for(i=0; ix_n_order; /* filter-order */ t_int rw_index = x->x_rw_index; t_float *in = x->x_io_ptr_beg[0];// first sig in t_float *desired_in = x->x_io_ptr_beg[1], din;// second sig in t_float *filt_out = x->x_io_ptr_beg[2];// first sig out t_float *err_out = x->x_io_ptr_beg[3], eout;// second sig out t_float *write_in_hist1 = x->x_in_hist; t_float *write_in_hist2 = write_in_hist1+n_order; t_float *read_in_hist = write_in_hist2; t_float *w_filt_coeff = x->x_w_array_mem_beg; t_float *wmin_filt_coeff = x->x_wmin_array_mem_beg; t_float *wmax_filt_coeff = x->x_wmax_array_mem_beg; t_float my, my_err, sum; t_float beta = x->x_beta; t_float gammax = x->x_gamma; t_int i, j, update_counter; t_int update = x->x_update; t_int ord8=n_order&0xfffffff8; t_int ord_residual=n_order&0x7; t_int clipped = 0; if(!w_filt_coeff) goto NLMSCC_tildeperfzero;// this is Musil/Miller style if(!wmin_filt_coeff) goto NLMSCC_tildeperfzero; if(!wmax_filt_coeff) goto NLMSCC_tildeperfzero;// if not constrained, perform zero for(i=0, update_counter=0; ix_w_array_mem_beg; // Musil's special convolution buffer struct read_in_hist = &write_in_hist2[rw_index]; for(j=0; j= update) { update_counter = 0; sum = 0.0f;// calculate energy for last n-order samples in filter read_in_hist = &write_in_hist2[rw_index]; for(j=0; jx_w_array_mem_beg; // coefficient constraints wmin_filt_coeff = x->x_wmin_array_mem_beg; wmax_filt_coeff = x->x_wmax_array_mem_beg; read_in_hist = &write_in_hist2[rw_index]; for(j=0; j wmax_filt_coeff[j]) { w_filt_coeff[j] = wmax_filt_coeff[j]; clipped = 1; } else if(w_filt_coeff[j] < wmin_filt_coeff[j]) { w_filt_coeff[j] = wmin_filt_coeff[j]; clipped = 1; } } } } rw_index++; if(rw_index >= n_order) rw_index -= n_order; } x->x_rw_index = rw_index; // back to start if(clipped) clock_delay(x->x_clock, 0); return(w+3); NLMSCC_tildeperfzero: while(n--) { *filt_out++ = 0.0f; *err_out++ = 0.0f; } return(w+3); } static void NLMSCC_tilde_dsp(t_NLMSCC_tilde *x, t_signal **sp) { t_int i, n = sp[0]->s_n; for(i=0; i<4; i++) // store io_vec x->x_io_ptr_beg[i] = sp[i]->s_vec; x->x_w_array_mem_beg = NLMSCC_tilde_check_array(x->x_w_array_sym_name, x->x_n_order); x->x_wmin_array_mem_beg = NLMSCC_tilde_check_array(x->x_wmin_array_sym_name, x->x_n_order); x->x_wmax_array_mem_beg = NLMSCC_tilde_check_array(x->x_wmax_array_sym_name, x->x_n_order); if(!(x->x_w_array_mem_beg && x->x_wmin_array_mem_beg && x->x_wmax_array_mem_beg)) dsp_add(NLMSCC_tilde_perform_zero, 2, x, n); else dsp_add(NLMSCC_tilde_perform, 2, x, n); } /* setup/setdown things */ static void NLMSCC_tilde_free(t_NLMSCC_tilde *x) { freebytes(x->x_in_hist, 2*x->x_n_order*sizeof(t_float)); clock_free(x->x_clock); } static void *NLMSCC_tilde_new(t_symbol *s, t_int argc, t_atom *argv) { t_NLMSCC_tilde *x = (t_NLMSCC_tilde *)pd_new(NLMSCC_tilde_class); t_int i, n_order=39; t_symbol *w_name; t_symbol *wmin_name; t_symbol *wmax_name; t_float beta=0.1f; t_float gammax=0.00001f; if((argc >= 6) && IS_A_FLOAT(argv,0) && //IS_A_FLOAT/SYMBOL from iemlib.h IS_A_FLOAT(argv,1) && IS_A_FLOAT(argv,2) && IS_A_SYMBOL(argv,3) && IS_A_SYMBOL(argv,4) && IS_A_SYMBOL(argv,5)) { n_order = (t_int)atom_getintarg(0, argc, argv); beta = (t_float)atom_getfloatarg(1, argc, argv); gammax = (t_float)atom_getfloatarg(2, argc, argv); w_name = (t_symbol *)atom_getsymbolarg(3, argc, argv); wmin_name = (t_symbol *)atom_getsymbolarg(4, argc, argv); wmax_name = (t_symbol *)atom_getsymbolarg(5, argc, argv); if(beta < 0.0f) beta = 0.0f; if(beta > 2.0f) beta = 2.0f; if(gammax < 0.0f) gammax = 0.0f; if(gammax > 1.0f) gammax = 1.0f; if(n_order < 2) n_order = 2; if(n_order > 11111) n_order = 11111; inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_signal, &s_signal); outlet_new(&x->x_obj, &s_signal); outlet_new(&x->x_obj, &s_signal); x->x_out_clipping_bang = outlet_new(&x->x_obj, &s_bang); x->x_msi = 0; x->x_n_order = n_order; x->x_update = 0; x->x_beta = beta; x->x_gamma = gammax; // 2 times in and one time desired_in memory allocation (history) x->x_in_hist = (t_float *)getbytes(2*x->x_n_order*sizeof(t_float)); // table-symbols will be linked to their memory in future (dsp_routine) x->x_w_array_sym_name = gensym(w_name->s_name); x->x_w_array_mem_beg = (t_float *)0; x->x_wmin_array_sym_name = gensym(wmin_name->s_name); x->x_wmin_array_mem_beg = (t_float *)0; x->x_wmax_array_sym_name = gensym(wmax_name->s_name); x->x_wmax_array_mem_beg = (t_float *)0; x->x_clock = clock_new(x, (t_method)NLMSCC_tilde_tick); return(x); } else { post("NLMSCC~-ERROR: need 3 float- + 3 symbol-arguments:"); post(" order_of_filter + learnrate_beta + security_value + array_name_taps + array_name_tap_min + array_name_tap_max"); return(0); } } void NLMSCC_tilde_setup(void) { NLMSCC_tilde_class = class_new(gensym("NLMSCC~"), (t_newmethod)NLMSCC_tilde_new, (t_method)NLMSCC_tilde_free, sizeof(t_NLMSCC_tilde), 0, A_GIMME, 0); CLASS_MAINSIGNALIN(NLMSCC_tilde_class, t_NLMSCC_tilde, x_msi); class_addmethod(NLMSCC_tilde_class, (t_method)NLMSCC_tilde_dsp, gensym("dsp"), 0); class_addmethod(NLMSCC_tilde_class, (t_method)NLMSCC_tilde_update, gensym("update"), A_FLOAT, 0); // method: downsampling factor of learning (multiple of 2^N) class_addmethod(NLMSCC_tilde_class, (t_method)NLMSCC_tilde_beta, gensym("beta"), A_FLOAT, 0); //method: normalized learning rate class_addmethod(NLMSCC_tilde_class, (t_method)NLMSCC_tilde_gamma, gensym("gamma"), A_FLOAT, 0); // method: dithering noise related to signal //class_sethelpsymbol(NLMSCC_tilde_class, gensym("iemhelp2/NLMSCC~")); } iem_utils-v0.0.20180206/iem_adaptfilt/src/VC7/0000755000175000017500000000000012630366344020663 5ustar zmoelnigzmoelnigiem_utils-v0.0.20180206/iem_adaptfilt/src/VC7/iem_adaptfilt.vcproj0000644000175000017500000000245112630366344024714 0ustar zmoelnigzmoelnig iem_utils-v0.0.20180206/iem_adaptfilt/src/VC7/makefile_vc7proj0000644000175000017500000000177612630366344024050 0ustar zmoelnigzmoelnigTARGET = iem_adaptfilt all: ..\$(TARGET).dll VIS_CPP_PATH = "C:\Programme\Microsoft Visual Studio .NET 2003\Vc7" VIS_SDK_PATH = "C:\Programme\Microsoft Visual Studio .NET 2003\Vc7\PlatformSDK" PD_INST_PATH = "C:\Programme\pd" PD_WIN_INCLUDE_PATH = /I. /I$(PD_INST_PATH)\src /I$(VIS_CPP_PATH)\include PD_WIN_C_FLAGS = /nologo /W3 /WX /DMSW /DNT /DPD /DWIN32 /DWINDOWS /DHAVE_G_CANVAS_H /Ox -D_CRT_SECURE_NO_WARNINGS PD_WIN_L_FLAGS = /nologo PD_WIN_LIB = /NODEFAULTLIB:libcmt /NODEFAULTLIB:oldnames /NODEFAULTLIB:kernel32 \ $(VIS_CPP_PATH)\lib\libcmt.lib \ $(VIS_CPP_PATH)\lib\oldnames.lib \ $(VIS_SDK_PATH)\lib\kernel32.lib \ $(PD_INST_PATH)\bin\pd.lib SRC = NLMS~.c \ NLMSerr_in~.c \ NLMSCC~.c \ n_CNLMS~.c \ n_CLNLMS~.c \ iem_adaptfilt.c OBJ = $(SRC:.c=.obj) .c.obj: cl $(PD_WIN_C_FLAGS) $(PD_WIN_INCLUDE_PATH) /c $*.c ..\$(TARGET).dll: $(OBJ) link $(PD_WIN_L_FLAGS) /dll /export:$(TARGET)_setup \ /out:..\$(TARGET).dll $(OBJ) $(PD_WIN_LIB) clean: del *.obj iem_utils-v0.0.20180206/iem_adaptfilt/src/VC6/0000755000175000017500000000000012630366344020662 5ustar zmoelnigzmoelnigiem_utils-v0.0.20180206/iem_adaptfilt/src/VC6/iem_adaptfilt.dsw0000644000175000017500000000110112630366344024174 0ustar zmoelnigzmoelnigMicrosoft Developer Studio Workspace File, Format Version 6.00 # WARNUNG: DIESE ARBEITSBEREICHSDATEI DARF NICHT BEARBEITET ODER GELÖSCHT WERDEN! ############################################################################### Project: "iem_adaptfilt"=.\iem_adaptfilt.dsp - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ }}} ############################################################################### Global: Package=<5> {{{ }}} Package=<3> {{{ }}} ############################################################################### iem_utils-v0.0.20180206/iem_adaptfilt/src/VC6/makefile_win0000644000175000017500000000205412630366344023240 0ustar zmoelnigzmoelnig all: ..\iem_adaptfilt.dll VIS_CPP_PATH = "C:\Programme\Microsoft Visual Studio\Vc98" PD_INST_PATH = "C:\Programme\pd" PD_WIN_INCLUDE_PATH = /I. /I$(PD_INST_PATH)\src /I$(VIS_CPP_PATH)\include PD_WIN_C_FLAGS = /nologo /W3 /WX /DMSW /DNT /DPD /DWIN32 /DWINDOWS /Ox -DPA_LITTLE_ENDIAN PD_WIN_L_FLAGS = /nologo PD_WIN_LIB = /NODEFAULTLIB:libc /NODEFAULTLIB:oldnames /NODEFAULTLIB:kernel /NODEFAULTLIB:uuid \ $(VIS_CPP_PATH)\lib\libc.lib \ $(VIS_CPP_PATH)\lib\oldnames.lib \ $(VIS_CPP_PATH)\lib\kernel32.lib \ $(VIS_CPP_PATH)\lib\wsock32.lib \ $(VIS_CPP_PATH)\lib\winmm.lib \ $(PD_INST_PATH)\bin\pthreadVC.lib \ $(PD_INST_PATH)\bin\pd.lib SRC = NLMS~.c \ NLMSerr_in~.c \ NLMSCC~.c \ n_CNLMS~.c \ n_CLNLMS~.c \ iem_adaptfilt.c OBJ = $(SRC:.c=.obj) .c.obj: cl $(PD_WIN_C_FLAGS) $(PD_WIN_INCLUDE_PATH) /c $*.c ..\iem_adaptfilt.dll: $(OBJ) link $(PD_WIN_L_FLAGS) /dll /export:iem_adaptfilt_setup \ /out:..\iem_adaptfilt.dll $(OBJ) $(PD_WIN_LIB) clean: del *.obj iem_utils-v0.0.20180206/iem_adaptfilt/src/VC6/iem_adaptfilt.dsp0000644000175000017500000000511312630366344024174 0ustar zmoelnigzmoelnig# Microsoft Developer Studio Project File - Name="iem_adaptfilt" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** NICHT BEARBEITEN ** # TARGTYPE "Win32 (x86) External Target" 0x0106 CFG=iem_adaptfilt - Win32 Debug !MESSAGE Dies ist kein gültiges Makefile. Zum Erstellen dieses Projekts mit NMAKE !MESSAGE verwenden Sie den Befehl "Makefile exportieren" und führen Sie den Befehl !MESSAGE !MESSAGE NMAKE /f "iem_adaptfilt.mak". !MESSAGE !MESSAGE Sie können beim Ausführen von NMAKE eine Konfiguration angeben !MESSAGE durch Definieren des Makros CFG in der Befehlszeile. Zum Beispiel: !MESSAGE !MESSAGE NMAKE /f "iem_adaptfilt.mak" CFG="iem_adaptfilt - Win32 Debug" !MESSAGE !MESSAGE Für die Konfiguration stehen zur Auswahl: !MESSAGE !MESSAGE "iem_adaptfilt - Win32 Release" (basierend auf "Win32 (x86) External Target") !MESSAGE "iem_adaptfilt - Win32 Debug" (basierend auf "Win32 (x86) External Target") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" !IF "$(CFG)" == "iem_adaptfilt - Win32 Release" # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "Release" # PROP BASE Intermediate_Dir "Release" # PROP BASE Cmd_Line "NMAKE /f makefile_win" # PROP BASE Rebuild_Opt "/a" # PROP BASE Target_File "makefile_win.exe" # PROP BASE Bsc_Name "makefile_win.bsc" # PROP BASE Target_Dir "" # PROP Use_Debug_Libraries 0 # PROP Output_Dir "Release" # PROP Intermediate_Dir "Release" # PROP Cmd_Line "NMAKE /f makefile_win" # PROP Rebuild_Opt "/a" # PROP Target_File "iem_adaptfilt.exe" # PROP Bsc_Name "iem_adaptfilt.bsc" # PROP Target_Dir "" !ELSEIF "$(CFG)" == "iem_adaptfilt - Win32 Debug" # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "Debug" # PROP BASE Intermediate_Dir "Debug" # PROP BASE Cmd_Line "NMAKE /f makefile_win" # PROP BASE Rebuild_Opt "/a" # PROP BASE Target_File "makefile_win.exe" # PROP BASE Bsc_Name "makefile_win.bsc" # PROP BASE Target_Dir "" # PROP Use_Debug_Libraries 1 # PROP Output_Dir "Debug" # PROP Intermediate_Dir "Debug" # PROP Cmd_Line "NMAKE /f makefile_win" # PROP Rebuild_Opt "/a" # PROP Target_File "iem_adaptfilt.exe" # PROP Bsc_Name "iem_adaptfilt.bsc" # PROP Target_Dir "" !ENDIF # Begin Target # Name "iem_adaptfilt - Win32 Release" # Name "iem_adaptfilt - Win32 Debug" !IF "$(CFG)" == "iem_adaptfilt - Win32 Release" !ELSEIF "$(CFG)" == "iem_adaptfilt - Win32 Debug" !ENDIF # Begin Source File SOURCE=.\makefile_win # End Source File # End Target # End Project iem_utils-v0.0.20180206/iem_adaptfilt/src/iem_adaptfilt.vcproj0000644000175000017500000000361512630366344024320 0ustar zmoelnigzmoelnig iem_utils-v0.0.20180206/iem_adaptfilt/src/iemlib.h0000644000175000017500000000762412630366344021707 0ustar zmoelnigzmoelnig/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iemlib written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2012 */ #ifndef __IEMLIB_H__ #define __IEMLIB_H__ #define IS_A_NULL(atom,index) ((atom+index)->a_type == A_NULL) #define IS_A_POINTER(atom,index) ((atom+index)->a_type == A_POINTER) #define IS_A_FLOAT(atom,index) ((atom+index)->a_type == A_FLOAT) #define IS_A_SYMBOL(atom,index) ((atom+index)->a_type == A_SYMBOL) #define IS_A_DOLLAR(atom,index) ((atom+index)->a_type == A_DOLLAR) #define IS_A_DOLLSYM(atom,index) ((atom+index)->a_type == A_DOLLSYM) #define IS_A_SEMI(atom,index) ((atom+index)->a_type == A_SEMI) #define IS_A_COMMA(atom,index) ((atom+index)->a_type == A_COMMA) #define SETNULL(atom) ((atom)->a_type = A_NULL) /* now miller's code starts : for 4 point interpolation for lookup tables for denormal floats */ #ifdef MSW int sys_noloadbang; //t_symbol *iemgui_key_sym=0; #include #else extern int sys_noloadbang; //extern t_symbol *iemgui_key_sym; #include #endif #define DEFDELVS 64 #define XTRASAMPS 4 #define SAMPBLK 4 #define UNITBIT32 1572864. /* 3*2^19; bit 32 has place value 1 */ /* machine-dependent definitions. These ifdefs really should have been by CPU type and not by operating system! */ #ifdef IRIX /* big-endian. Most significant byte is at low address in memory */ #define HIOFFSET 0 /* word offset to find MSB */ #define LOWOFFSET 1 /* word offset to find LSB */ #define int32 long /* a data type that has 32 bits */ #endif /* IRIX */ #ifdef MSW /* little-endian; most significant byte is at highest address */ #define HIOFFSET 1 #define LOWOFFSET 0 #define int32 long #endif /* MSW */ #if defined(__FreeBSD__) || defined(__APPLE__) || defined(__FreeBSD_kernel__) #include #endif #if defined(__linux__) || defined(__CYGWIN__) || defined(__GNU__) || defined(ANDROID) #include #endif #if defined(__unix__) || defined(__APPLE__) #if !defined(BYTE_ORDER) || !defined(LITTLE_ENDIAN) #error No byte order defined #endif #if BYTE_ORDER == LITTLE_ENDIAN #define HIOFFSET 1 #define LOWOFFSET 0 #else #define HIOFFSET 0 /* word offset to find MSB */ #define LOWOFFSET 1 /* word offset to find LSB */ #endif /* __BYTE_ORDER */ #include #define int32 int32_t #endif /* __unix__ or __APPLE__*/ union tabfudge_d { double tf_d; int32 tf_i[2]; }; union tabfudge_f { float tf_f; long tf_l; }; #if defined __i386__ || defined __x86_64__ #define IEM_DENORMAL(f) ((((*(unsigned int*)&(f))&0x60000000)==0) || \ (((*(unsigned int*)&(f))&0x60000000)==0x60000000)) /* more stringent test: anything not between 1e-19 and 1e19 in absolute val */ #else #define IEM_DENORMAL(f) 0 #endif /* on 64bit systems we cannot use garray_getfloatarray... */ #if ((defined PD_MAJOR_VERSION && defined PD_MINOR_VERSION) && (PD_MAJOR_VERSION > 0 || PD_MINOR_VERSION > 40)) # define iemarray_t t_word # define iemarray_getarray garray_getfloatwords # define iemarray_getfloat(pointer, index) (pointer[index].w_float) # define iemarray_setfloat(pointer, index, fvalue) (pointer[index].w_float = fvalue) #else # define iemarray_t t_float # define iemarray_getarray garray_getfloatarray # define iemarray_getfloat(pointer, index) (pointer[index]) # define iemarray_setfloat(pointer, index, fvalue) (pointer[index] = fvalue) #endif #endif iem_utils-v0.0.20180206/iem_adaptfilt/src/iem_adaptfilt.sln0000644000175000017500000000157312630366344023612 0ustar zmoelnigzmoelnig Microsoft Visual Studio Solution File, Format Version 10.00 # Visual Studio 2008 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "iem_adaptfilt", "iem_adaptfilt.vcproj", "{6A44952F-0D55-44EE-9032-928368583BEC}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Win32 = Debug|Win32 Release|Win32 = Release|Win32 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {6A44952F-0D55-44EE-9032-928368583BEC}.Debug|Win32.ActiveCfg = Debug|Win32 {6A44952F-0D55-44EE-9032-928368583BEC}.Debug|Win32.Build.0 = Debug|Win32 {6A44952F-0D55-44EE-9032-928368583BEC}.Release|Win32.ActiveCfg = Release|Win32 {6A44952F-0D55-44EE-9032-928368583BEC}.Release|Win32.Build.0 = Release|Win32 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection EndGlobal iem_utils-v0.0.20180206/iem_adaptfilt/src/makefile_d_fat0000644000175000017500000000144212630366344023122 0ustar zmoelnigzmoelnigcurrent: all .SUFFIXES: .d_fat PD_INSTALL_PATH ?= "/Applications/Pd.app/Contents/Resources" INCLUDE = -I. -I$(PD_INSTALL_PATH)/src CFLAGS =-DPD -O2 -Wall -W -Wshadow -Wstrict-prototypes \ -Wno-unused -Wno-parentheses -Wno-switch LFLAGS = -bundle -undefined suppress -flat_namespace # the sources SRC = NLMS~.c \ NLMSerr_in~.c \ NLMSCC~.c \ n_CNLMS~.c \ n_CLNLMS~.c \ iem_adaptfilt.c TARGET = iem_adaptfilt.d_fat OBJ = $(SRC:.c=.o) # # ------------------ targets ------------------------------------ # clean: rm ../$(TARGET) rm *.o all: $(OBJ) @echo :: $(OBJ) $(CC) -arch i386 -arch ppc $(LFLAGS) -o $(TARGET) *.o strip -S -x $(TARGET) mv $(TARGET) .. $(OBJ) : %.o : %.c $(CC) -arch i386 -arch ppc $(CFLAGS) $(INCLUDE) -c -o $*.o $*.c iem_utils-v0.0.20180206/iem_adaptfilt/src/iem_adaptfilt.dsw0000644000175000017500000000110112630366344023576 0ustar zmoelnigzmoelnigMicrosoft Developer Studio Workspace File, Format Version 6.00 # WARNUNG: DIESE ARBEITSBEREICHSDATEI DARF NICHT BEARBEITET ODER GELÖSCHT WERDEN! ############################################################################### Project: "iem_adaptfilt"=.\iem_adaptfilt.dsp - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ }}} ############################################################################### Global: Package=<5> {{{ }}} Package=<3> {{{ }}} ############################################################################### iem_utils-v0.0.20180206/iem_adaptfilt/src/VC9/0000755000175000017500000000000012630366344020665 5ustar zmoelnigzmoelnigiem_utils-v0.0.20180206/iem_adaptfilt/src/VC9/makefile_vc9proj0000644000175000017500000000173412630366344024046 0ustar zmoelnigzmoelnigTARGET = iem_adaptfilt all: ..\$(TARGET).dll VIS_CPP_PATH = "C:\Program Files\Microsoft Visual Studio 9.0\VC" VIS_SDK_PATH = "C:\Program Files\Microsoft SDKs\Windows\v6.0A" PD_INST_PATH = "C:\Program Files\pd-0.43.0" PD_WIN_INCLUDE_PATH = /I. /I$(PD_INST_PATH)\src /I$(VIS_CPP_PATH)\include PD_WIN_C_FLAGS = /nologo /W3 /WX /DMSW /DNT /DPD /DWIN32 /DWINDOWS /Ox -D_CRT_SECURE_NO_WARNINGS PD_WIN_L_FLAGS = /nologo PD_WIN_LIB = /NODEFAULTLIB:libcmt /NODEFAULTLIB:oldnames /NODEFAULTLIB:kernel32 \ $(VIS_CPP_PATH)\lib\libcmt.lib \ $(VIS_CPP_PATH)\lib\oldnames.lib \ $(VIS_SDK_PATH)\lib\kernel32.lib \ $(PD_INST_PATH)\bin\pd.lib SRC = NLMS~.c \ NLMSerr_in~.c \ NLMSCC~.c \ n_CNLMS~.c \ n_CLNLMS~.c \ iem_adaptfilt.c OBJ = $(SRC:.c=.obj) .c.obj: cl $(PD_WIN_C_FLAGS) $(PD_WIN_INCLUDE_PATH) /c $*.c ..\$(TARGET).dll: $(OBJ) link $(PD_WIN_L_FLAGS) /dll /export:$(TARGET)_setup \ /out:..\$(TARGET).dll $(OBJ) $(PD_WIN_LIB) clean: del *.obj iem_utils-v0.0.20180206/iem_adaptfilt/src/VC9/iem_adaptfilt.vcproj0000644000175000017500000000361512630366344024721 0ustar zmoelnigzmoelnig iem_utils-v0.0.20180206/iem_adaptfilt/src/VC9/iem_adaptfilt.sln0000644000175000017500000000157312630366344024213 0ustar zmoelnigzmoelnig Microsoft Visual Studio Solution File, Format Version 10.00 # Visual Studio 2008 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "iem_adaptfilt", "iem_adaptfilt.vcproj", "{6A44952F-0D55-44EE-9032-928368583BEC}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Win32 = Debug|Win32 Release|Win32 = Release|Win32 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {6A44952F-0D55-44EE-9032-928368583BEC}.Debug|Win32.ActiveCfg = Debug|Win32 {6A44952F-0D55-44EE-9032-928368583BEC}.Debug|Win32.Build.0 = Debug|Win32 {6A44952F-0D55-44EE-9032-928368583BEC}.Release|Win32.ActiveCfg = Release|Win32 {6A44952F-0D55-44EE-9032-928368583BEC}.Release|Win32.Build.0 = Release|Win32 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection EndGlobal iem_utils-v0.0.20180206/iem_adaptfilt/src/NLMSerr_in~.c0000644000175000017500000002231312661105565022577 0ustar zmoelnigzmoelnig/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. NLMS normalized least mean square (LMS) algorithm lib iem_adaptfilt written by Markus Noisternig & Thomas Musil noisternig_AT_iem.at; musil_AT_iem.at (c) Institute of Electronic Music and Acoustics, Graz Austria 2005 */ #include "m_pd.h" #include "iemlib.h" #include #include #include /* ----------------------- NLMSerr_in~ ------------------------------ */ /* -- Normalized Least Mean Square (linear adaptive FIR-filter) -- */ /* -- first input: reference signal -- */ /* -- second input: desired signal -- */ /* -- the difference to NLMS~ is: we have only one ERROR input instead of desired in minus filter out -- */ /* -- that means there is no feedback -- */ /* for further information on adaptive filter design we refer to */ /* [1] Haykin, "Adaptive Filter Theory", 4th ed, Prentice Hall */ /* [2] Benesty, "Adaptive Signal Processing", Springer */ typedef struct NLMSerr_in_tilde { t_object x_obj;// common pd object structure t_symbol *x_w_array_sym_name; t_float *x_w_array_mem_beg; t_float *x_ref_filt_in_hist;// history buffer for input signal reference for internal convolution = filter t_float *x_ref_adapt_in_hist;// history buffer for input signal reference for internal adapting filter t_int x_rw_index;// current read-write-index in circular buffer t_int x_n_order;// order of filter or convolution t_int x_update;// binary update parameter ON / OFF t_float x_beta;// learn rate [0 .. 2] t_float x_gamma;// regularization Parameter = minimum t_float x_flt_sig_in1; } t_NLMSerr_in_tilde; t_class *NLMSerr_in_tilde_class; static t_float *NLMSerr_in_tilde_check_array(t_symbol *array_sym_name, t_int length) { int n_points; t_garray *a; t_float *vec; if(!(a = (t_garray *)pd_findbyclass(array_sym_name, garray_class))) { error("%s: no such array for NLMSerr_in~", array_sym_name->s_name); return((t_float *)0); } else if(!garray_getfloatarray(a, &n_points, &vec)) { error("%s: bad template for NLMSerr_in~", array_sym_name->s_name); return((t_float *)0); } else if(n_points < length) { error("%s: bad array-size for NLMSerr_in~: %d", array_sym_name->s_name, n_points); return((t_float *)0); } else { return(vec); } } static void NLMSerr_in_tilde_beta(t_NLMSerr_in_tilde *x, t_floatarg f) // learn rate { if(f < 0.0f) f = 0.0f; if(f > 2.0f) f = 2.0f; x->x_beta = f; } static void NLMSerr_in_tilde_gamma(t_NLMSerr_in_tilde *x, t_floatarg f) // regularization factor (dither) { if(f < 0.0f) f = 0.0f; if(f > 1.0f) f = 1.0f; x->x_gamma = f; } static void NLMSerr_in_tilde_update(t_NLMSerr_in_tilde *x, t_floatarg f) // downsample learn-rate { t_int i=1, u = (t_int)f; if(u != 0) u = 1; x->x_update = u; } /* ============== DSP ======================= */ static t_int *NLMSerr_in_tilde_perform_zero(t_int *w) { t_NLMSerr_in_tilde *x = (t_NLMSerr_in_tilde *)(w[5]); t_int n = (t_int)(w[6]); t_float *filt_out = (t_float *)(w[4]); t_int i; for(i=0; ix_n_order; /* number of filter-order */ t_int rw_index = x->x_rw_index; /* current read write index in circular buffer */ t_int update = x->x_update; t_float beta = x->x_beta; /* learn rate */ t_float gammax = x->x_gamma; /* minimum energy */ t_float my, my_err, sum, errin; t_int i, j, k; if(!x->x_w_array_mem_beg) goto NLMSerr_in_tildeperfzero;// this is quick&dirty Musil/Miller style for(i=0; ix_ref_filt_in_hist[rw_index] = ref_filt_in[i]; // inputs of ref_filt save to history x->x_ref_adapt_in_hist[rw_index] = ref_adapt_in[i]; // inputs of ref_adapt save to history errin = err_in[i]; // begin convolution, filter : j++, k--, rw_index = aktueller index fuer lesen schreiben von history und convolution-beginn sum = 0.0f; k = rw_index; for(j=0; jx_w_array_mem_beg[j] * x->x_ref_filt_in_hist[k]; k--; if(k < 0) k = n_order - 1; } filt_out[i] = sum; if(update) // downsampling for learn rate { sum = 0.0f;// calculate energy for last n-order samples in filter k = rw_index; for(j=0; jx_ref_adapt_in_hist[k] * x->x_ref_adapt_in_hist[k]; // energie k--; if(k < 0) k = n_order - 1; } sum += gammax * gammax * (float)n_order; // convert gammax corresponding to filter order my = beta / sum;// calculate mue my_err = my * errin; k = rw_index; for(j=0; jx_w_array_mem_beg[j] += x->x_ref_adapt_in_hist[k] * my_err; k--; if(k < 0) k = n_order - 1; } } rw_index++; if(rw_index >= n_order) rw_index = 0; } x->x_rw_index = rw_index; // back to start return(w+7); NLMSerr_in_tildeperfzero: while(n--) { *filt_out++ = 0.0f; } return(w+7); } static void NLMSerr_in_tilde_dsp(t_NLMSerr_in_tilde *x, t_signal **sp) { x->x_w_array_mem_beg = NLMSerr_in_tilde_check_array(x->x_w_array_sym_name, x->x_n_order); if(!x->x_w_array_mem_beg) dsp_add(NLMSerr_in_tilde_perform_zero, 6, sp[0]->s_vec, sp[1]->s_vec, sp[2]->s_vec, sp[3]->s_vec, x, sp[0]->s_n); else dsp_add(NLMSerr_in_tilde_perform, 6, sp[0]->s_vec, sp[1]->s_vec, sp[2]->s_vec, sp[3]->s_vec, x, sp[0]->s_n); } /* setup/setdown things */ static void NLMSerr_in_tilde_free(t_NLMSerr_in_tilde *x) { freebytes(x->x_ref_filt_in_hist, x->x_n_order*sizeof(t_float)); freebytes(x->x_ref_adapt_in_hist, x->x_n_order*sizeof(t_float)); } static void *NLMSerr_in_tilde_new(t_symbol *s, t_int argc, t_atom *argv) { t_NLMSerr_in_tilde *x = (t_NLMSerr_in_tilde *)pd_new(NLMSerr_in_tilde_class); t_int i, n_order=39; t_symbol *w_name; t_float beta=0.01f; t_float gammax=0.00001f; if((argc >= 4) && IS_A_FLOAT(argv,0) && //IS_A_FLOAT/SYMBOL from iemlib.h IS_A_FLOAT(argv,1) && IS_A_FLOAT(argv,2) && IS_A_SYMBOL(argv,3)) { n_order = (t_int)atom_getintarg(0, argc, argv); beta = (t_float)atom_getfloatarg(1, argc, argv); gammax = (t_float)atom_getfloatarg(2, argc, argv); w_name = (t_symbol *)atom_getsymbolarg(3, argc, argv); if(beta < 0.0f) beta = 0.0f; if(beta > 2.0f) beta = 2.0f; if(gammax < 0.0f) gammax = 0.0f; if(gammax > 1.0f) gammax = 1.0f; if(n_order < 2) n_order = 2; if(n_order > 1111111) n_order = 1111111; inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_signal, &s_signal); inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_signal, &s_signal); outlet_new(&x->x_obj, &s_signal); x->x_flt_sig_in1 = 0; x->x_n_order = n_order; x->x_update = 0; x->x_beta = beta; x->x_gamma = gammax; // 2 times in and one time err_in memory allocation (history) x->x_ref_filt_in_hist = (t_float *)getbytes(x->x_n_order*sizeof(t_float)); x->x_ref_adapt_in_hist = (t_float *)getbytes(x->x_n_order*sizeof(t_float)); // table-symbols will be linked to their memory in future (dsp_routine) x->x_w_array_sym_name = gensym(w_name->s_name); x->x_w_array_mem_beg = (t_float *)0; x->x_rw_index = 0; return(x); } else { post("NLMSerr_in~-ERROR: need 3 float- + 1 symbol-arguments:"); post(" order_of_filter + learnrate_beta + security_value + array_name_taps"); return(0); } } void NLMSerr_in_tilde_setup(void) { NLMSerr_in_tilde_class = class_new(gensym("NLMSerr_in~"), (t_newmethod)NLMSerr_in_tilde_new, (t_method)NLMSerr_in_tilde_free, sizeof(t_NLMSerr_in_tilde), 0, A_GIMME, 0); CLASS_MAINSIGNALIN(NLMSerr_in_tilde_class, t_NLMSerr_in_tilde, x_flt_sig_in1); class_addmethod(NLMSerr_in_tilde_class, (t_method)NLMSerr_in_tilde_dsp, gensym("dsp"), 0); class_addmethod(NLMSerr_in_tilde_class, (t_method)NLMSerr_in_tilde_update, gensym("update"), A_FLOAT, 0); // method: downsampling factor of learning (multiple of 2^N) class_addmethod(NLMSerr_in_tilde_class, (t_method)NLMSerr_in_tilde_beta, gensym("beta"), A_FLOAT, 0); //method: normalized learning rate class_addmethod(NLMSerr_in_tilde_class, (t_method)NLMSerr_in_tilde_gamma, gensym("gamma"), A_FLOAT, 0); // method: dithering noise related to signal } iem_utils-v0.0.20180206/iem_adaptfilt/src/makefile_darwin0000644000175000017500000000162312630366344023332 0ustar zmoelnigzmoelnigcurrent: all .SUFFIXES: .pd_darwin PD_INSTALL_PATH = "/Applications/Pd.app/Contents/Resources" INCLUDE = -I. -I$(PD_INSTALL_PATH)/src LIB = -ldl -lm -lpthread CFLAGS = -DPD -DUNIX -g -Wall -W -Werror -Wno-unused \ -Wno-parentheses -Wno-switch -O2 -fno-strict-aliasing \ $(INCLUDE) $(UCFLAGS) $(AFLAGS) \ MACOSXLINKFLAGS = -bundle -bundle_loader $(PD_INSTALL_PATH)/bin/pd SYSTEM = $(shell uname -m) # the sources SRC = NLMS~.c \ NLMSerr_in~.c \ NLMSCC~.c \ n_CNLMS~.c \ n_CLNLMS~.c \ iem_adaptfilt.c TARGET = iem_adaptfilt.pd_darwin OBJ = $(SRC:.c=.o) # # ------------------ targets ------------------------------------ # clean: rm ../$(TARGET) rm *.o all: $(OBJ) @echo :: $(OBJ) $(CC) $(MACOSXLINKFLAGS) -o $(TARGET) *.o $(LIB) strip -S -x $(TARGET) mv $(TARGET) .. $(OBJ) : %.o : %.c touch $*.c $(CC) $(CFLAGS) -DPD $(INCLUDE) -c -o $*.o $*.c iem_utils-v0.0.20180206/iem_adaptfilt/src/Makefile0000644000175000017500000000350312661106167021724 0ustar zmoelnigzmoelnigdefault: all .PHONEY: default all everything dist \ clean realclean distclean \ install install-bin install-doc install-abs \ tests HELPERSOURCES=iem_adaptfilt.c OBJECTSOURCES=$(sort $(filter-out $(HELPERSOURCES), $(filter %.c, $(wildcard *.c)))) SOURCES=$(OBJECTSOURCES) $(HELPERSOURCES) configure: configure.ac autoconf -include $(SOURCES:.c=.d) Make.config: Make.config.in configure ./configure $(CONFIGUREFLAGS) -include Make.config ## 2nd only generate depend-files when we have Make.config included ## and thus MAKEDEP_FLAGS defined ifdef MAKEDEP_FLAGS ## dependencies: as proposed by the GNU-make documentation ## see http://www.gnu.org/software/make/manual/html_node/make_47.html#SEC51 %.d: %.c @set -e; rm -f $@; \ $(CPP) $(MAKEDEP_FLAGS) $(CFLAGS) $< > $@.$$$$; \ sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g' < $@.$$$$ > $@; \ rm -f $@.$$$$ endif .SUFFIXES: .$(EXT) TARGETS = $(SOURCES:.c=.o) OBJECTS = $(OBJECTSOURCES:.c=.$(EXT)) ## if $(BUILDLIBRARY) is defined, we build everything as a single library ## else we build separate externals ifneq "$(BUILDLIBRARY)" "" all: $(LIBNAME) cp $(LIBNAME).$(EXT) .. else all: $(OBJECTS) endif $(OBJECTS): %.$(EXT) : %.o $(LD) $(LFLAGS) -o $@ $*.o $(LIBS) $(STRIP) $(STRIPFLAGS) $@ $(LIBNAME): $(TARGETS) $(LD) $(LFLAGS) -o $@.$(EXT) *.o $(LIBS) $(STRIP) $(STRIPFLAGS) $(LIBNAME).$(EXT) $(TARGETS): %.o : %.c $(CC) $(CFLAGS) -c -o $@ $*.c clean: -rm -f *.$(EXT) *.o realclean: clean -rm -f *~ _* config.* -rm -f *.d *.d.* distclean: realclean -rm -f Make.config -rm -f *.exp *.lib *.ncb *.opt *.plg -rm -rf autom4te.cache/ install: install-bin install-doc install-bin: -install -d $(INSTALL_BIN) -install -m 644 *.$(EXT) $(INSTALL_BIN) install-doc: -install -d $(INSTALL_DOC) -install -m 644 *-help.pd $(INSTALL_DOC) everything: clean all install distclean iem_utils-v0.0.20180206/iem_adaptfilt/src/NLMS~.c0000644000175000017500000002513612661105565021406 0ustar zmoelnigzmoelnig/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. NLMS normalized least mean square (LMS) algorithm lib iem_adaptfilt written by Markus Noisternig & Thomas Musil noisternig_AT_iem.at; musil_AT_iem.at (c) Institute of Electronic Music and Acoustics, Graz Austria 2005 */ #include "m_pd.h" #include "iemlib.h" #include #include #include /* ----------------------- NLMS~ ------------------------------ */ /* -- Normalized Least Mean Square (linear adaptive FIR-filter) -- */ /* -- first input: reference signal -- */ /* -- second input: desired signal -- */ /* -- -- */ /* for further information on adaptive filter design we refer to */ /* [1] Haykin, "Adaptive Filter Theory", 4th ed, Prentice Hall */ /* [2] Benesty, "Adaptive Signal Processing", Springer */ typedef struct NLMS_tilde { t_object x_obj; t_symbol *x_w_array_sym_name; t_float *x_w_array_mem_beg; t_float *x_io_ptr_beg[4];// memory: 2 sig-in and 2 sig-out vectors t_float *x_in_hist;// start point double buffer for sig-in history t_int x_rw_index;// read-write-index t_int x_n_order;// order of filter t_int x_update;// 2^n rounded value, downsampling of update speed t_float x_beta;// learn rate [0 .. 2] t_float x_gamma;// regularization t_float x_msi; } t_NLMS_tilde; t_class *NLMS_tilde_class; static t_float *NLMS_tilde_check_array(t_symbol *array_sym_name, t_int length) { int n_points; t_garray *a; t_float *vec; if(!(a = (t_garray *)pd_findbyclass(array_sym_name, garray_class))) { error("%s: no such array for NLMS~", array_sym_name->s_name); return((t_float *)0); } else if(!garray_getfloatarray(a, &n_points, &vec)) { error("%s: bad template for NLMS~", array_sym_name->s_name); return((t_float *)0); } else if(n_points < length) { error("%s: bad array-size for NLMS~: %d", array_sym_name->s_name, n_points); return((t_float *)0); } else { return(vec); } } static void NLMS_tilde_beta(t_NLMS_tilde *x, t_floatarg f) // learn rate { if(f < 0.0f) f = 0.0f; if(f > 2.0f) f = 2.0f; x->x_beta = f; } static void NLMS_tilde_gamma(t_NLMS_tilde *x, t_floatarg f) // regularization factor (dither) { if(f < 0.0f) f = 0.0f; if(f > 1.0f) f = 1.0f; x->x_gamma = f; } static void NLMS_tilde_update(t_NLMS_tilde *x, t_floatarg f) // downsample learn-rate { t_int i=1, u = (t_int)f; if(u < 0) u = 0; else { while(i <= u) // convert u for 2^N i *= 2; // round downwards i /= 2; u = i; } x->x_update = u; } /* ============== DSP ======================= */ static t_int *NLMS_tilde_perform_zero(t_int *w) { t_NLMS_tilde *x = (t_NLMS_tilde *)(w[1]); t_int n = (t_int)(w[2]); t_float **io = x->x_io_ptr_beg; t_float *out; t_int i, j; for(j=0; j<2; j++)/* output-vector-row */ { out = io[j+2]; for(i=0; ix_n_order; /* number of filter-order */ t_int rw_index = x->x_rw_index; t_float *in = x->x_io_ptr_beg[0];// first sig in t_float *desired_in = x->x_io_ptr_beg[1], din;// second sig in t_float *filt_out = x->x_io_ptr_beg[2];// first sig out t_float *err_out = x->x_io_ptr_beg[3], eout;// second sig out t_float *write_in_hist1 = x->x_in_hist; t_float *write_in_hist2 = write_in_hist1+n_order; t_float *read_in_hist = write_in_hist2; t_float *w_filt_coeff = x->x_w_array_mem_beg; t_float my, my_err, sum; t_float beta = x->x_beta; t_float gammax = x->x_gamma; t_int i, j, update_counter; t_int update = x->x_update; t_int ord8=n_order&0xfffffff8; t_int ord_residual=n_order&0x7; if(!w_filt_coeff) goto NLMS_tildeperfzero;// this is quick&dirty Musil/Miller style for(i=0, update_counter=0; ix_w_array_mem_beg; // Musil's special convolution buffer struct read_in_hist = &write_in_hist2[rw_index]; for(j=0; j= update) { update_counter = 0; sum = 0.0f;// calculate energy for last n-order samples in filter read_in_hist = &write_in_hist2[rw_index]; for(j=0; jx_w_array_mem_beg; // coefficient constraints read_in_hist = &write_in_hist2[rw_index]; for(j=0; j= n_order) rw_index -= n_order; } x->x_rw_index = rw_index; // back to start return(w+3); NLMS_tildeperfzero: while(n--) { *filt_out++ = 0.0f; *err_out++ = 0.0f; } return(w+3); } static void NLMS_tilde_dsp(t_NLMS_tilde *x, t_signal **sp) { t_int i, n = sp[0]->s_n; for(i=0; i<4; i++) // store io_vec x->x_io_ptr_beg[i] = sp[i]->s_vec; x->x_w_array_mem_beg = NLMS_tilde_check_array(x->x_w_array_sym_name, x->x_n_order); if(!x->x_w_array_mem_beg) dsp_add(NLMS_tilde_perform_zero, 2, x, n); else dsp_add(NLMS_tilde_perform, 2, x, n); } /* setup/setdown things */ static void NLMS_tilde_free(t_NLMS_tilde *x) { freebytes(x->x_in_hist, 2*x->x_n_order*sizeof(t_float)); } static void *NLMS_tilde_new(t_symbol *s, t_int argc, t_atom *argv) { t_NLMS_tilde *x = (t_NLMS_tilde *)pd_new(NLMS_tilde_class); t_int i, n_order=39; t_symbol *w_name; t_float beta=0.1f; t_float gammax=0.00001f; if((argc >= 4) && IS_A_FLOAT(argv,0) && //IS_A_FLOAT/SYMBOL from iemlib.h IS_A_FLOAT(argv,1) && IS_A_FLOAT(argv,2) && IS_A_SYMBOL(argv,3)) { n_order = (t_int)atom_getintarg(0, argc, argv); beta = (t_float)atom_getfloatarg(1, argc, argv); gammax = (t_float)atom_getfloatarg(2, argc, argv); w_name = (t_symbol *)atom_getsymbolarg(3, argc, argv); if(beta < 0.0f) beta = 0.0f; if(beta > 2.0f) beta = 2.0f; if(gammax < 0.0f) gammax = 0.0f; if(gammax > 1.0f) gammax = 1.0f; if(n_order < 2) n_order = 2; if(n_order > 11111) n_order = 11111; inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_signal, &s_signal); outlet_new(&x->x_obj, &s_signal); outlet_new(&x->x_obj, &s_signal); x->x_msi = 0; x->x_n_order = n_order; x->x_update = 0; x->x_beta = beta; x->x_gamma = gammax; // 2 times in and one time desired_in memory allocation (history) x->x_in_hist = (t_float *)getbytes(2*x->x_n_order*sizeof(t_float)); // table-symbols will be linked to their memory in future (dsp_routine) x->x_w_array_sym_name = gensym(w_name->s_name); x->x_w_array_mem_beg = (t_float *)0; return(x); } else { post("NLMS~-ERROR: need 3 float- + 1 symbol-arguments:"); post(" order_of_filter + learnrate_beta + security_value + array_name_taps"); return(0); } } void NLMS_tilde_setup(void) { NLMS_tilde_class = class_new(gensym("NLMS~"), (t_newmethod)NLMS_tilde_new, (t_method)NLMS_tilde_free, sizeof(t_NLMS_tilde), 0, A_GIMME, 0); CLASS_MAINSIGNALIN(NLMS_tilde_class, t_NLMS_tilde, x_msi); class_addmethod(NLMS_tilde_class, (t_method)NLMS_tilde_dsp, gensym("dsp"), 0); class_addmethod(NLMS_tilde_class, (t_method)NLMS_tilde_update, gensym("update"), A_FLOAT, 0); // method: downsampling factor of learning (multiple of 2^N) class_addmethod(NLMS_tilde_class, (t_method)NLMS_tilde_beta, gensym("beta"), A_FLOAT, 0); //method: normalized learning rate class_addmethod(NLMS_tilde_class, (t_method)NLMS_tilde_gamma, gensym("gamma"), A_FLOAT, 0); // method: dithering noise related to signal //class_sethelpsymbol(NLMS_tilde_class, gensym("iemhelp2/NLMS~")); } iem_utils-v0.0.20180206/iem_adaptfilt/src/makefile_win0000644000175000017500000000205412630366344022642 0ustar zmoelnigzmoelnig all: ..\iem_adaptfilt.dll VIS_CPP_PATH = "C:\Programme\Microsoft Visual Studio\Vc98" PD_INST_PATH = "C:\Programme\pd" PD_WIN_INCLUDE_PATH = /I. /I$(PD_INST_PATH)\src /I$(VIS_CPP_PATH)\include PD_WIN_C_FLAGS = /nologo /W3 /WX /DMSW /DNT /DPD /DWIN32 /DWINDOWS /Ox -DPA_LITTLE_ENDIAN PD_WIN_L_FLAGS = /nologo PD_WIN_LIB = /NODEFAULTLIB:libc /NODEFAULTLIB:oldnames /NODEFAULTLIB:kernel /NODEFAULTLIB:uuid \ $(VIS_CPP_PATH)\lib\libc.lib \ $(VIS_CPP_PATH)\lib\oldnames.lib \ $(VIS_CPP_PATH)\lib\kernel32.lib \ $(VIS_CPP_PATH)\lib\wsock32.lib \ $(VIS_CPP_PATH)\lib\winmm.lib \ $(PD_INST_PATH)\bin\pthreadVC.lib \ $(PD_INST_PATH)\bin\pd.lib SRC = NLMS~.c \ NLMSerr_in~.c \ NLMSCC~.c \ n_CNLMS~.c \ n_CLNLMS~.c \ iem_adaptfilt.c OBJ = $(SRC:.c=.obj) .c.obj: cl $(PD_WIN_C_FLAGS) $(PD_WIN_INCLUDE_PATH) /c $*.c ..\iem_adaptfilt.dll: $(OBJ) link $(PD_WIN_L_FLAGS) /dll /export:iem_adaptfilt_setup \ /out:..\iem_adaptfilt.dll $(OBJ) $(PD_WIN_LIB) clean: del *.obj iem_utils-v0.0.20180206/iem_adaptfilt/src/iem_adaptfilt.dsp0000644000175000017500000000511312630366344023576 0ustar zmoelnigzmoelnig# Microsoft Developer Studio Project File - Name="iem_adaptfilt" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** NICHT BEARBEITEN ** # TARGTYPE "Win32 (x86) External Target" 0x0106 CFG=iem_adaptfilt - Win32 Debug !MESSAGE Dies ist kein gültiges Makefile. Zum Erstellen dieses Projekts mit NMAKE !MESSAGE verwenden Sie den Befehl "Makefile exportieren" und führen Sie den Befehl !MESSAGE !MESSAGE NMAKE /f "iem_adaptfilt.mak". !MESSAGE !MESSAGE Sie können beim Ausführen von NMAKE eine Konfiguration angeben !MESSAGE durch Definieren des Makros CFG in der Befehlszeile. Zum Beispiel: !MESSAGE !MESSAGE NMAKE /f "iem_adaptfilt.mak" CFG="iem_adaptfilt - Win32 Debug" !MESSAGE !MESSAGE Für die Konfiguration stehen zur Auswahl: !MESSAGE !MESSAGE "iem_adaptfilt - Win32 Release" (basierend auf "Win32 (x86) External Target") !MESSAGE "iem_adaptfilt - Win32 Debug" (basierend auf "Win32 (x86) External Target") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" !IF "$(CFG)" == "iem_adaptfilt - Win32 Release" # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "Release" # PROP BASE Intermediate_Dir "Release" # PROP BASE Cmd_Line "NMAKE /f makefile_win" # PROP BASE Rebuild_Opt "/a" # PROP BASE Target_File "makefile_win.exe" # PROP BASE Bsc_Name "makefile_win.bsc" # PROP BASE Target_Dir "" # PROP Use_Debug_Libraries 0 # PROP Output_Dir "Release" # PROP Intermediate_Dir "Release" # PROP Cmd_Line "NMAKE /f makefile_win" # PROP Rebuild_Opt "/a" # PROP Target_File "iem_adaptfilt.exe" # PROP Bsc_Name "iem_adaptfilt.bsc" # PROP Target_Dir "" !ELSEIF "$(CFG)" == "iem_adaptfilt - Win32 Debug" # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "Debug" # PROP BASE Intermediate_Dir "Debug" # PROP BASE Cmd_Line "NMAKE /f makefile_win" # PROP BASE Rebuild_Opt "/a" # PROP BASE Target_File "makefile_win.exe" # PROP BASE Bsc_Name "makefile_win.bsc" # PROP BASE Target_Dir "" # PROP Use_Debug_Libraries 1 # PROP Output_Dir "Debug" # PROP Intermediate_Dir "Debug" # PROP Cmd_Line "NMAKE /f makefile_win" # PROP Rebuild_Opt "/a" # PROP Target_File "iem_adaptfilt.exe" # PROP Bsc_Name "iem_adaptfilt.bsc" # PROP Target_Dir "" !ENDIF # Begin Target # Name "iem_adaptfilt - Win32 Release" # Name "iem_adaptfilt - Win32 Debug" !IF "$(CFG)" == "iem_adaptfilt - Win32 Release" !ELSEIF "$(CFG)" == "iem_adaptfilt - Win32 Debug" !ENDIF # Begin Source File SOURCE=.\makefile_win # End Source File # End Target # End Project iem_utils-v0.0.20180206/iem_adaptfilt/src/Make.config.in0000644000175000017500000000122712630366344022737 0ustar zmoelnigzmoelnigLIBNAME=@LIBNAME@ # when build as a library this holds a pre-processor define # (e.g. "-DBUILD_LIBRARY") # when build as single externals this is empty BUILDLIBRARY =@BUILDLIBRARY@ PREFIX =@prefix@@PDLIBDIR@ INSTALL_BIN=$(DESTDIR)$(PREFIX)/extra/$(LIBNAME) INSTALL_DOC=$(DESTDIR)$(PREFIX)/@REFERENCEPATH@$(LIBNAME) EXT = @EXT@ DEFS = @DFLAGS@ IFLAGS = -I. @INCLUDES@ $(INCLUDES) MAKEDEP_FLAGS = @MAKEDEP_FLAGS@ CC = @CC@ LD = @LD@ STRIP = @STRIP@ STRIPFLAGS= @STRIPFLAGS@ AFLAGS = LFLAGS = @LFLAGS@ WFLAGS = TARNAME = $(LIBNAME).tgz CONFIGUREFLAGS = @CONFIGUREFLAGS@ CFLAGS = $(DEFS) $(IFLAGS) $(BUILDLIBRARY) -DPD $(WFLAGS) @CFLAGS@ LIBS = @LIBS@ iem_utils-v0.0.20180206/iem_adaptfilt/src/n_CNLMS~.c0000644000175000017500000003501712661105566022026 0ustar zmoelnigzmoelnig/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. n_CNLMS multichannel-constrained (non leaky) normalized LMS algorithm lib iem_adaptfilt written by Markus Noisternig & Thomas Musil noisternig_AT_iem.at; musil_AT_iem.at (c) Institute of Electronic Music and Acoustics, Graz Austria 2005 */ #ifdef NT #pragma warning( disable : 4244 ) #pragma warning( disable : 4305 ) #endif #include "m_pd.h" #include "iemlib.h" #include #include #include /* ----------------------- n_CNLMS~ ------------------------------ */ /* -- multi-channel Constraint Normalized Least Mean Square (linear adaptive FIR-filter) -- */ /* -- first input: reference signal -- */ /* -- second input: desired signal -- */ /* -- -- */ /* for further information on adaptive filter design we refer to */ /* [1] Haykin, "Adaptive Filter Theory", 4th ed, Prentice Hall */ /* [2] Benesty, "Adaptive Signal Processing", Springer */ typedef struct n_CNLMS_tilde_kern { t_symbol *x_w_array_sym_name; t_float *x_w_array_mem_beg; t_float *x_in_ptr_beg;// memory: sig-in vector t_float *x_out_ptr_beg;// memory: sig-out vector t_float *x_in_hist;// start point double buffer for sig-in history } t_n_CNLMS_tilde_kern; typedef struct n_CNLMS_tilde { t_object x_obj; t_n_CNLMS_tilde_kern *x_my_kern; t_float *x_des_in_ptr_beg;// memory: desired-in vector t_float *x_err_out_ptr_beg;// memory: error-out vector t_int x_n_io;// number of in-channels and filtered out-channels t_int x_rw_index;// read-write-index t_int x_n_order;// filter order t_int x_update;// rounded by 2^n, yields downsampling of update rate t_float x_beta;// learn rate [0 .. 2] t_float x_gamma;// normalization t_float x_kappa;// constraint: threshold of energy (clipping) t_outlet *x_out_compressing_bang; t_clock *x_clock; t_float x_msi; } t_n_CNLMS_tilde; t_class *n_CNLMS_tilde_class; static void n_CNLMS_tilde_tick(t_n_CNLMS_tilde *x) { outlet_bang(x->x_out_compressing_bang); } static t_float *n_CNLMS_tilde_check_array(t_symbol *array_sym_name, t_int length) { int n_points; t_garray *a; t_float *vec; if(!(a = (t_garray *)pd_findbyclass(array_sym_name, garray_class))) { error("%s: no such array for n_CNLMS~", array_sym_name->s_name); return((t_float *)0); } else if(!garray_getfloatarray(a, &n_points, &vec)) { error("%s: bad template for n_CNLMS~", array_sym_name->s_name); return((t_float *)0); } else if(n_points < length) { error("%s: bad array-size for n_CNLMS~: %d", array_sym_name->s_name, n_points); return((t_float *)0); } else { return(vec); } } static void n_CNLMS_tilde_beta(t_n_CNLMS_tilde *x, t_floatarg f) // learn rate { if(f < 0.0f) f = 0.0f; if(f > 2.0f) f = 2.0f; x->x_beta = f; } static void n_CNLMS_tilde_gamma(t_n_CNLMS_tilde *x, t_floatarg f) // regularization (dither) { if(f < 0.0f) f = 0.0f; if(f > 1.0f) f = 1.0f; x->x_gamma = f; } static void n_CNLMS_tilde_kappa(t_n_CNLMS_tilde *x, t_floatarg f) // threshold for w_coeff { if(f < 0.0001f) f = 0.0001f; if(f > 10000.0f) f = 10000.0f; x->x_kappa = f; } static void n_CNLMS_tilde_update(t_n_CNLMS_tilde *x, t_floatarg f) // downsampling of learn rate { t_int i=1, u = (t_int)f; if(u < 0) u = 0; else { while(i <= u) // convert u for 2^N i *= 2; // round downward i /= 2; u = i; } x->x_update = u; } /* ============== DSP ======================= */ static t_int *n_CNLMS_tilde_perform_zero(t_int *w) { t_n_CNLMS_tilde *x = (t_n_CNLMS_tilde *)(w[1]); t_int n = (t_int)(w[2]); t_int n_io = x->x_n_io; t_float *out; t_int i, j; out = x->x_err_out_ptr_beg; for(i=0; ix_my_kern[j].x_out_ptr_beg; for(i=0; ix_n_order; /* filter-order */ t_int rw_index2, rw_index = x->x_rw_index; t_int n_io = x->x_n_io; t_float *in;// first sig in t_float din;// second sig in t_float *filt_out;// first sig out t_float *err_out, err_sum;// second sig out t_float *read_in_hist; t_float *w_filt_coeff; t_float my, my_err, sum; t_float beta = x->x_beta; t_float hgamma, gammax = x->x_gamma; t_float hkappa, kappa = x->x_kappa; t_int i, j, k, update_counter; t_int update = x->x_update; t_int ord8=n_order&0xfffffff8; t_int ord_residual=n_order&0x7; t_int compressed = 0; for(k=0; kx_my_kern[k].x_w_array_mem_beg) goto n_CNLMS_tildeperfzero;// this is Musil/Miller style } hgamma = gammax * gammax * (float)n_order; //hkappa = kappa * kappa * (float)n_order; hkappa = kappa;// kappa regards to energy value, else use line above for(i=0, update_counter=0; ix_my_kern[k].x_in_hist[rw_index] = x->x_my_kern[k].x_in_ptr_beg[i]; // save inputs into variabel & history x->x_my_kern[k].x_in_hist[rw_index+n_order] = x->x_my_kern[k].x_in_ptr_beg[i]; } din = x->x_des_in_ptr_beg[i]; // begin convolution err_sum = din; for(k=0; kx_my_kern[k].x_w_array_mem_beg; // Musil's special convolution buffer struct read_in_hist = &x->x_my_kern[k].x_in_hist[rw_index2]; for(j=0; jx_my_kern[k].x_out_ptr_beg[i] = sum; err_sum -= sum; } x->x_err_out_ptr_beg[i] = err_sum; // end convolution if(update) // downsampling of learn rate { update_counter++; if(update_counter >= update) { update_counter = 0; for(k=0; kx_my_kern[k].x_in_hist[rw_index2]; for(j=0; jx_my_kern[k].x_w_array_mem_beg; read_in_hist = &x->x_my_kern[k].x_in_hist[rw_index2]; sum = 0.0f; for(j=0; j hkappa) { compressed = 1; my = sqrt(hkappa/sum); w_filt_coeff = x->x_my_kern[k].x_w_array_mem_beg; for(j=0; j= n_order) rw_index -= n_order; } x->x_rw_index = rw_index; // back to start if(compressed) clock_delay(x->x_clock, 0); return(w+3); n_CNLMS_tildeperfzero: err_out = x->x_err_out_ptr_beg; for(i=0; ix_my_kern[j].x_out_ptr_beg; for(i=0; is_n; t_int ok_w = 1; t_int m = x->x_n_io; for(i=0; ix_my_kern[i].x_in_ptr_beg = sp[i]->s_vec; x->x_des_in_ptr_beg = sp[m]->s_vec; for(i=0; ix_my_kern[i].x_out_ptr_beg = sp[i+m+1]->s_vec; x->x_err_out_ptr_beg = sp[2*m+1]->s_vec; for(i=0; ix_my_kern[i].x_w_array_mem_beg = n_CNLMS_tilde_check_array(x->x_my_kern[i].x_w_array_sym_name, x->x_n_order); if(!x->x_my_kern[i].x_w_array_mem_beg) ok_w = 0; } if(!ok_w) dsp_add(n_CNLMS_tilde_perform_zero, 2, x, n); else dsp_add(n_CNLMS_tilde_perform, 2, x, n); } /* setup/setdown things */ static void n_CNLMS_tilde_free(t_n_CNLMS_tilde *x) { t_int i, n_io=x->x_n_io, n_order=x->x_n_order; for(i=0; ix_my_kern[i].x_in_hist, 2*x->x_n_order*sizeof(t_float)); freebytes(x->x_my_kern, n_io*sizeof(t_n_CNLMS_tilde_kern)); clock_free(x->x_clock); } static void *n_CNLMS_tilde_new(t_symbol *s, t_int argc, t_atom *argv) { t_n_CNLMS_tilde *x = (t_n_CNLMS_tilde *)pd_new(n_CNLMS_tilde_class); char buffer[400]; int i; t_int n_order=39, n_io=1; t_symbol *w_name; t_float beta=0.1f; t_float gammax=0.00001f; t_float kappa = 1.0f; if((argc >= 6) && IS_A_FLOAT(argv,0) && //IS_A_FLOAT/SYMBOL from iemlib.h IS_A_FLOAT(argv,1) && IS_A_FLOAT(argv,2) && IS_A_FLOAT(argv,3) && IS_A_FLOAT(argv,4) && IS_A_SYMBOL(argv,5)) { n_io = (t_int)atom_getintarg(0, argc, argv); n_order = (t_int)atom_getintarg(1, argc, argv); beta = (t_float)atom_getfloatarg(2, argc, argv); gammax = (t_float)atom_getfloatarg(3, argc, argv); kappa = (t_float)atom_getfloatarg(4, argc, argv); w_name = (t_symbol *)atom_getsymbolarg(5, argc, argv); if(beta < 0.0f) beta = 0.0f; if(beta > 2.0f) beta = 2.0f; if(gammax < 0.0f) gammax = 0.0f; if(gammax > 1.0f) gammax = 1.0f; if(kappa < 0.0001f) kappa = 0.0001f; if(kappa > 10000.0f) kappa = 10000.0f; if(n_order < 2) n_order = 2; if(n_order > 11111) n_order = 11111; if(n_io < 1) n_io = 1; if(n_io > 60) n_io = 60; for(i=0; ix_obj, &x->x_obj.ob_pd, &s_signal, &s_signal); for(i=0; i<=n_io; i++) outlet_new(&x->x_obj, &s_signal); x->x_out_compressing_bang = outlet_new(&x->x_obj, &s_bang); x->x_msi = 0; x->x_n_io = n_io; x->x_n_order = n_order; x->x_update = 0; x->x_beta = beta; x->x_gamma = gammax; x->x_kappa = kappa; x->x_my_kern = (t_n_CNLMS_tilde_kern *)getbytes(x->x_n_io*sizeof(t_n_CNLMS_tilde_kern)); for(i=0; is_name); x->x_my_kern[i].x_w_array_sym_name = gensym(buffer); x->x_my_kern[i].x_w_array_mem_beg = (t_float *)0; x->x_my_kern[i].x_in_hist = (t_float *)getbytes(2*x->x_n_order*sizeof(t_float)); } x->x_clock = clock_new(x, (t_method)n_CNLMS_tilde_tick); return(x); } else { post("n_CNLMSC~-ERROR: need 5 float- + 1 symbol-arguments:"); post(" number_of_filters + order_of_filters + learnrate_beta + security_value_gamma + threshold_kappa + array_name_taps"); return(0); } } void n_CNLMS_tilde_setup(void) { n_CNLMS_tilde_class = class_new(gensym("n_CNLMS~"), (t_newmethod)n_CNLMS_tilde_new, (t_method)n_CNLMS_tilde_free, sizeof(t_n_CNLMS_tilde), 0, A_GIMME, 0); CLASS_MAINSIGNALIN(n_CNLMS_tilde_class, t_n_CNLMS_tilde, x_msi); class_addmethod(n_CNLMS_tilde_class, (t_method)n_CNLMS_tilde_dsp, gensym("dsp"), 0); class_addmethod(n_CNLMS_tilde_class, (t_method)n_CNLMS_tilde_update, gensym("update"), A_FLOAT, 0); // method: downsampling factor of learning (multiple of 2^N) class_addmethod(n_CNLMS_tilde_class, (t_method)n_CNLMS_tilde_beta, gensym("beta"), A_FLOAT, 0); //method: normalized learning rate class_addmethod(n_CNLMS_tilde_class, (t_method)n_CNLMS_tilde_gamma, gensym("gamma"), A_FLOAT, 0); // method: dithering noise related to signal class_addmethod(n_CNLMS_tilde_class, (t_method)n_CNLMS_tilde_kappa, gensym("kappa"), A_FLOAT, 0); // method: threshold for compressing w_coeff //class_sethelpsymbol(n_CNLMS_tilde_class, gensym("iemhelp2/n_CNLMS~")); } iem_utils-v0.0.20180206/iem_adaptfilt/src/configure.ac0000644000175000017500000001330612630366344022555 0ustar zmoelnigzmoelnigdnl Process this file with autoconf to produce a configure script. AC_INIT(iem_adaptfilt.c) LIBNAME=iem_adaptfilt dnl Checks for programs. AC_PROG_CC AC_SUBST(STK) AC_SUBST(DFLAGS) AC_SUBST(LFLAGS) AC_SUBST(EXT) AC_SUBST(LD) AC_SUBST(STRIP) AC_SUBST(STRIPFLAGS) AC_SUBST(IEMMATRIX_VERSION) AC_SUBST(REFERENCEPATH) AC_SUBST(PDLIBDIR) AC_SUBST(INCLUDES) AC_SUBST(LIBNAME) AC_SUBST(CONFIGUREFLAGS) AC_SUBST(BUILDLIBRARY) ## store the flags passed to us ## is there no way to get the flags without quotes? #CONFIGUREFLAGS=${ac_configure_args} ## and is this solution portable? time will show.... CONFIGUREFLAGS=$(echo ${ac_configure_args} | sed "s/'//g") AC_ARG_WITH(pdversion, [ --with-pdversion= enforce a certain pd-version (e.g. 0.37)]) AC_ARG_WITH(extension, [ --with-extension= enforce a certain extension for the dynamic library (e.g. dll)]) AC_ARG_WITH(pdpath, [ --with-pd= where to look for pd-headers and and -libs]) AC_ARG_ENABLE(PIC, [ --disable-PIC disable compilation with PIC-flag]) AC_ARG_ENABLE(library,[ --disable-library split the library into single externals]) if test "xno" != "x${enable_library}" ; then dnl LATER: find a more generic way to generate the .._LIBRARY define BUILDLIBRARY="-DBUILD_LIBRARY" fi dnl Checks for libraries. dnl Replace `main' with a function in -lc: AC_CHECK_LIB(c, main) AC_CHECK_LIB(crtdll, fclose) dnl Replace `main' with a function in -lm: AC_CHECK_LIB(m, main) dnl Replace `main' with a function in -lpthread: dnl AC_CHECK_LIB(pthread, main) dnl Replace `main' with a function in -lstk: dnl AC_CHECK_LIB(stk, main, STK=yes) if test "x$with_pd" != "x"; then if test -d "${with_pd}/src"; then INCLUDES="-I${with_pd}/src ${INCLUDES}" fi if test -d "${with_pd}/bin"; then LIBS="-L${with_pd}/bin ${LIBS}" fi fi if test "x$includedir" != "x"; then for id in $includedir do if test -d $id; then INCLUDES="-I$id $INCLUDES"; fi done fi if test "x$libdir" != "x"; then for id in $libdir do if test -d $id; then LIBS="-L$id $LIBS"; fi done fi AC_CHECK_LIB(pd, nullfn) dnl Checks for header files. AC_HEADER_STDC AC_CHECK_HEADERS(stdlib.h stdio.h string.h math.h time.h sys/time.h) dnl Checks for typedefs, structures, and compiler characteristics. AC_HEADER_TIME dnl Checks for library functions. AC_FUNC_MMAP AC_CHECK_FUNCS(select socket strerror) ### make-depend flags if test "x$ac_cv_c_compiler_gnu" = "xyes"; then AC_SUBST(MAKEDEP_FLAGS, "-MM") else AC_SUBST(MAKEDEP_FLAGS, "-M") fi dnl check for "-mms-bitfields" cflag dnl why is there no generic compiler-check for a given flag ? dnl it would make things so easy: AC_CHECK_FLAG([-mms-bitfields],,) AC_MSG_CHECKING("ms-bitfields") cat > conftest.c << EOF int main(){ return 0; } EOF if ${CC} ${INCLUDES} ${DFLAGS} -o conftest.o conftest.c ${CFLAGS} -mms-bitfields > /dev/null 2>&1 then echo "yes" CFLAGS="${CFLAGS} -mms-bitfields" else echo "no" fi dnl isn't there a better way to check for good linker/stripper ? dnl if we don't have $LD set, we set it to $(CC) dnl LD=${LD:=$CC} if test "x$LD" = "x" then if test "x$host" != "x" then LD=${host}-ld if $(which ${LD} > /dev/null) then : else LD="" fi fi fi LD=${LD:=$CC} dnl if we don't have $STRIP set, we set it to ${host}-strip or strip AC_CHECK_TOOL([STRIP], [strip], [true]) AC_MSG_CHECKING([if strip is GNU strip]) if $STRIP -V 2>&1 | grep GNU > /dev/null then AC_SUBST(STRIPFLAGS, "--strip-unneeded") AC_MSG_RESULT([yes]) else AC_SUBST(STRIPFLAGS,"-x") AC_MSG_RESULT([no]) fi DFLAGS="" if test "x$enable_PIC" != "xno"; then AC_MSG_CHECKING("PIC") cat > conftest.c << EOF int main(){ return 0; } EOF if ${CC} ${INCLUDES} ${DFLAGS} -o conftest.o conftest.c ${CFLAGS} -fPIC > /dev/null 2>&1 then echo "yes" CFLAGS="${CFLAGS} -fPIC" else echo "no" fi fi dnl dnl OK, checks for machines are here now dnl if test `uname -s` = Linux; then LFLAGS="-export_dynamic -shared" CFLAGS="$CFLAGS" EXT=pd_linux fi dnl This should use '-bundle_loader /path/to/pd/bin/pd' instead of'-undefined suppress' dnl then strip might do something if test `uname -s` = Darwin; then LD=cc LFLAGS="-bundle -undefined suppress -flat_namespace" EXT=pd_darwin fi if test `uname | sed -e 's/^MINGW.*/NT/'` = NT; then LD=gcc INCLUDES="-I@prefix@/src" DFLAGS="-D__WIN32__" LFLAGS="-shared @prefix@/bin/pd.dll" EXT=dll else PDLIBDIR="/lib/pd" fi if test `uname -s` = IRIX64; then LFLAGS="-n32 -DUNIX -DIRIX -DN32 -woff 1080,1064,1185 \ -OPT:roundoff=3 -OPT:IEEE_arithmetic=3 -OPT:cray_ivdep=true \ -shared -rdata_shared" EXT=pd_irix6 dnl DFLAGS="-DUNIX -DIRIX6" fi if test `uname -s` = IRIX32; then LFLAGS="-o32 -DUNIX -DIRIX -O2 -shared -rdata_shared" EXT=pd_irix5 dnl DFLAGS="-DUNIX -DIRIX5" fi if test "x$with_extension" != "x" then EXT=$with_extension fi dnl Checks for pd-version, to set the correct help-path AC_MSG_CHECKING("pd\>=0.37") if test "$with_pdversion" != "" then echo -n "($with_pdversion)... " PD_VERSION="$with_pdversion" else if test "x$cross_compiling" = "xno" then cat > conftest.c << EOF #include #include "m_pd.h" int main(){ printf("%d.%d\n", PD_MAJOR_VERSION, PD_MINOR_VERSION); return 0; } EOF if $CC $INCLUDES -o conftest.o conftest.c > /dev/null 2>&1 then PD_VERSION=`./conftest.o` else PD_VERSION="" fi echo -n $PD_VERSION else dnl we are cross-compiling... echo -n "(X)..." PD_VERSION="0.38" fi fi let PD_MAJORVERSION=`echo $PD_VERSION | cut -d"." -f1`+0 let PD_MINORVERSION=`echo $PD_VERSION | cut -d"." -f2`+0 if test "$PD_MAJORVERSION" -gt 0 || test "$PD_MINORVERSION" -ge 37 then REFERENCEPATH=extra/ echo " yes" else REFERENCEPATH=doc/5.reference/ echo " no" fi AC_OUTPUT(Make.config) rm -f conftest.* iem_utils-v0.0.20180206/iem_adaptfilt/VERSION.txt0000644000175000017500000000000512630366344021356 0ustar zmoelnigzmoelnig1.02 iem_utils-v0.0.20180206/iem_adaptfilt/help/0000755000175000017500000000000012630366344020425 5ustar zmoelnigzmoelnigiem_utils-v0.0.20180206/iem_adaptfilt/help/n_CNLMS~-help.pd0000644000175000017500000001707212630366344023276 0ustar zmoelnigzmoelnig#N canvas 170 22 1021 882 10; #N canvas 0 0 450 300 graph1 0; #X array 1_W 40 float 0; #X coords 0 1 39 -1 200 140 1; #X restore 64 519 graph; #X msg 40 247 update \$1; #X msg 117 257 beta \$1; #X obj 456 26 tgl 15 0 empty empty empty 0 -6 0 8 -225280 -1 -1 0 1 ; #X obj 456 47 dsp; #X floatatom 456 93 5 0 0 0 - - -; #X floatatom 469 72 5 0 0 0 - - -; #X obj 452 463 bng 15 150 20 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 68 277 noise~; #X obj 40 60 vradio 15 1 0 8 empty empty empty 0 -6 0 8 -225280 -1 -1 0; #N canvas 165 115 464 314 /SUBPATCH/ 0; #X obj 76 61 inlet; #X msg 32 163 0; #X msg 63 159 1; #X msg 97 158 2; #X msg 132 156 4; #X msg 159 157 8; #X msg 191 162 16; #X msg 219 164 32; #X msg 248 165 64; #X obj 76 84 sel 0 1 2 3 4 5 6 7; #X obj 32 217 outlet; #X connect 0 0 9 0; #X connect 1 0 10 0; #X connect 2 0 10 0; #X connect 3 0 10 0; #X connect 4 0 10 0; #X connect 5 0 10 0; #X connect 6 0 10 0; #X connect 7 0 10 0; #X connect 8 0 10 0; #X connect 9 0 1 0; #X connect 9 1 2 0; #X connect 9 2 3 0; #X connect 9 3 4 0; #X connect 9 4 5 0; #X connect 9 5 6 0; #X connect 9 6 7 0; #X connect 9 7 8 0; #X restore 40 207 pd; #X text 22 41 internal downsampling of update; #X msg 75 339 gamma \$1; #X text 90 365 input signal; #X text 335 364 desired signal; #N canvas 0 0 450 300 graph1 0; #X array IR 40 float 0; #X coords 0 1 39 -1 200 140 1; #X restore 240 25 graph; #X obj 69 462 unsig~; #X floatatom 69 488 9 0 0 0 - - -; #X obj 155 462 unsig~; #X floatatom 155 488 9 0 0 0 - - -; #X text 426 364 d(n); #X obj 516 270 loadbang; #X text 704 47 (array-sizes have to be >= then FIR_size); #X text 654 37 1.arg: number of order of FIR-filter; #X text 57 73 update every sample; #X text 57 58 stop \, no update; #X text 57 88 update every 2nd sample; #X text 57 103 update every 4th sample; #X text 57 118 update every 8th sample; #X text 57 133 update every 16th sample; #X text 57 148 update every 32nd sample; #X text 57 163 update every 64th sample; #N canvas 0 0 486 336 /SUBPATCH/ 0; #X obj 48 46 inlet; #X obj 205 47 inlet; #X msg 205 71 \; IR const 0; #X obj 92 84 loadbang; #X msg 48 120 \; IR 0 0 0 0 0 0 0.314287 0.8 0.75 0 0 0 0 -0.7 -0.65 0 0 0 0.157143 0.128572 0 0 -0.128572 -0.1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0; #X connect 0 0 4 0; #X connect 1 0 2 0; #X connect 3 0 4 0; #X restore 517 245 pd; #X obj 530 227 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X text 547 224 clear; #X obj 517 208 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X text 534 205 load; #X text 579 214 IR; #X text 19 397 filtered output signal; #X text 339 396 error signal; #X text 469 457 constrain; #X text 469 467 coefficients; #X msg 452 422 0; #X obj 452 442 speedlim 100; #X obj 110 414 cnv 8 1 1 empty empty * 0 7 0 14 -262144 -1 0; #N canvas 0 0 482 332 /SUBPATCH/ 0; #X obj 137 73 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 1 1 ; #X msg 137 115 39; #X msg 92 190 \$1 39; #X msg 136 53 1; #X obj 137 92 metro 200; #X obj 136 24 inlet; #X obj 92 169 tabread 1_W; #X obj 92 214 tabwrite 1_W; #X msg 177 192 \$1 39; #X msg 260 191 \$1 39; #X obj 260 170 tabread 3_W; #X obj 260 215 tabwrite 3_W; #X obj 177 171 tabread 2_W; #X obj 177 216 tabwrite 2_W; #X connect 0 0 4 0; #X connect 1 0 6 0; #X connect 1 0 12 0; #X connect 1 0 10 0; #X connect 2 0 7 0; #X connect 3 0 0 0; #X connect 4 0 1 0; #X connect 5 0 3 0; #X connect 6 0 2 0; #X connect 8 0 13 0; #X connect 9 0 11 0; #X connect 10 0 9 0; #X connect 12 0 8 0; #X restore 516 291 pd; #X text 541 297 update of W; #X text 540 286 graphical; #X text 111 319 minimum input value; #X msg 117 220 0.1; #X msg 75 301 1e-05; #X text 170 258 beta [0 .. 2]; #X text 131 338 gamma [0 .. 1]; #X obj 574 38 cnv 15 68 17 empty empty empty 20 12 0 14 -225280 -66577 0; #N canvas 0 0 568 372 FORMULAS 0; #X obj 167 52 cnv 15 150 40 empty empty empty 20 12 0 14 -225280 -66577 0; #X obj 167 123 cnv 15 270 50 empty empty empty 20 12 0 14 -225280 -66577 0; #X obj 167 205 cnv 15 260 30 empty empty empty 20 12 0 14 -225280 -66577 0; #X text 280 129 beta; #X text 231 146 >; #X text 232 144 _; #X text 232 138 _; #X text 277 141 2; #X text 340 141 2; #X text 311 146 gamma * blocksize); #X text 294 146 +; #X text 243 146 x[n-i]; #X text 174 135 my(n) =; #X text 223 130 _________________________________; #X text 6 135 normalized learn rate:; #X text 173 54 y(n) = W * x(n); #X obj 225 56 cnv 11 1 1 empty empty * 0 9 0 14 -225280 -1 0; #X text 173 72 e(n) = d(n) - W * x(n); #X obj 267 74 cnv 11 1 1 empty empty * 0 9 0 14 -225280 -1 0; #X text 119 73 error:; #X text 116 55 output:; #X text 7 212 coefficient iteration:; #X text 176 213 W(k+1 \, i) = W(k \, i) + my(n)* e(n)* x(n); #X restore 573 39 pd FORMULAS; #X obj 117 240 cnv 14 31 14 empty empty empty 20 12 0 14 -225280 -66577 0; #X floatatom 117 240 5 0 2 0 - - -; #X text 153 239 learn-rate; #X obj 75 321 cnv 14 31 14 empty empty empty 20 12 0 14 -225280 -66577 0; #X floatatom 75 321 5 0 1 0 - - -; #X floatatom 40 228 5 0 0 0 - - -; #X text 572 14 Normalized Least Mean Square (linear adaptive FIR-filter) ; #N canvas 0 0 450 300 graph1 0; #X array 2_W 40 float 0; #X coords 0 1 39 -1 200 140 1; #X restore 314 519 graph; #N canvas 0 0 450 300 graph1 0; #X array 3_W 40 float 0; #X coords 0 1 39 -1 200 140 1; #X restore 564 519 graph; #X obj 68 382 n_CNLMS~ 3 32 0.1 1e-05 1 W _______________________________ ; #X obj 244 463 unsig~; #X floatatom 244 489 9 0 0 0 - - -; #X obj 334 461 unsig~; #X floatatom 334 487 9 0 0 0 - - -; #X text 304 233 minimum input value; #X obj 268 235 cnv 14 31 14 empty empty empty 20 12 0 14 -225280 -66577 0; #X floatatom 268 235 5 0 10000 0 - - -; #X msg 268 253 kappa \$1; #X text 324 252 kappa [0 .. 1]; #X msg 268 215 1; #X obj 423 293 FIR~ IR 32; #X obj 186 293 z~ 2; #X obj 304 293 z~ 4; #X text 41 365 x1(n); #X text 272 365 x3(n); #X text 191 364 x2(n); #X text 39 410 y1(n) = 1_W * x1(n); #X obj 196 429 cnv 8 1 1 empty empty * 0 7 0 14 -262144 -1 0; #X obj 286 403 cnv 8 1 1 empty empty * 0 7 0 14 -262144 -1 0; #X text 125 425 y2(n) = 2_W * x2(n); #X text 215 399 y3(n) = 3_W * x3(n); #X obj 375 425 cnv 8 1 1 empty empty * 0 7 0 14 -262144 -1 0; #X text 341 421 - 1_W * x1(n); #X text 312 410 e(n) = d(n); #X obj 375 435 cnv 8 1 1 empty empty * 0 7 0 14 -262144 -1 0; #X text 341 431 - 2_W * x2(n); #X obj 375 445 cnv 8 1 1 empty empty * 0 7 0 14 -262144 -1 0; #X text 341 441 - 3_W * x3(n); #X text 572 3 Multi Channel Constraint; #X msg 463 139 \; 1_W const 0 \; 2_W const 0 \; 3_W const 0; #X text 462 117 RESET TABLES; #X text 654 150 (C) 2005 \, m.noisternig & t.musil \, IEM \, Graz \, Austria; #X text 682 163 [noisternig \, musil]_AT_iem.at; #X text 655 64 2.arg: number of order of FIR-filter; #X text 655 78 3.arg: learn-rate = beta; #X text 656 103 5.arg: constraint = kappa; #X text 655 90 4.arg: regularization parameter = gamma; #X text 656 118 6.arg: table-name of W; #X connect 1 0 64 0; #X connect 2 0 64 0; #X connect 3 0 4 0; #X connect 4 0 5 0; #X connect 4 1 6 0; #X connect 8 0 75 0; #X connect 8 0 64 0; #X connect 8 0 76 0; #X connect 8 0 77 0; #X connect 9 0 10 0; #X connect 10 0 60 0; #X connect 12 0 64 0; #X connect 16 0 17 0; #X connect 18 0 19 0; #X connect 21 0 45 0; #X connect 33 0 32 1; #X connect 35 0 32 0; #X connect 42 0 43 0; #X connect 43 0 7 0; #X connect 49 0 56 0; #X connect 50 0 59 0; #X connect 56 0 2 0; #X connect 59 0 12 0; #X connect 60 0 1 0; #X connect 64 0 16 0; #X connect 64 1 18 0; #X connect 64 2 65 0; #X connect 64 3 67 0; #X connect 64 4 42 0; #X connect 65 0 66 0; #X connect 67 0 68 0; #X connect 71 0 72 0; #X connect 72 0 64 0; #X connect 74 0 71 0; #X connect 75 0 64 3; #X connect 76 0 64 1; #X connect 77 0 64 2; iem_utils-v0.0.20180206/iem_adaptfilt/help/NLMS~-help.pd0000644000175000017500000001331412630366344022651 0ustar zmoelnigzmoelnig#N canvas 23 22 909 523 10; #N canvas 0 22 450 300 (subpatch) 0; #X array W 40 float 0; #X coords 0 1 39 -1 200 140 1; #X restore 454 335 graph; #X msg 25 245 update \$1; #X msg 102 255 beta \$1; #X obj 272 24 tgl 15 0 empty empty empty 0 -6 0 8 -225280 -1 -1 1 1 ; #X obj 272 45 dsp; #X floatatom 272 91 5 0 0 0 - - -; #X floatatom 285 70 5 0 0 0 - - -; #X obj 276 463 bng 15 150 20 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X text 453 230 2.arg: learn-rate = beta; #X obj 53 275 noise~; #X obj 25 58 vradio 15 1 0 8 empty empty empty 0 -6 0 8 -225280 -1 -1 7; #N canvas 165 115 464 314 (subpatch) 0; #X obj 76 61 inlet; #X msg 32 163 0; #X msg 63 159 1; #X msg 97 158 2; #X msg 132 156 4; #X msg 159 157 8; #X msg 191 162 16; #X msg 219 164 32; #X msg 248 165 64; #X obj 76 84 sel 0 1 2 3 4 5 6 7; #X obj 32 217 outlet; #X connect 0 0 9 0; #X connect 1 0 10 0; #X connect 2 0 10 0; #X connect 3 0 10 0; #X connect 4 0 10 0; #X connect 5 0 10 0; #X connect 6 0 10 0; #X connect 7 0 10 0; #X connect 8 0 10 0; #X connect 9 0 1 0; #X connect 9 1 2 0; #X connect 9 2 3 0; #X connect 9 3 4 0; #X connect 9 4 5 0; #X connect 9 5 6 0; #X connect 9 6 7 0; #X connect 9 7 8 0; #X restore 25 205 pd; #X text 34 37 internal downsampling of update; #X msg 96 337 gamma \$1; #X text 75 363 input signal; #X text 190 362 desired signal; #N canvas 0 22 450 300 (subpatch) 0; #X array IR 40 float 0; #X coords 0 1 39 -1 200 140 1; #X restore 367 11 graph; #X obj 54 440 unsig~; #X floatatom 54 466 9 0 0 0 - - -; #X obj 174 439 unsig~; #X floatatom 174 465 9 0 0 0 - - -; #X text 26 363 x(n); #X text 281 362 d(n); #X text 29 408 y(n) = W * x(n); #X obj 276 291 FIR~ IR 32; #X obj 618 73 loadbang; #X text 503 220 (array-sizes have to be >= then FIR_size); #X text 453 210 1.arg: number of order of FIR-filter; #X text 42 71 update every sample; #X text 42 56 stop \, no update; #X text 42 86 update every 2nd sample; #X text 42 101 update every 4th sample; #X text 42 116 update every 8th sample; #X text 42 131 update every 16th sample; #X text 42 146 update every 32nd sample; #X text 42 161 update every 64th sample; #N canvas 0 22 474 324 (subpatch) 0; #X obj 48 46 inlet; #X obj 205 47 inlet; #X msg 205 71 \; IR const 0; #X msg 48 120 \; IR 0 0 0 0 0.314287 0.8 0.75 0 0 0 0 -0.7 -0.65 0 0 0 0.157143 0.128572 0 0 -0.128572 -0.1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0; #X obj 92 84 loadbang; #X connect 0 0 3 0; #X connect 1 0 2 0; #X connect 4 0 3 0; #X restore 619 48 pd; #X obj 632 30 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X text 649 27 clear; #X obj 619 11 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X text 636 8 load; #X text 644 50 IR; #X text 4 395 filtered output signal; #X text 178 395 error signal; #X text 152 407 e(n) = d(n) - W * x(n); #X text 293 457 constrain; #X text 293 467 coefficients; #X msg 276 422 0; #X obj 276 442 speedlim 100; #X obj 83 412 cnv 8 1 1 empty empty * 0 7 0 14 -262144 -1 0; #X obj 247 411 cnv 8 1 1 empty empty * 0 7 0 14 -262144 -1 0; #N canvas 0 22 470 320 (subpatch) 0; #X obj 137 73 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 1 1 ; #X msg 137 115 39; #X msg 137 156 \$1 39; #X msg 136 53 1; #X obj 137 92 metro 200; #X obj 136 24 inlet; #X obj 137 135 tabread W; #X obj 137 180 tabwrite W; #X connect 0 0 4 0; #X connect 1 0 6 0; #X connect 2 0 7 0; #X connect 3 0 0 0; #X connect 4 0 1 0; #X connect 5 0 3 0; #X connect 6 0 2 0; #X restore 618 94 pd; #X text 643 100 update of W; #X text 642 89 graphical; #X text 453 250 4.arg: table-name of W; #X text 453 240 3.arg: minimum input value gamma; #X text 132 317 minimum input value; #X msg 102 218 0.1; #X msg 96 299 1e-05; #X text 155 256 beta [0 .. 2]; #X text 152 336 gamma [0 .. 1]; #X obj 455 187 cnv 15 68 17 empty empty empty 20 12 0 14 -225280 -66577 0; #N canvas 0 22 499 295 FORMULAS 1; #X obj 167 52 cnv 15 150 40 empty empty empty 20 12 0 14 -225280 -66577 0; #X obj 167 123 cnv 15 270 50 empty empty empty 20 12 0 14 -225280 -66577 0; #X obj 167 205 cnv 15 260 30 empty empty empty 20 12 0 14 -225280 -66577 0; #X text 280 129 beta; #X text 231 146 >; #X text 232 144 _; #X text 232 138 _; #X text 283 141 2; #X text 346 141 2; #X text 311 146 gamma * blocksize); #X text 300 146 +; #X text 243 146 x[n-i]; #X text 174 135 my(n) =; #X text 223 130 _________________________________; #X text 16 135 normalized learn rate:; #X text 173 56 y(n) = W * x(n); #X obj 237 54 cnv 11 1 1 empty empty * 0 9 0 14 -225280 -1 0; #X text 173 72 e(n) = d(n) - W * x(n); #X obj 286 71 cnv 11 1 1 empty empty * 0 9 0 14 -225280 -1 0; #X text 119 73 error:; #X text 116 55 output:; #X text 26 210 coefficient iteration:; #X text 188 211 W(k+1 \, i) = W(k \, i) + my(n)* e(n)* x(n); #X restore 455 187 pd FORMULAS; #X obj 102 238 cnv 14 31 14 empty empty empty 20 12 0 14 -225280 -66577 0; #X floatatom 102 238 5 0 2 0 - - -; #X text 138 237 learn-rate; #X obj 96 319 cnv 14 31 14 empty empty empty 20 12 0 14 -225280 -66577 0; #X floatatom 96 319 5 0 2 0 - - -; #X floatatom 25 226 5 0 0 0 - - -; #X text 455 169 Normalized Least Mean Square (linear adaptive FIR-filter) ; #X obj 53 379 NLMS~ 32 0.1 1e-05 W; #X text 451 268 (C) 2005 \, m.noisternig & t.musil \, IEM \, Graz \, Austria; #X text 479 281 [noisternig \, musil]_AT_iem.at; #X connect 1 0 70 0; #X connect 2 0 70 0; #X connect 3 0 4 0; #X connect 4 0 5 0; #X connect 4 1 6 0; #X connect 9 0 24 0; #X connect 9 0 70 0; #X connect 10 0 11 0; #X connect 11 0 68 0; #X connect 13 0 70 0; #X connect 17 0 18 0; #X connect 19 0 20 0; #X connect 24 0 70 1; #X connect 25 0 51 0; #X connect 37 0 36 1; #X connect 39 0 36 0; #X connect 47 0 48 0; #X connect 48 0 7 0; #X connect 57 0 64 0; #X connect 58 0 67 0; #X connect 64 0 2 0; #X connect 67 0 13 0; #X connect 68 0 1 0; #X connect 70 0 17 0; #X connect 70 1 19 0; iem_utils-v0.0.20180206/iem_adaptfilt/help/NLMSerr_in~-help.pd0000644000175000017500000001403712630366344024053 0ustar zmoelnigzmoelnig#N canvas 26 22 1132 728 10; #N canvas 0 22 450 300 (subpatch) 0; #X array W 100 float 0; #X coords 0 1 99 -1 400 140 1; #X restore 633 441 graph; #X msg 46 156 update \$1; #X msg 85 239 beta \$1; #X obj 299 62 tgl 15 0 empty empty empty 0 -6 0 8 -225280 -1 -1 1 1 ; #X obj 299 83 dsp; #X floatatom 299 129 5 0 0 0 - - -; #X floatatom 312 108 5 0 0 0 - - -; #X text 662 278 2.arg: learn-rate = beta; #X obj 336 193 noise~; #X msg 65 319 gamma \$1; #X text 70 348 input signal; #X text 344 295 desired signal; #N canvas 0 22 450 300 (subpatch) 0; #X array IR 40 float 0; #X coords 0 1 39 -1 200 140 1; #X restore 394 49 graph; #X obj 54 540 unsig~; #X floatatom 54 566 9 0 0 0 - - -; #X obj 392 544 unsig~; #X floatatom 392 564 9 0 0 0 - - -; #X text 21 346 x(n); #X text 449 295 d(n); #X text 19 510 y(n) = W * x(n); #X obj 336 278 FIR~ IR 32; #X obj 612 103 loadbang; #X text 712 267 (array-sizes have to be >= then FIR_size); #X text 662 256 1.arg: number of order of FIR-filter; #N canvas 0 22 474 324 (subpatch) 0; #X obj 48 46 inlet; #X obj 205 47 inlet; #X msg 205 71 \; IR const 0; #X msg 48 120 \; IR 0 0 0 0 0.314287 0.8 0.75 0 0 0 0 -0.7 -0.65 0 0 0 0.157143 0.128572 0 0 -0.128572 -0.1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0; #X obj 92 84 loadbang; #X connect 0 0 3 0; #X connect 1 0 2 0; #X connect 4 0 3 0; #X restore 613 78 pd; #X obj 626 60 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X text 643 57 clear; #X obj 613 41 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X text 630 38 load; #X text 638 80 IR; #X text 4 495 filtered output signal; #X text 395 422 error signal; #X text 369 434 e(n) = d(n) - W * x(n); #X obj 83 512 cnv 8 1 1 empty empty * 0 7 0 14 -262144 -1 0; #X obj 482 436 cnv 8 1 1 empty empty * 0 7 0 14 -262144 -1 0; #N canvas 0 22 470 320 (subpatch) 0; #X obj 137 73 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 1 1 ; #X msg 137 115 39; #X msg 137 156 \$1 39; #X msg 136 53 1; #X obj 137 92 metro 200; #X obj 136 24 inlet; #X obj 137 135 tabread W; #X obj 137 180 tabwrite W; #X connect 0 0 4 0; #X connect 1 0 6 0; #X connect 2 0 7 0; #X connect 3 0 0 0; #X connect 4 0 1 0; #X connect 5 0 3 0; #X connect 6 0 2 0; #X restore 612 124 pd; #X text 637 130 update of W; #X text 636 119 graphical; #X text 662 313 4.arg: table-name of W; #X text 126 301 minimum input value; #X msg 226 195 0.1; #X msg 65 281 1e-05; #X text 138 240 beta [0 .. 2]; #X text 132 318 gamma [0 .. 1]; #X obj 663 213 cnv 15 68 17 empty empty empty 20 12 0 14 -225280 -66577 0; #N canvas 0 22 499 295 FORMULAS 0; #X obj 167 52 cnv 15 150 40 empty empty empty 20 12 0 14 -225280 -66577 0; #X obj 167 123 cnv 15 270 50 empty empty empty 20 12 0 14 -225280 -66577 0; #X obj 167 205 cnv 15 260 30 empty empty empty 20 12 0 14 -225280 -66577 0; #X text 280 129 beta; #X text 231 146 >; #X text 232 144 _; #X text 232 138 _; #X text 283 141 2; #X text 346 141 2; #X text 311 146 gamma * blocksize); #X text 300 146 +; #X text 243 146 x[n-i]; #X text 174 135 my(n) =; #X text 223 130 _________________________________; #X text 16 135 normalized learn rate:; #X text 173 56 y(n) = W * x(n); #X obj 237 54 cnv 11 1 1 empty empty * 0 9 0 14 -225280 -1 0; #X text 173 72 e(n) = d(n) - W * x(n); #X obj 286 71 cnv 11 1 1 empty empty * 0 9 0 14 -225280 -1 0; #X text 119 73 error:; #X text 116 55 output:; #X text 26 210 coefficient iteration:; #X text 188 211 W(k+1 \, i) = W(k \, i) + my(n)* e(n)* x(n); #X restore 664 213 pd FORMULAS; #X obj 91 223 cnv 14 31 14 empty empty empty 20 12 0 14 -225280 -66577 0; #X floatatom 85 222 6 0 2 0 - - -; #X text 134 221 learn-rate; #X obj 65 301 cnv 14 31 14 empty empty empty 20 12 0 14 -225280 -66577 0; #X floatatom 65 301 8 0 2 0 - - -; #X obj 347 389 -~; #X text 232 431 err; #X text 409 343 filt out; #X msg 635 600 \; W const 0; #X obj 28 365 delread~ causal_del 1.45126; #X obj 392 325 delread~ feedback_del 1.45126; #X msg 185 195 0.01; #X msg 53 196 0; #X msg 138 195 0.001; #X obj 336 214 delwrite~ causal_del 20; #X obj 67 472 delwrite~ feedback_del 20; #X floatatom 111 690 9 0 0 0 - - -; #X text 38 382 ref_filt; #X text 155 404 ref_adapt; #X obj 134 389 delread~ causal_del 2.90249; #X obj 336 255 delread~ causal_del 2.90249; #X obj 46 137 tgl 15 0 empty empty empty 0 -6 0 8 -225280 -1 -1 1 1 ; #X text 41 118 Update ON / OFF; #X msg 147 629 128; #X msg 109 629 64; #X obj 110 667 / 44.1; #X obj 299 665 samplerate~; #X obj 299 647 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144 -1 -1; #X floatatom 300 706 5 0 0 0 - - -; #X obj 300 686 * 0.001; #X floatatom 189 687 9 0 0 0 - - -; #X msg 190 627 128; #X obj 188 664 / 44.1; #X msg 225 627 192; #X obj 299 627 loadbang; #X text 660 364 (C) 2010 \, t.musil & m.guldenschuh \, IEM \, Graz \, Austria; #X text 688 377 [musil | guldenschuh]_AT_iem.at; #X text 662 173 Normalized Least Mean Square with separated error and adaption reference input (linear adaptive FIR-filter); #X obj 53 450 NLMSerr_in~ 100 0.003 1e-05 W; #X msg 114 282 1e-07; #X msg 85 195 0.0001; #X text 662 290 3.arg: minimum input value gamma for; #X text 716 301 energy calculation; #X text 46 44 NLMSerr_in~; #X connect 1 0 84 0; #X connect 2 0 84 0; #X connect 3 0 4 0; #X connect 4 0 5 0; #X connect 4 1 6 0; #X connect 8 0 60 0; #X connect 9 0 84 0; #X connect 13 0 14 0; #X connect 15 0 16 0; #X connect 20 0 51 0; #X connect 21 0 35 0; #X connect 25 0 24 1; #X connect 27 0 24 0; #X connect 40 0 47 0; #X connect 41 0 50 0; #X connect 47 0 2 0; #X connect 50 0 9 0; #X connect 51 0 15 0; #X connect 51 0 84 2; #X connect 55 0 84 0; #X connect 56 0 51 1; #X connect 57 0 47 0; #X connect 58 0 47 0; #X connect 59 0 47 0; #X connect 62 0 56 0; #X connect 62 0 55 0; #X connect 65 0 84 1; #X connect 66 0 20 0; #X connect 67 0 1 0; #X connect 69 0 71 0; #X connect 70 0 71 0; #X connect 71 0 62 0; #X connect 72 0 75 0; #X connect 73 0 72 0; #X connect 75 0 74 0; #X connect 75 0 71 1; #X connect 75 0 78 1; #X connect 77 0 78 0; #X connect 78 0 76 0; #X connect 78 0 66 0; #X connect 78 0 65 0; #X connect 79 0 78 0; #X connect 80 0 73 0; #X connect 84 0 13 0; #X connect 84 0 61 0; #X connect 85 0 50 0; #X connect 86 0 47 0; iem_utils-v0.0.20180206/iem_adaptfilt/help/n_CLNLMS~-help.pd0000644000175000017500000001743012630366344023410 0ustar zmoelnigzmoelnig#N canvas 18 0 998 718 10; #N canvas 0 0 450 300 graph1 0; #X array 1_W 40 float 0; #X coords 0 1 39 -1 200 140 1; #X restore 49 517 graph; #X msg 25 245 update \$1; #X msg 102 255 beta \$1; #X obj 438 26 tgl 15 0 empty empty empty 0 -6 0 8 -225280 -1 -1 0 1 ; #X obj 438 47 dsp; #X floatatom 438 93 5 0 0 0 - - -; #X floatatom 451 72 5 0 0 0 - - -; #X obj 437 461 bng 15 150 20 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 53 275 noise~; #X obj 25 58 vradio 15 1 0 8 empty empty empty 0 -6 0 8 -225280 -1 -1 0; #N canvas 165 115 464 314 /SUBPATCH/ 0; #X obj 76 61 inlet; #X msg 32 163 0; #X msg 63 159 1; #X msg 97 158 2; #X msg 132 156 4; #X msg 159 157 8; #X msg 191 162 16; #X msg 219 164 32; #X msg 248 165 64; #X obj 76 84 sel 0 1 2 3 4 5 6 7; #X obj 32 217 outlet; #X connect 0 0 9 0; #X connect 1 0 10 0; #X connect 2 0 10 0; #X connect 3 0 10 0; #X connect 4 0 10 0; #X connect 5 0 10 0; #X connect 6 0 10 0; #X connect 7 0 10 0; #X connect 8 0 10 0; #X connect 9 0 1 0; #X connect 9 1 2 0; #X connect 9 2 3 0; #X connect 9 3 4 0; #X connect 9 4 5 0; #X connect 9 5 6 0; #X connect 9 6 7 0; #X connect 9 7 8 0; #X restore 25 205 pd; #X text 7 39 internal downsampling of update; #X msg 60 337 gamma \$1; #X text 75 363 input signal; #X text 320 362 desired signal; #N canvas 0 0 450 300 graph1 0; #X array IR 40 float 0; #X coords 0 1 39 -1 200 140 1; #X restore 225 23 graph; #X obj 54 460 unsig~; #X floatatom 54 486 9 0 0 0 - - -; #X obj 140 460 unsig~; #X floatatom 140 486 9 0 0 0 - - -; #X text 411 362 d(n); #X obj 777 283 loadbang; #X text 687 432 (array-sizes have to be >= then FIR_size); #X text 42 71 update every sample; #X text 42 56 stop \, no update; #X text 42 86 update every 2nd sample; #X text 42 101 update every 4th sample; #X text 42 116 update every 8th sample; #X text 42 131 update every 16th sample; #X text 42 146 update every 32nd sample; #X text 42 161 update every 64th sample; #N canvas 0 0 486 336 /SUBPATCH/ 0; #X obj 48 46 inlet; #X obj 205 47 inlet; #X msg 205 71 \; IR const 0; #X obj 92 84 loadbang; #X msg 48 120 \; IR 0 0 0 0 0 0 0.314287 0.8 0.75 0 0 0 0 -0.7 -0.65 0 0 0 0.157143 0.128572 0 0 -0.128572 -0.1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0; #X connect 0 0 4 0; #X connect 1 0 2 0; #X connect 3 0 4 0; #X restore 778 258 pd; #X obj 791 240 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X text 808 237 clear; #X obj 778 221 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X text 795 218 load; #X text 840 227 IR; #X text 4 395 filtered output signal; #X text 324 394 error signal; #X text 454 455 constrain; #X text 454 465 coefficients; #X msg 437 420 0; #X obj 437 440 speedlim 100; #X obj 95 412 cnv 8 1 1 empty empty * 0 7 0 14 -262144 -1 0; #N canvas 0 0 478 328 /SUBPATCH/ 0; #X obj 137 73 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 1 1 ; #X msg 137 115 39; #X msg 92 190 \$1 39; #X msg 136 53 1; #X obj 137 92 metro 200; #X obj 136 24 inlet; #X obj 92 169 tabread 1_W; #X obj 92 214 tabwrite 1_W; #X msg 177 192 \$1 39; #X msg 260 191 \$1 39; #X obj 260 170 tabread 3_W; #X obj 260 215 tabwrite 3_W; #X obj 177 171 tabread 2_W; #X obj 177 216 tabwrite 2_W; #X connect 0 0 4 0; #X connect 1 0 6 0; #X connect 1 0 12 0; #X connect 1 0 10 0; #X connect 2 0 7 0; #X connect 3 0 0 0; #X connect 4 0 1 0; #X connect 5 0 3 0; #X connect 6 0 2 0; #X connect 8 0 13 0; #X connect 9 0 11 0; #X connect 10 0 9 0; #X connect 12 0 8 0; #X restore 777 304 pd; #X text 802 310 update of W; #X text 801 299 graphical; #X text 96 317 minimum input value; #X msg 102 218 0.1; #X msg 60 299 1e-05; #X text 155 256 beta [0 .. 2]; #X text 116 336 gamma [0 .. 1]; #X obj 527 47 cnv 15 68 17 empty empty empty 20 12 0 14 -225280 -66577 0; #N canvas 0 0 499 295 FORMULAS 0; #X obj 167 52 cnv 15 150 40 empty empty empty 20 12 0 14 -225280 -66577 0; #X obj 167 123 cnv 15 270 50 empty empty empty 20 12 0 14 -225280 -66577 0; #X obj 167 205 cnv 15 260 30 empty empty empty 20 12 0 14 -225280 -66577 0; #X text 280 129 beta; #X text 231 146 >; #X text 232 144 _; #X text 232 138 _; #X text 277 141 2; #X text 340 141 2; #X text 311 146 gamma * blocksize); #X text 294 146 +; #X text 243 146 x[n-i]; #X text 174 135 my(n) =; #X text 223 130 _________________________________; #X text 8 135 normalized learn rate:; #X text 173 54 y(n) = W * x(n); #X obj 225 56 cnv 11 1 1 empty empty * 0 9 0 14 -225280 -1 0; #X text 173 72 e(n) = d(n) - W * x(n); #X obj 267 74 cnv 11 1 1 empty empty * 0 9 0 14 -225280 -1 0; #X text 119 73 error:; #X text 116 55 output:; #X text 7 210 coefficient iteration:; #X text 176 213 W(k+1 \, i) = leakage*W(k \, i) + my(n)* e(n)* x(n) ; #X restore 527 47 pd FORMULAS; #X obj 102 238 cnv 14 31 14 empty empty empty 20 12 0 14 -225280 -66577 0; #X floatatom 102 238 5 0 2 0 - - -; #X text 138 237 learn-rate; #X obj 60 319 cnv 14 31 14 empty empty empty 20 12 0 14 -225280 -66577 0; #X floatatom 60 319 5 0 1 0 - - -; #X floatatom 25 226 5 0 0 0 - - -; #X text 526 29 Normalized Least Mean Square (linear adaptive FIR-filter) ; #N canvas 0 0 450 300 graph1 0; #X array 2_W 40 float 0; #X coords 0 1 39 -1 200 140 1; #X restore 299 517 graph; #N canvas 0 0 450 300 graph1 0; #X array 3_W 40 float 0; #X coords 0 1 39 -1 200 140 1; #X restore 549 517 graph; #X obj 229 461 unsig~; #X floatatom 229 487 9 0 0 0 - - -; #X obj 319 459 unsig~; #X floatatom 319 485 9 0 0 0 - - -; #X obj 253 233 cnv 14 31 14 empty empty empty 20 12 0 14 -225280 -66577 0; #X floatatom 253 233 5 0 10000 0 - - -; #X msg 253 251 kappa \$1; #X msg 253 213 1; #X obj 408 291 FIR~ IR 32; #X obj 171 291 z~ 2; #X obj 289 291 z~ 4; #X text 26 363 x1(n); #X text 257 363 x3(n); #X text 176 362 x2(n); #X text 24 408 y1(n) = 1_W * x1(n); #X obj 181 427 cnv 8 1 1 empty empty * 0 7 0 14 -262144 -1 0; #X obj 271 401 cnv 8 1 1 empty empty * 0 7 0 14 -262144 -1 0; #X text 110 423 y2(n) = 2_W * x2(n); #X text 200 397 y3(n) = 3_W * x3(n); #X obj 360 423 cnv 8 1 1 empty empty * 0 7 0 14 -262144 -1 0; #X text 326 419 - 1_W * x1(n); #X text 297 408 e(n) = d(n); #X obj 360 433 cnv 8 1 1 empty empty * 0 7 0 14 -262144 -1 0; #X text 326 429 - 2_W * x2(n); #X obj 360 443 cnv 8 1 1 empty empty * 0 7 0 14 -262144 -1 0; #X text 326 439 - 3_W * x3(n); #X text 526 18 Multi Channel Constraint; #X obj 53 380 n_CLNLMS~ 3 32 0.1 1e-05 1 0.95 W ______________________ ; #X text 472 230 minimum input value; #X obj 436 232 cnv 14 31 14 empty empty empty 20 12 0 14 -225280 -66577 0; #X floatatom 436 232 5 0 10000 0 - - -; #X msg 436 212 1; #X msg 436 250 leakage \$1; #X text 516 254 leakage [0 .. 1]; #X text 520 163 (C) 2005 \, m.noisternig & t.musil \, IEM \, Graz \, Austria; #X text 548 176 [noisternig \, musil]_AT_iem.at; #X text 525 69 1.arg: number of channels n; #X text 525 82 2.arg: number of order of FIR-filter; #X text 525 96 3.arg: learn-rate = beta; #X text 318 250 kappa; #X text 289 231 constraint; #X text 526 121 5.arg: constraint = kappa; #X text 525 108 4.arg: regularization parameter = gamma; #X text 526 133 6.arg: leakage; #X text 526 146 7.arg: table-name of W; #X connect 1 0 90 0; #X connect 2 0 90 0; #X connect 3 0 4 0; #X connect 4 0 5 0; #X connect 4 1 6 0; #X connect 8 0 71 0; #X connect 8 0 72 0; #X connect 8 0 73 0; #X connect 8 0 90 0; #X connect 9 0 10 0; #X connect 10 0 59 0; #X connect 12 0 90 0; #X connect 16 0 17 0; #X connect 18 0 19 0; #X connect 21 0 44 0; #X connect 32 0 31 1; #X connect 34 0 31 0; #X connect 41 0 42 0; #X connect 42 0 7 0; #X connect 48 0 55 0; #X connect 49 0 58 0; #X connect 55 0 2 0; #X connect 58 0 12 0; #X connect 59 0 1 0; #X connect 63 0 64 0; #X connect 65 0 66 0; #X connect 68 0 69 0; #X connect 69 0 90 0; #X connect 70 0 68 0; #X connect 71 0 90 3; #X connect 72 0 90 1; #X connect 73 0 90 2; #X connect 90 0 16 0; #X connect 90 1 18 0; #X connect 90 2 63 0; #X connect 90 3 65 0; #X connect 90 4 41 0; #X connect 93 0 95 0; #X connect 94 0 93 0; #X connect 95 0 90 0; iem_utils-v0.0.20180206/iem_adaptfilt/help/NLMSCC~-help.pd0000644000175000017500000002124112630366344023055 0ustar zmoelnigzmoelnig#N canvas 284 42 905 668 10; #N canvas 0 0 450 300 graph1 0; #X array W 40 float 0; #X coords 0 1 39 -1 200 140 1; #X restore 34 496 graph; #X msg 26 246 update \$1; #X msg 103 256 beta \$1; #X obj 273 25 tgl 15 0 empty empty empty 0 -6 0 8 -225280 -1 -1 0 1 ; #X obj 273 46 dsp; #X floatatom 273 92 5 0 0 0 - - -; #X floatatom 286 71 5 0 0 0 - - -; #X obj 277 464 bng 15 150 20 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X text 423 290 2.arg: learn-rate = beta; #X obj 54 276 noise~; #X obj 26 59 vradio 15 1 0 8 empty empty empty 0 -6 0 8 -225280 -1 -1 0; #N canvas 165 115 464 314 /SUBPATCH/ 0; #X obj 76 61 inlet; #X msg 32 163 0; #X msg 63 159 1; #X msg 97 158 2; #X msg 132 156 4; #X msg 159 157 8; #X msg 191 162 16; #X msg 219 164 32; #X msg 248 165 64; #X obj 76 84 sel 0 1 2 3 4 5 6 7; #X obj 32 217 outlet; #X connect 0 0 9 0; #X connect 1 0 10 0; #X connect 2 0 10 0; #X connect 3 0 10 0; #X connect 4 0 10 0; #X connect 5 0 10 0; #X connect 6 0 10 0; #X connect 7 0 10 0; #X connect 8 0 10 0; #X connect 9 0 1 0; #X connect 9 1 2 0; #X connect 9 2 3 0; #X connect 9 3 4 0; #X connect 9 4 5 0; #X connect 9 5 6 0; #X connect 9 6 7 0; #X connect 9 7 8 0; #X restore 26 206 pd; #X text 35 38 internal downsampling of update; #X msg 97 338 gamma \$1; #N canvas 0 0 450 300 graph1 0; #X array W_top 40 float 0; #X coords 0 1 39 -1 200 140 1; #X restore 626 495 graph; #N canvas 0 0 450 300 graph1 0; #X array W_bottom 40 float 0; #X coords 0 1 39 -1 200 140 1; #X restore 294 495 graph; #X text 76 364 input signal; #X text 191 363 desired signal; #N canvas 0 0 450 300 graph1 0; #X array IR 40 float 0; #X coords 0 1 39 -1 200 140 1; #X restore 372 32 graph; #X obj 55 441 unsig~; #X floatatom 55 467 9 0 0 0 - - -; #X obj 165 440 unsig~; #X floatatom 165 466 9 0 0 0 - - -; #X text 27 364 x(n); #X text 282 363 d(n); #X text 30 409 y(n) = W * x(n); #X obj 277 292 FIR~ IR 32; #X obj 589 135 loadbang; #X text 473 280 (array-sizes have to be >= then FIR_size); #X text 423 270 1.arg: number of order of FIR-filter; #X text 43 72 update every sample; #X text 43 57 stop \, no update; #X text 43 87 update every 2nd sample; #X text 43 102 update every 4th sample; #X text 43 117 update every 8th sample; #X text 43 132 update every 16th sample; #X text 43 147 update every 32nd sample; #X text 43 162 update every 64th sample; #N canvas 0 0 474 324 /SUBPATCH/ 0; #X obj 48 46 inlet; #X obj 205 47 inlet; #X msg 205 71 \; IR const 0; #X msg 48 120 \; IR 0 0 0 0 0.314287 0.8 0.75 0 0 0 0 -0.7 -0.65 0 0 0 0.157143 0.128572 0 0 -0.128572 -0.1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0; #X obj 92 84 loadbang; #X connect 0 0 3 0; #X connect 1 0 2 0; #X connect 4 0 3 0; #X restore 590 110 pd; #X obj 603 92 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X text 620 89 clear; #X obj 590 73 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X text 607 70 load; #X text 652 79 IR; #X text 5 396 filtered output signal; #X text 169 396 error signal; #X text 143 408 e(n) = d(n) - W * x(n); #X text 294 458 constrain; #X text 294 468 coefficients; #N canvas 0 0 825 416 /SUBPATCH/ 0; #X obj 43 39 inlet; #X obj 446 39 inlet; #X obj 92 84 loadbang; #X msg 54 114 \; W_top 0 1 0.928572 0.885714 0.857142 0.828571 0.799999 0.785713 0.757141 0.742855 0.72857 0.714284 0.699998 0.685712 0.671426 0.642854 0.628569 0.599997 0.571425 0.557139 0.528568 0.514282 0.499996 0.499996 0.48571 0.471424 0.457138 0.428567 0.414281 0.399995 0.385709 0.371423 0.357137 0.342851 0.328565 0.31428 0.31428 0.31428 0.31428 0.299994 0.299994; #X msg 43 226 \; W_bottom 0 -1 -0.971428 -0.942857 -0.914286 -0.885714 -0.857143 -0.828572 -0.814286 -0.785715 -0.757143 -0.728572 -0.7 -0.671429 -0.657143 -0.642858 -0.614286 -0.585715 -0.571429 -0.557144 -0.528572 -0.514287 -0.500001 -0.485715 -0.471429 -0.457144 -0.442858 -0.428572 -0.428572 -0.400001 -0.400001 -0.385715 -0.371429 -0.371429 -0.357144 -0.357144 -0.342858 -0.328572 -0.314287 -0.285715 -0.285715; #X msg 446 226 \; W_bottom 0 -1 -0.857143 -0.728572 -0.671429 -0.614286 -0.585715 -0.557143 -0.514286 -0.485715 -0.471429 -0.471429 -0.442858 -0.428572 -0.400001 -0.371429 -0.342858 -0.328572 -0.314286 -0.285715 -0.285715 -0.271429 -0.271429 -0.271429 -0.271429 -0.271429 -0.271429 -0.257144 -0.242858 -0.228572 -0.214286 -0.214286 -0.214286 -0.200001 -0.214287 -0.200001 -0.200001 -0.185715 -0.171429 -0.171429 -0.171429 ; #X msg 459 113 \; W_top 0 1 0.842856 0.785713 0.699998 0.642854 0.571425 0.514282 0.457138 0.442852 0.414281 0.385709 0.342851 0.285708 0.257136 0.214279 0.199993 0.171421 0.157135 0.142849 0.128564 0.142849 0.142849 0.142849 0.142849 0.142849 0.128564 0.128564 0.128564 0.128564 0.128564 0.128564 0.142849 0.142849 0.142849 0.142849 0.157135 0.157135 0.157135 0.142849 0.142849; #X connect 0 0 4 0; #X connect 0 0 3 0; #X connect 1 0 6 0; #X connect 1 0 5 0; #X connect 2 0 3 0; #X connect 2 0 4 0; #X restore 506 576 pd; #X obj 519 558 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 506 539 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X msg 277 423 0; #X obj 277 443 speedlim 100; #X text 499 522 top & bottom; #X text 523 536 nonconstrained; #X text 536 555 constrained; #X obj 84 413 cnv 8 1 1 empty empty * 0 7 0 14 -262144 -1 0; #X obj 237 412 cnv 8 1 1 empty empty * 0 7 0 14 -262144 -1 0; #N canvas 0 0 470 320 /SUBPATCH/ 0; #X obj 137 73 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 1 1 ; #X msg 137 115 39; #X msg 137 156 \$1 39; #X msg 136 53 1; #X obj 137 92 metro 200; #X obj 136 24 inlet; #X obj 137 135 tabread W; #X obj 137 180 tabwrite W; #X connect 0 0 4 0; #X connect 1 0 6 0; #X connect 2 0 7 0; #X connect 3 0 0 0; #X connect 4 0 1 0; #X connect 5 0 3 0; #X connect 6 0 2 0; #X restore 589 156 pd; #X text 614 162 update of W; #X text 613 151 graphical; #X text 423 310 4.arg: table-name of W; #X text 423 320 5.arg: table-name of lower boundary of W; #X text 423 330 6.arg: table-name of upper boundary of W; #X text 423 300 3.arg: minimum input value gamma; #X text 133 318 minimum input value; #X msg 103 219 0.1; #X msg 97 300 1e-05; #X text 156 257 beta [0 .. 2]; #X text 153 337 gamma [0 .. 1]; #X obj 458 250 cnv 15 68 17 empty empty empty 20 12 0 14 -225280 -66577 0; #N canvas 0 0 758 363 FORMULAS 0; #X obj 168 54 cnv 15 150 40 empty empty empty 20 12 0 14 -225280 -66577 0; #X obj 168 125 cnv 15 270 50 empty empty empty 20 12 0 14 -225280 -66577 0; #X obj 168 207 cnv 15 510 90 empty empty empty 20 12 0 14 -225280 -66577 0; #X text 281 131 beta; #X text 232 148 >; #X text 233 146 _; #X text 233 140 _; #X text 278 143 2; #X text 341 143 2; #X text 312 148 gamma * blocksize); #X text 295 148 +; #X text 244 148 x[n-i]; #X text 175 137 my(n) =; #X text 224 132 _________________________________; #X text 29 138 normalized learn rate:; #X text 246 243 <; #X text 250 237 |; #X text 250 249 |; #X text 250 230 |; #X text 250 256 |; #X text 250 270 |; #X text 250 223 |; #X text 254 206 _; #X text 253 270 _; #X text 271 211 W > W_top; #X text 265 275 W < W_bottom; #X text 260 246 &&(W <= W_top); #X text 256 235 (W >= W_bottom); #X text 175 243 W(k+1 \, i) =; #X text 250 216 |; #X text 250 263 |; #X text 346 275 ...... W(k+1 \, i) = W_botton(i); #X text 334 212 ........ W(k+1 \, i) = W_top(i); #X text 174 56 y(n) = W * x(n); #X obj 226 58 cnv 11 1 1 empty empty * 0 9 0 14 -225280 -1 0; #X text 174 74 e(n) = d(n) - W * x(n); #X obj 268 76 cnv 11 1 1 empty empty * 0 9 0 14 -225280 -1 0; #X text 120 75 error:; #X text 117 57 output:; #X text 27 242 coefficient iteration:; #X text 358 243 .... W(k+1 \, i) = W(k \, i) + my(n)* e(n)* x(n); #X restore 457 249 pd FORMULAS; #X obj 54 380 NLMSCC~ 32 0.1 1e-05 W W_bottom W_top; #X obj 103 239 cnv 14 31 14 empty empty empty 20 12 0 14 -225280 -66577 0; #X floatatom 103 239 5 0 2 0 - - -; #X text 139 238 learn-rate; #X obj 97 320 cnv 14 31 14 empty empty empty 20 12 0 14 -225280 -66577 0; #X floatatom 97 320 5 0 2 0 - - -; #X floatatom 26 227 5 0 0 0 - - -; #X text 426 221 Normalized Least Mean Square (linear adaptive FIR-filter) ; #X text 455 232 with Coefficient Constraint; #X text 422 350 (C) 2005 \, m.noisternig & t.musil \, IEM \, Graz \, Austria; #X text 450 363 [noisternig \, musil]_AT_iem.at; #X connect 1 0 73 0; #X connect 2 0 73 0; #X connect 3 0 4 0; #X connect 4 0 5 0; #X connect 4 1 6 0; #X connect 9 0 26 0; #X connect 9 0 73 0; #X connect 10 0 11 0; #X connect 11 0 79 0; #X connect 13 0 73 0; #X connect 19 0 20 0; #X connect 21 0 22 0; #X connect 26 0 73 1; #X connect 27 0 59 0; #X connect 39 0 38 1; #X connect 41 0 38 0; #X connect 50 0 49 1; #X connect 51 0 49 0; #X connect 52 0 53 0; #X connect 53 0 7 0; #X connect 67 0 75 0; #X connect 68 0 78 0; #X connect 73 0 19 0; #X connect 73 1 21 0; #X connect 73 2 52 0; #X connect 75 0 2 0; #X connect 78 0 13 0; #X connect 79 0 1 0; iem_utils-v0.0.20180206/iem_adaptfilt/Makefile.pdlibbuilder0000644000175000017500000011630513004406663023576 0ustar zmoelnigzmoelnig# Makefile.pdlibbuilder dated 2016-10-27 version = 0.4.1 # Helper makefile for Pure Data external libraries. # Written by Katja Vetter March-June 2015 for the public domain. No warranties. # Inspired by Hans Christoph Steiner's Makefile Template and Stephan Beal's # ShakeNMake. # # GNU make version >= 3.81 required. # # #=== characteristics =========================================================== # # # - defines build settings based on autodetected OS and architecture # - defines rules to build Pd class- or lib executables from C or C++ sources # - defines rules for libdir installation # - defines convenience targets for developer and user # - evaluates implicit dependencies for non-clean builds # # #=== basic usage =============================================================== # # # In your Makefile, define your Pd lib name and class files, and include # Makefile.pdlibbuilder at the end of the Makefile. Like so: # # ________________________________________________________________________ # # # Makefile for mylib # # lib.name = mylib # # class.sources = myclass1.c myclass2.c # # datafiles = myclass1-help.pd myclass2-help.pd README.txt LICENSE.txt # # include Makefile.pdlibbuilder # ________________________________________________________________________ # # # For files in class.sources it is assumed that class basename == source file # basename. The default target builds all classes as individual executables # with Pd's default extension for the platform. For anything more than the # most basic usage, continue reading. # # #=== list of Makefile.pdlibbuilder API variables =============================== # # # Variables available for definition in your library Makefile: # # - lib.name # - lib.setup.sources # - class.sources # - common.sources # - shared.sources # - .class.sources # - .class.ldflags # - .class.ldlibs # - cflags # - ldflags # - ldlibs # - datafiles # - datadirs # - makefiles # - makefiledirs # - externalsdir # # Optional multiline defines evaluated per operating system: # # - forLinux # - forDarwin # - forWindows # # Variables available for your makefile or make command line: # # - make-lib-executable # - suppress-wunused # # Path variables for make command line or environment: # # - PDDIR # - PDINCLUDEDIR # - PDBINDIR # - PDLIBDIR # # Standard make variables for make command line or environment: # # - CPPFLAGS # - CFLAGS # - LDFLAGS # - CC # - CXX # - INSTALL # - DESTDIR # # Deprecated path variables: # # - PD_PATH # - pdincludepath # - pdbinpath # - objectsdir # # #=== descriptions of Makefile.pdlibbuilder API variables ======================= # # # lib.name: # Name of the library directory as it will be installed / distributed. Also the # name of the lib executable in the case where all classes are linked into # a single binary. # # lib.setup.sources: # Source file(s) (C or C++) which must be compiled only when linking all classes # into a single lib binary. # # class.sources: # All sources files (C or C++) for which the condition holds that # class name == source file basename. # # .class.sources: # Source file(s) (C or C++) specific to class . Use this for # multiple-source classes or when class name != source file basename. # # common.sources: # Source file(s) which must be statically linked to each class in the library. # # shared.sources: # Source file(s) (C or C++) to build a shared dynamic link lib, to be linked # with all class executables. # # cflags, ldflags, ldlibs: # Define cflags (preprocessor&compiler), ldflags (linker) and ldlibs (dynamic # link libs) for the whole library. These flags are added to platform-specific # flags defined by Makefile.pdlibbuilder. # # .class.ldflags and .class.ldlibs: # Define ldflags resp. ldlibs specific to class . These flags are # added to platform-specific flags defined by Makefile.pdlibbuilder, and flags # defined in your Makefile for the whole library. Note: cflags can not be # defined per class in the current implementation. # # datafiles and datadirs: # All extra files you want to include in binary distributions of the # library: abstractions and help patches, example patches, meta patch, readme # and license texts, manuals, sound files, etcetera. Use 'datafiles' for all # files that should go into your lib rootdir and 'datadirs' for complete # directories you want to copy from source to distribution. # # forLinux, forDarwin, forWindows: # Shorthand for 'variable definitions for Linux only' etc. Use like: # define forLinux # cflags += -DLINUX # class.sources += linuxthing.c # endef # # makefiles and makefiledirs: # Extra makefiles or directories with makefiles that should be made in sub-make # processes. # # make-lib-executable: # When this variable is defined 'yes' in your makefile or as command argument, # Makefile.pdlibbuilder will try to build all classes into a single library # executable (but it will force exit if lib.setup.sources is undefined). # If your makefile defines 'make-lib-executable=yes' as the library default, # this can still be overriden with 'make-lib-executable=no' as command argument # to build individual class executables (the Makefile.pdlibbuilder default.) # # suppress-wunused: # When this variable is defined ('yes' or any other value), -Wunused-variable, # -Wunused-parameter, -Wunused-value and -Wunused-function are suppressed, # but the other warnings from -Wall are retained. # # PDDIR: # Root directory of 'portable' pd package. When defined, PDINCLUDEDIR and # PDBINDIR will be evaluated as $(PDDIR)/src and $(PDDIR)/bin. # # PDINCLUDEDIR: # Directory where Pd API m_pd.h should be found, and other Pd header files. # Overrides the default search path. # # PDBINDIR: # Directory where pd.dll should be found for linking (Windows only). Overrides # the default search path. # # PDLIBDIR: # Root directory for installation of Pd library directories. Overrides the # default install location. # # DESTDIR: # Prepended path component for staged install. # # CPPFLAGS: # Preprocessor flags which are not strictly required for building. # # CFLAGS: # Compiler flags which are not strictly required for building. Compiler flags # defined by Makefile.pdlibbuilder for warning, optimization and architecture # specification are overriden by CFLAGS. # # LDFLAGS: # Linker flags which are not strictly required for building. Linker flags # defined by Makefile.pdlibbuilder for architecture specification are overriden # by LDFLAGS. # # CC and CXX: # C and C++ compiler programs as defined in your build environment. # # INSTALL # Definition of install program. # # PD_PATH: # Equivalent to PDDIR. Supported for compatibility with pd-extended central # makefile, but deprecated otherwise. # # objectsdir: # Root directory for installation of Pd library directories, like PDLIBDIR but # not overridable by environment. Supported for compatibility with pd-extended # central makefile, but deprecated otherwise. # # pdincludepath, pdbinpath: # As PDINCLUDEDIR and PDBINDIR but not overridable by environment. Deprecated # as user variables. # # #=== paths ===================================================================== # # # Source files in directories other than current working directory must be # prefixed with their relative path. Do not rely on VPATH or vpath. # Object (.o) files are built in the directory of their source files. # Executables are built in current working directory. # # Default search path for m_pd.h and other API header files is platform # dependent, and overridable by PDINCLUDEDIR: # # Linux: /usr/include/pd # # OSX: /Applications/Pd*.app/Contents/Resources/src # # Windows: %PROGRAMFILES%/pd/src # # Default location to install pd libraries is platform dependent, and # overridable by PDLIBDIR: # # Linux: /usr/local/lib/pd-externals # OSX: ~/Library/Pd # Windows: %APPDATA%/Pd # # https://puredata.info/docs/faq/how-do-i-install-externals-and-help-files # The rationale for not installing to ~/pd-externals by default on Linux # is that some people share the home dir between 32 and 64 bit installations. # # #=== targets =================================================================== # # # all: build $(executables) plus optional post target # post: target to build after $(executables) # alldebug: build all with -g option turned on for debug symbols # : force clean build of an individual class # .pre: make preprocessor output file in current working directory # .lst: make asm/source output file in current working directory # # install: install executables and data files # clean: remove build products from source tree # # help: print help text # vars: print makefile variables # allvars: print all variables # depend: print generated prerequisites # coffee: dummy target # # Variable $(executables) expands to class executables plus optional shared lib, # or alternatively to single lib executable when make-lib-executable=true. # Targets pre and post can be defined by library makefile. Make sure to include # Makefile.pdlibbuilder first so default target all will not be redefined. # # #=== Pd-extended libdir concept ================================================ # # # For libdir layout as conceived by Hans-Christoph Steiner, see: # # https://puredata.info/docs/developer/Libdir # # Files README.txt, LICENSE.txt and -meta.pd are part of the libdir # convention. Help patches for each class and abstraction are supposed to be # available. Makefile.pdlibbuilder does not force the presence of these files # however. It does not automatically include such files in libdir installations. # Data files you want to include in distributions must be defined explicitly in # your Makefile. # # #=== Makefile.pdlibbuilder syntax conventions ================================== # # # Makefile.pdlibbuilder variable names are lower case. Default make variables, # environment variables, and standard user variables (CC, CXX, CFLAGS, DESTDIR) # are upper case. Use target 'allvars' to print all variables and their values. # # 'Fields' in data variables are separated by dots, like in 'foo.class.sources'. # Words in variables expressing a function or command are separated by dashes, # like in 'make-lib-executable'. # # #=== useful make options ======================================================= # # # Use 'make -d ' to print debug details of the make process. # Use 'make -p ' to print make's database. # # #=== TODO ====================================================================== # # # - decide whether to use -static-libgcc or shared dll in MinGW # - cygwin support # - android support # - Windows 64 bit support # - figure out how to handle '$' in filenames # - add makefile template targets dpkg-source dist libdir distclean tags? # # #=== end of documentation sections ============================================= # # ################################################################################ ################################################################################ ################################################################################ # GNU make version 3.81 (2006) or higher is required because of the following: # - function 'info' # - variable '.DEFAULT_GOAL' # force exit when make version is < 3.81 ifneq ($(firstword $(sort 3.81 $(MAKE_VERSION))), 3.81) $(error GNU make version 3.81 or higher is required) endif # Relative path to externals root dir in multi-lib source tree like # pd-extended SVN. Default is parent of current working directory. May be # defined differently in including makefile. externalsdir ?= .. # variable you can use to check if Makefile.pdlibbuilder is already included Makefile.pdlibbuilder = true ################################################################################ ### variables: library name and version ######################################## ################################################################################ # strip possibles spaces from lib.name, they mess up calculated file names lib.name := $(strip $(lib.name)) # if meta file exists, check library version metafile := $(wildcard $(lib.name)-meta.pd) ifdef metafile lib.version := $(shell sed -n \ 's|^\#X text [0-9][0-9]* [0-9][0-9]* VERSION \(.*\);|\1|p' \ $(metafile)) endif ################################################################################ ### variables: files ########################################################### ################################################################################ #=== sources =================================================================== # (re)define .class.sources using file names in class.sources define add-class-source $(notdir $(basename $v)).class.sources += $v endef $(foreach v, $(class.sources), $(eval $(add-class-source))) # derive class names from .class.sources variables sourcevariables := $(filter %.class.sources, $(.VARIABLES)) classes := $(basename $(basename $(sourcevariables))) # accumulate all source files specified in makefile classes.sources := $(sort $(foreach v, $(sourcevariables), $($v))) all.sources := $(classes.sources) $(lib.setup.sources) \ $(shared.sources) $(common.sources) #=== object files ============================================================== # construct object filenames from all C and C++ source file names classes.objects := $(addsuffix .o, $(basename $(classes.sources))) common.objects := $(addsuffix .o, $(basename $(common.sources))) shared.objects := $(addsuffix .o, $(basename $(shared.sources))) lib.setup.objects := $(addsuffix .o, $(basename $(lib.setup.sources))) all.objects = $(classes.objects) $(common.objects) $(shared.objects) \ $(lib.setup.objects) #=== executables =============================================================== # use recursive variables here because executable extension is not yet known # construct class executable names from class names classes.executables = $(addsuffix .$(extension), $(classes)) # construct shared lib executable name if shared sources are defined ifdef shared.sources shared.lib = lib$(lib.name).$(shared.extension) else shared.lib = endif ################################################################################ ### variables per platform ##################################################### ################################################################################ #=== flags per architecture ==================================================== # Set architecture-dependent cflags, mainly for Linux. For Mac and Windows, # arch.c.flags are overriden below. machine := $(shell uname -m) # Raspberry Pi 1st generation ifeq ($(machine), armv6l) arch.c.flags = -march=armv6 -mfpu=vfp -mfloat-abi=hard endif # Beagle, Udoo, RPi2 etc. ifeq ($(machine), armv7l) arch.c.flags = -march=armv7-a -mfpu=vfpv3 -mfloat-abi=hard endif # Intel 32 bit, build with SSE and SSE2 instructions ifeq ($(findstring $(machine), i386 i686), $(machine)) arch.c.flags = -march=pentium4 -mfpmath=sse -msse -msse2 endif # Intel/AMD 64 bit, build with SSE, SSE2 and SSE3 instructions ifeq ($(findstring $(machine), ia64 x86_64), $(machine)) arch.c.flags = -march=core2 -mfpmath=sse -msse -msse2 -msse3 endif #=== operating system ========================================================== # The following systems are defined: Linux, Darwin, Windows. GNU and # GNU/kFreeBSD are treated as Linux to get the same options. System-specific # multiline defines (optionally set in library makefile) are conditionally # evaluated here. uname := $(shell uname) ifeq ($(findstring $(uname), Linux GNU GNU/kFreeBSD), $(uname)) system = Linux $(eval $(forLinux)) endif ifeq ($(uname), Darwin) system = Darwin $(eval $(forDarwin)) endif ifeq ($(findstring MINGW, $(uname)), MINGW) system = Windows $(eval $(forWindows)) endif # TODO: Cygwin, Android #=== flags and paths for Linux ================================================= ifeq ($(system), Linux) prefix = /usr/local libdir := $(prefix)/lib pkglibdir = $(libdir)/pd-externals pdincludepath := $(wildcard /usr/include/pd) extension = pd_linux cpp.flags := -DUNIX c.flags := -fpic c.ldflags := -rdynamic -shared -fpic -Wl,-rpath,"\$$ORIGIN",--enable-new-dtags c.ldlibs := -lc -lm cxx.flags := -fpic -fcheck-new cxx.ldflags := -rdynamic -shared -fpic -Wl,-rpath,"\$$ORIGIN",--enable-new-dtags cxx.ldlibs := -lc -lm -lstdc++ shared.extension = so shared.ldflags := -rdynamic -fpic -shared -Wl,-soname,$(shared.lib) stripflags = --strip-unneeded -R .note -R .comment endif #=== flags and paths for Darwin ================================================ # On OSX we try to build fat binaries by default. It is assumed that OSX i386 # can build for ppc and OSX x86_64 can't. TODO: try to refine this condition. # LLVM-clang doesn't support -fcheck-new, therefore this flag is omitted for # OSX x86_64. ifeq ($(system), Darwin) pkglibdir = $(HOME)/Library/Pd pdincludepath := $(firstword $(wildcard \ /Applications/Pd*.app/Contents/Resources/src)) extension = pd_darwin cpp.flags := -DUNIX -DMACOSX -I /sw/include c.flags := c.ldflags := -undefined suppress -flat_namespace -bundle c.ldlibs := -lc cxx.ldflags := -undefined suppress -flat_namespace -bundle cxx.ldlibs := -lc shared.extension = dylib shared.ldflags = -dynamiclib -undefined dynamic_lookup \ -install_name @loader_path/$(shared.lib) \ -compatibility_version 1 -current_version 1.0 stripflags = -x version.flag := $(filter $(cflags), -mmacosx-version-min=%) ifeq ($(machine), i386) cxx.flags := -fcheck-new arch := ppc i386 x86_64 version.flag ?= -mmacosx-version-min=10.4 endif ifeq ($(machine), x86_64) arch := i386 x86_64 version.flag ?= -mmacosx-version-min=10.5 endif arch.c.flags := $(addprefix -arch , $(arch)) $(version.flag) arch.ld.flags := $(arch.c.flags) endif #=== flags and paths for Windows =============================================== # Standard paths on Windows contain spaces, and GNU make functions treat such # paths as lists, with unintended effects. Therefore we must use shell function # ls instead of make's wildcard, and probe for each standard path individually. # Using double quotes around paths with spaces is obligatory. Since some path # variables are assembled or re-expanded later, great care must be taken to put # quotes at appropriate points throughout the makefile. Thanks, Bill. # paths for 32-bit executables on 64-bit Windows aren't yet defined here (TODO) ifeq ($(system), Windows) pkglibdir := $(APPDATA)/Pd ifndef pdbinpath pdbinpath := $(shell ls -d "$(PROGRAMFILES)/pd/bin") endif ifndef pdincludepath pdincludepath := $(shell ls -d "$(PROGRAMFILES)/pd/src") endif endif # On Windows we build 32 bit by default to match Pd(-extended) binary # distributions. This may change in the future. # TODO: decide whether -mms-bitfields should be specified. ifeq ($(system), Windows) extension = dll CC = gcc CXX = g++ arch.c.flags := -march=pentium4 -msse -msse2 -mfpmath=sse cpp.flags := -DMSW -DNT c.flags := c.ldflags = -static-libgcc -shared \ -Wl,--enable-auto-import "$(pdbinpath)/pd.dll" c.ldlibs := cxx.flags := -fcheck-new cxx.ldflags = -static-libstdc++ -shared \ -Wl,--enable-auto-import "$(pdbinpath)/pd.dll" cxx.ldlibs := shared.extension = dll shared.ldflags = -static-libgcc -shared "$(pdbinpath)/pd.dll" stripflags = --strip-unneeded -R .note -R .comment endif #=== paths ===================================================================== # Platform-dependent default paths are specified above, but overridable. # Path variables in upper case can be defined as make command argument or in the # environment. 'PD_PATH' and 'objectsdir' are supported for compatibility with # the build system that pd-l2ork has inherited from pd-extended. PDDIR ?= $(PD_PATH) PDINCLUDEDIR ?= $(pdincludepath) PDBINDIR ?= $(pdbinpath) PDLIBDIR ?= $(firstword $(objectsdir) $(pkglibdir)) ifneq ($(PDDIR),) PDINCLUDEDIR := $(wildcard $(PDDIR)/src) PDBINDIR := $(wildcard $(PDDIR)/bin) endif # base path where all components of the lib will be installed by default installpath := $(DESTDIR)$(PDLIBDIR)/$(lib.name) # check if include path contains spaces (as is often the case on Windows) # if so, store the path so we can later do checks with it pdincludepathwithspaces := $(if $(word 2, $(PDINCLUDEDIR)), $(PDINCLUDEDIR)) #=== accumulated build flags =================================================== # From GNU make docs: 'Users expect to be able to specify CFLAGS freely # themselves.' So we use CFLAGS to define options which are not strictly # required for compilation: optimizations, architecture specifications, and # warnings. CFLAGS can be safely overriden using a make command argument. # Variables cflags, ldflags and ldlibs may be defined in including makefile. optimization.flags = -O3 -ffast-math -funroll-loops -fomit-frame-pointer warn.flags = -Wall -Wextra -Wshadow -Winline -Wstrict-aliasing # suppress -Wunused-variable & Co if you don't want to clutter a build log ifdef suppress-wunused warn.flags += $(addprefix -Wno-unused-, function parameter value variable) endif CFLAGS = $(warn.flags) $(optimization.flags) $(arch.c.flags) # preprocessor flags cpp.flags := -DPD -I "$(PDINCLUDEDIR)" $(cpp.flags) $(CPPFLAGS) # flags for dependency checking (cflags from makefile may define -I options) depcheck.flags := $(cpp.flags) $(cflags) # architecture specifications for linker are overridable by LDFLAGS LDFLAGS := $(arch.ld.flags) # now add the same ld flags to shared dynamic lib shared.ldflags := $(shared.ldflags) $(LDFLAGS) # accumulated flags for C compiler / linker c.flags := $(cpp.flags) $(c.flags) $(cflags) $(CFLAGS) c.ldflags := $(c.ldflags) $(ldflags) $(LDFLAGS) c.ldlibs := $(c.ldlibs) $(ldlibs) # accumulated flags for C++ compiler / linker cxx.flags := $(cpp.flags) $(cxx.flags) $(cflags) $(CFLAGS) cxx.ldflags := $(cxx.ldflags) $(ldflags) $(LDFLAGS) cxx.ldlibs := $(cxx.ldlibs) $(ldlibs) ################################################################################ ### variables: tools ########################################################### ################################################################################ # aliases so we can later define 'compile-$1' and set 'c' or 'cxx' as argument compile-c := $(CC) compile-cxx := $(CXX) ################################################################################ ### checks ##################################################################### ################################################################################ # At this point most variables are defined. Now do some checks and info's # before rules begin. # 'forward declaration' of default target, needed to do checks all: # To avoid unpredictable results, make sure the default target is not redefined # by including makefile. ifneq ($(.DEFAULT_GOAL), all) $(error Default target must be 'all'.) endif # find out which target(s) will be made ifdef MAKECMDGOALS goals := $(MAKECMDGOALS) else goals := all endif # store path to Pd API m_pd.h if it is found ifdef pdincludepath mpdh := $(shell ls "$(PDINCLUDEDIR)/m_pd.h") endif # print Makefile.pdlibbuilder version $(info ++++ info: using Makefile.pdlibbuilder version $(version)) # when making target all, check if m_pd.h is found and print info about it ifeq ($(goals), all) $(if $(mpdh), \ $(info ++++ info: using Pd API $(mpdh)), \ $(warning Where is Pd API m_pd.h? Do 'make help' for info.)) endif # print target info $(info ++++ info: making target $(goals) $(if $(lib.name),in lib $(lib.name))) # when installing, print installpath info $(if $(filter install install-lib, $(goals)), $(info ++++ info: \ installpath is '$(installpath)')) #=== define executables ======================================================== # By default we build class executables, and optionally a shared dynamic link # lib. When make-lib-executable=yes we build all classes into a single lib # executable, on the condition that variable lib.setup.sources is defined. ifeq ($(make-lib-executable),yes) $(if $(lib.setup.sources), ,\ $(error Can not build library blob because lib.setup.sources is undefined)) executables := $(lib.name).$(extension) else executables := $(classes.executables) $(shared.lib) endif ################################################################################ ### rules: special targets ##################################################### ################################################################################ # Disable built-in rules. If some target can't be built with the specified # rules, it should not be built at all. MAKEFLAGS += --no-builtin-rules .PRECIOUS: .SUFFIXES: .PHONY: all post build-lib \ $(classes) $(makefiledirs) $(makefiles) \ install install-executables install-datafiles install-datadirs \ force clean vars allvars depend help ################################################################################ ### rules: build targets ####################################################### ################################################################################ # Target all forces the build of targets [$(executables) post] in # deterministic order. Target $(executables) builds class executables plus # optional shared lib or alternatively a single lib executable when # make-lib-executable=true. Target post is optionally defined by # library makefile. all: post post: $(executables) all: $(info ++++info: target all in lib $(lib.name) completed) # build all with -g option turned on for debug symbols alldebug: c.flags += -g alldebug: cxx.flags += -g alldebug: all #=== class executable ========================================================== # recipe for linking objects in class executable # argument $1 = compiler type (c or cxx) # argument $2 = class basename define link-class $(compile-$1) \ $($1.ldflags) $($2.class.ldflags) \ -o $2.$(extension) \ $(addsuffix .o, $(basename $($2.class.sources))) \ $(addsuffix .o, $(basename $(common.sources))) \ $($1.ldlibs) $($2.class.ldlibs) $(shared.lib) endef # general rule for linking object files in class executable %.$(extension): $(shared.lib) $(info ++++ info: linking objects in $@ for lib $(lib.name)) $(if $(filter %.cc %.cpp, $($*.class.sources)), \ $(call link-class,cxx,$*), \ $(call link-class,c,$*)) #=== library blob ============================================================== # build all classes into single executable build-lib: $(lib.name).$(extension) $(info ++++ info: library blob $(lib.name).$(extension) completed) # recipe for linking objects in lib executable # argument $1 = compiler type (c or cxx) define link-lib $(compile-$1) \ $($1.ldflags) $(lib.ldflags) \ -o $(lib.name).$(extension) $(all.objects) \ $($1.ldlibs) $(lib.ldlibs) endef # rule for linking objects in lib executable # declared conditionally to avoid name clashes ifeq ($(make-lib-executable),yes) $(lib.name).$(extension): $(all.objects) $(if $(filter %.cc %.cpp, $(all.sources)), \ $(call link-lib,cxx), \ $(call link-lib,c)) endif #=== shared dynamic lib ======================================================== # recipe for linking objects in shared executable # argument $1 = compiler type (c or cxx) define link-shared $(compile-$1) \ $(shared.ldflags) \ -o lib$(lib.name).$(shared.extension) $(shared.objects) \ $($1.ldlibs) $(shared.ldlibs) endef # rule for linking objects in shared executable # build recipe is in macro 'link-shared' lib$(lib.name).$(shared.extension): $(shared.objects) $(info ++++ info: linking objects in shared lib $@) $(if $(filter %.cc %.cpp, $(shared.sources)), \ $(call link-shared,cxx), \ $(call link-shared,c)) #=== object files ============================================================== # recipe to make .o file from source # argument $1 is compiler type (c or cxx) define make-object-file $(info ++++ info: making $@ in lib $(lib.name)) $(compile-$1) \ $($1.flags) \ -o $@ -c $< endef # Three rules to create .o files. These are double colon 'terminal' rules, # meaning they are the last in a rules chain. %.o:: %.c $(call make-object-file,c) %.o:: %.cc $(call make-object-file,cxx) %.o:: %.cpp $(call make-object-file,cxx) #=== explicit prerequisites for class executables ============================== # For class executables, prerequisite rules are declared in run time. Target # 'depend' prints these rules for debugging purposes. # declare explicit prerequisites rule like 'class: class.extension' # argument $v is class basename define declare-class-target $v: $v.$(extension) endef # declare explicit prerequisites rule like 'class.extension: object1.o object2.o' # argument $v is class basename define declare-class-executable-target $v.$(extension): $(addsuffix .o, $(basename $($v.class.sources))) \ $(addsuffix .o, $(basename $(common.sources))) endef # evaluate explicit prerequisite rules for all classes $(foreach v, $(classes), $(eval $(declare-class-target))) $(foreach v, $(classes), $(eval $(declare-class-executable-target))) #=== implicit prerequisites for class executables ============================== # Evaluating implicit prerequisites (header files) with help from the # preprocessor is 'expensive' so this is done conditionally and selectively. # Note that it is also possible to trigger a build via install targets, in # which case implicit prerequisites are not checked. # When the Pd include path contains spaces it will mess up the implicit # prerequisites rules. disable-dependency-tracking := $(strip $(pdincludepathwithspaces)) ifndef disable-dependency-tracking must-build-everything := $(filter all, $(goals)) must-build-class := $(filter $(classes), $(goals)) must-build-sources := $(foreach v, $(must-build-class), $($v.class.sources)) endif # declare implicit prerequisites rule like 'object.o: header1.h header2.h ...' # argument $1 is input source file(s) # dir is explicitly added because option -MM strips it by default define declare-object-target $(dir $1)$(filter %.o: %.h, $(shell $(CPP) $(depcheck.flags) -MM $1)) $(MAKEFILE_LIST) endef # evaluate implicit prerequisite rules when rebuilding everything ifdef must-build-everything $(if $(wildcard $(all.objects)), \ $(info ++++ info: evaluating implicit prerequisites in lib $(lib.name).....) \ $(foreach v, $(all.sources), $(eval $(call declare-object-target, $v)))) endif # evaluate implicit prerequisite rules when selectively building classes ifdef must-build-class $(foreach v, $(must-build-sources), \ $(eval $(call declare-object-target, $v))) $(foreach v, $(shared.sources), \ $(eval $(call declare-object-target, $v))) endif ################################################################################ ### rules: preprocessor and assembly files ##################################### ################################################################################ # Preprocessor and assembly output files for bug tracing etc. They are not part # of the build processes for executables. By default these files are created in # the current working directory. Dependency tracking is not performed, the build # is forced instead to make sure it's up to date. force: #=== preprocessor file ========================================================= # make preprocessor output file with extension .pre # argument $1 = compiler type (c or cxx) define make-preprocessor-file $(info ++++ info: making preprocessor output file $(notdir $*.pre) \ in current working directory) $(compile-$1) -E $< $(c.flags) $($1.flags) -o $(notdir $*.pre) endef %.pre:: %.c force $(call make-preprocessor-file,c) %.pre:: %.cc force $(call make-preprocessor-file,cxx) %.pre:: %.cpp force $(call make-preprocessor-file,cxx) #=== assembly file ============================================================= # make C / assembly interleaved output file with extension .lst # argument $1 = compiler type (c or cxx) define make-assembly-file $(info ++++ info: making assembly output file $(notdir $*.lst) \ in current working directory) $(compile-$1) \ -c -Wa,-a,-ad -fverbose-asm \ $($1.flags) \ $< > $(notdir $*.lst) endef %.lst:: %.c force $(call make-assembly-file,c) %.lst:: %.cc force $(call make-assembly-file,cxx) %.lst:: %.cpp force $(call make-assembly-file,cxx) ################################################################################ ### rules: installation targets ################################################ ################################################################################ # Install targets depend on successful exit status of target all because nothing # must be installed in case of a build error. # -p = preserve time stamps # -m = set permission mode (as in chmod) # -d = create all components of specified directories INSTALL = install INSTALL_PROGRAM := $(INSTALL) -p -m 644 INSTALL_DATA := $(INSTALL) -p -m 644 INSTALL_DIR := $(INSTALL) -m 755 -d # strip spaces from file names executables := $(strip $(executables)) datafiles := $(strip $(datafiles)) datadirs := $(strip $(datadirs)) # Do not make any install sub-target with empty variable definition because the # install program would exit with an error. install: $(if $(executables), install-executables) install: $(if $(datafiles), install-datafiles) install: $(if $(datadirs), install-datadirs) install-executables: all $(INSTALL_DIR) -v "$(installpath)" $(foreach v, $(executables), \ $(INSTALL_PROGRAM) '$v' "$(installpath)";) $(info ++++ info: executables of lib $(lib.name) installed \ from $(CURDIR) to $(installpath)) install-datafiles: all $(INSTALL_DIR) -v "$(installpath)" $(foreach v, $(datafiles), \ $(INSTALL_DATA) '$(v)' "$(installpath)";) $(info ++++ info: data files of lib $(lib.name) installed \ from $(CURDIR) to $(installpath)) install-datadirs: all $(foreach v, $(datadirs), $(INSTALL_DIR) "$(installpath)/$v";) $(foreach v, $(datadirs), \ $(INSTALL_DATA) $(wildcard $v/*) "$(installpath)/$v";) $(info ++++ info: data directories of lib $(lib.name) installed \ from $(CURDIR) to $(installpath)) ################################################################################ ### rules: distribution targets ################################################ ################################################################################ # TODO # These targets are implemented in Makefile Template, but I have to figure out # how to do it under the not-so-strict conditions of Makefile.pdlibbuilder. # make source package dist: @echo "target dist not yet implemented" # make Debian source package dpkg-source: @echo "target dpkg-source not yet implemented" $(ORIGDIR): $(DISTDIR): ################################################################################ ### rules: clean targets ####################################################### ################################################################################ # delete build products from build tree clean: rm -f $(all.objects) rm -f $(classes.executables) $(lib.name).$(extension) $(shared.lib) rm -f *.pre *.lst # remove distribution directories and tarballs from build tree distclean: clean @echo "target distclean not yet implemented" ################################################################################ ### rules: submake targets ##################################################### ################################################################################ # Iterate over sub-makefiles or makefiles in other directories. # When 'continue-make=yes' is set, sub-makes will report 'true' to the parent # process regardless of their real exit status. This prevents the parent make # from being aborted by a sub-make error. Useful when you want to quickly find # out which sub-makes from a large set will succeed. ifeq ($(continue-make),yes) continue = || true endif # These targets will trigger sub-make processes for entries in 'makefiledirs' # and 'makefiles'. all alldebug install clean distclean dist dkpg-source: \ $(makefiledirs) $(makefiles) # this expands to identical rules for each entry in 'makefiledirs' $(makefiledirs): $(MAKE) --directory=$@ $(MAKECMDGOALS) $(continue) # this expands to identical rules for each entry in 'makefiles' $(makefiles): $(MAKE) --directory=$(dir $@) --makefile=$(notdir $@) $(MAKECMDGOALS) $(continue) ################################################################################ ### rules: convenience targets ################################################# ################################################################################ #=== show variables ============================================================ # Several 'function' macro's cause errors when expanded within a rule or without # proper arguments. Variables which are set with the define directive are only # shown by name for that reason. functions = \ add-class-source \ declare-class-target \ declare-class-executable-target \ declare-object-target \ link-class \ link-lib \ link-shared \ make-object-file \ make-preprocessor-file \ make-assembly-file # show variables from makefiles vars: $(info ++++ info: showing makefile variables:) $(foreach v,\ $(sort $(filter-out $(functions) functions, $(.VARIABLES))),\ $(if $(filter file, $(origin $v)),\ $(info variable $v = $($v)))) $(foreach v, $(functions), $(info 'function' name: $v)) @echo # show all variables allvars: $(info ++++ info: showing default, automatic and makefile variables:) $(foreach v, \ $(sort $(filter-out $(functions) functions, $(.VARIABLES))), \ $(info variable ($(origin $v)) $v = $($v))) $(foreach v, $(functions), $(info 'function' name: $v)) @echo #=== show dependencies ========================================================= # show generated prerequisites rules depend: $(info ++++ info: generated prerequisite rules) $(foreach v, $(classes), $(info $(declare-class-target))) $(foreach v, $(classes), $(info $(declare-class-executable-target))) $(foreach v, $(all.sources), $(info $(call declare-object-target, $v))) @echo #=== show help text ============================================================ # brief info about targets and paths ifdef mpdh mpdhinfo := $(mpdh) else mpdhinfo := m_pd.h was not found. Is Pd installed? endif help: @echo @echo " Main targets:" @echo " all: build executables (default target)" @echo " install: install all components of the library" @echo " vars: print makefile variables for troubleshooting" @echo " allvars: print all variables for troubleshooting" @echo " help: print this help text" @echo @echo " Pd API m_pd.h:" @echo " $(mpdhinfo)" @echo " You may specify your preferred Pd include directory as argument" @echo " to the make command, like 'PDINCLUDEDIR=path/to/pd/src'." @echo @echo " Path for installation of your libdir(s):" @echo " $(PDLIBDIR)" @echo " Alternatively you may specify your path for installation as argument" @echo " to the make command, like 'PDLIBDIR=path/to/pd-externals'." @echo @echo " Default paths are listed in the doc sections in Makefile.pdlibbuilder." @echo #=== dummy target ============================================================== coffee: @echo "Makefile.pdlibbuilder: Can not make coffee. Sorry." ################################################################################ ### end of rules sections ###################################################### ################################################################################ # for syntax highlighting in vim and github # vim: set filetype=make: iem_utils-v0.0.20180206/iem_adaptfilt/doc/0000755000175000017500000000000012630366344020242 5ustar zmoelnigzmoelnigiem_utils-v0.0.20180206/iem_adaptfilt/doc/adapt_filt_lib.pdf0000644000175000017500000301231012630366344023672 0ustar zmoelnigzmoelnig%PDF-1.3 %Äåòåë§ó ÐÄÆ 2 0 obj << /Length 1 0 R /Filter /FlateDecode >> stream xÚÅ]ÛnG’}ϯ¨G `÷äý2o³ã ½6¤Å¾ `Pd‹äHìnñâ±üõ[]]Y•‘‡]›+ì£XÝÕ•™q9qâħî×îS§tÿÿ+)¥ê\«ä»¨ÂÊÚîvÝýo·éþú;Õßurø¿»óþ¹Òöðßýÿί¼í¬^ÙØÆùM÷_o;wøëñŸ·7Ý_P+Ù©îíûîU÷—îí¿»ïßö_¿gôÊyaÒ*Úþ|§ì*Æ¥_?ÞÞYÓ?³TbÁ÷«Ö÷wôýâ©ß'ßøýâ)¿-€XúÊ™þÑ»Ü*éq¬Ú_‡ ŸúÃ+Ox€þãÇn¸¾ÿG°øex€ò'ÖòÕwÕ%/Ægž\Qi¼çõu})¿ùÕ»ÉÑÿ£¯ÜV÷hïÆ+gÕ# Ý#æWL~ìÏõ=ÁŽWþV?·Uñð>^ý½¾ÔxÓEuÅ)S=œÈW\¾gWß“ò=÷Õ¯ÂøNëçMïù½¾òO]ϯˆ ó:Ô¿4èüi?ÔWèõ O &WR¾ò±º'ª¼@÷ëúR0bºªË6v}²Dcc› Vý¯@»>YâI'«y´Eûdiß[×ã0ž,Ñ8YõK‹32œ“\½Š6;q!Ÿ«»j{h™ï¹ªOœ5í-ÕiÚlÕ¯1*‚ÍVÎâ;‹ý=beS8-Á³^³g‡+É â4z6gÃxåÇÊ‚x™?­¶ˆžÞõk~®F‹Ê-_Hù®óz¹µ­~Q6!Ñå§«ßOL©½ª]«?ítÞD»ßéË7üðvÄ3`<ò"»ó!š Ò•¿Ø™‹“ES>†…ßð"åOŒ7ÇÃ}u%ä½vµ½­.);?¿nxßwÔßž¾Òâ± !Å…?T<=hYbÛûb%—¿iñê§ê¥Y;sÊå‚÷3ADÌïÃÃ]½NϬÇä E&?[½\)¶u{]ݤ­¬”®¸$¦qÁäJ˜äÉ•Êè•íaT~ìMý†,Øeý“LL£Iþ׫çÙQ¯ªVƒáX~~6ý»óå³àÕÅyDU.¤0þœúÅ• •8òW“'—è ^þVŸnMÇñ-[#=šäߨJÖ¸ü“n&Wö[̤¼°¿}Wï{ºé¿ë+1ÑÓÍß©#Wû[}Zœൺ˜Ý¿þrêÀÎ¥Uâ–þSv£™÷iµÜËœÐËeã·ôûßÖÛƒ¢ºíM½³i©Ïñ2¢²q Y?Jjó«)‘bÆTSøÆì"…–+K¦)idÖŠÀÑZM.é+ß°“•{:KŸw]½U«òQ`߆¾£ì·Ú’9ÁÁïwMãàÖOfÿÀ¾§›êƒ¤¯ž.¿Ö`:ø!ZpðCÊáå³~3¾Tö«¼ñÜ;¹²_1º4ýO‡êÊ÷‹/úþüóe\Å8BuC´$ó?Ut¯VÔ¿q³S*Êò"]uí²V”ʇwS_¡„íþ¶¾”ò‘Ú^L.íDû8KAËM†Ò¼óúŠ)g@̯PZv]ßCñÁvS/xÖöèíðŇõé¬ÏËì—öI xÎþ_€ø²ïÃMùûÅ2¿ØÍübeqEˆÀ½P ÅÜ¥²•Ÿ ¤Œ æ|«c0¹Õ¸Û·ïk§¨Qî¡)J½¯\•¦ƒxÅ|lL €6²¼Q9Òü»[–Ðæ×°ýwõN‹'­ý›Õó7ÍÚfáæ$²0±tâ®[¯hýV'Ñ‚;ú­÷UäïèuoYŒ¢ °Syÿ”?íÚÁzãÀ‹ó.ŒîsQUÐ ÄbÁ;°UCHUÀUœ¼W¢ 3tirE£|*ÐÙÕI7½º_ê{}¨wI¢ô¡~­)j”&®(IQK%Ù † HW¯:YYNÅŽg%¹df@ È_óëïÛ–¯–Ìó¼:7½5BÇPÏÇĨ$Pnl<ü@+sI¯ÄD9ÛP§ƒªLR+]{…G ªoO­&·/C,x€1[eûÏ¢|8A~„Á„”Œñ9sW°0E·cx¥Þã MXEÌ€&ozSÙÖ‚°„ÌTæýtጱÄKâ™sæš Âü½ë÷ ”jjN~~5ÿaû& àÄÃÓÑáÕ•Küþ­øõ”×G¯N/Ik~aÇ C ·,³?&ñ˜i„³§oÓ÷ÑÚDjiQÔ¦µ€…6 8CM'þ»z«üã/ÿh€&&§ðï>³pJ¢÷`u˺ˆYØVG %l»†aÛ»Û:6Rhc;ƒB çri…ý"G•²ú{Š™¶›:àôч2€ß4Ä`¢ ¸ t6 qdèëO´ÐÒû4cL}€Z¢÷zË"*P.Éy°´) í•â, ˜F#’¬ÙGæ¡È]ò˜LùÔ\³ÀHÂÀ® W7õ“¨ˆ* ý]¹Q­ÕøïÙ%âgðÇ×qŽŒL/fñ‘aFZÆ `­ŒCÞG_zÏã3:XÚï,@°{£Ù.®X!ÒLhî¦~ §=pë­Q<¢¼­_p©¬zû!g$•ÿÙ%ƒ4h]ÞÔϱ}dx‚‰h””ë‚]K´Ô»Úöù‡fO%úÈßyX!󓜺F<ÆvO \W¼¯½72ãÙ(ëÆmÆŠa ™iÕØ{b°‘èe–¢íå Ö[:‰Tz$VÎ+C#›ª¡ )Á}óêˆì˜‘¾hŸã,9d>J&yËÊ¢aFù›†.=2%ûÁK°dzTÝ=¼ûÈ`¢Þƒ#‹rWG!ôî®dóÇ1,ÈÇŒ=l.Ö°²Ã`‰¼T$Žã ÚA1k ¹ð^›ÂbeV'&ÛêCÞ° âYlßÅdÛÑ&» Í\G<ãû—€!ã÷«£6ñ…x;#Ý<…UðKJzUUV*Pma IÊî¤D|âõú–jz/Ækºrså.M¨ÞýU]õ |âÕÍÝËL—¿Ò—)ŠÚ¨ ý+TE÷á$üòÙ~ª½Å¸;T‡w,Ëvÿuå_”FTEtÙ³<8ê(1U¾o§ä±™›•(—0*ÛvÌj8c.˜…Ùm[ 7þ„ž‘Õo\vÛÌÿ!ØÃ’o®¼p¡8Žhwg H›£ùS©Pò浸ÌôD®;ÛÔûÇF2•\ÿ ó½ùžO,P,iQyXÊÍ™ÃNhC&eªhæ/ªY,‰ˆ9Õ&I ²†$¡×;viŸ]‰vÅÅ¡PHI":þÎ’2…ž>#žõ3L/ù¼º<Ö¸RŠÞ-Ë• Tºæ €DɦvùupT’MžQjÂf9»ŠH6 ¿“%›ƒ-­Ý©,í¥ÔžÅ‘™•zWÃŒ‹gö@-‹¬³ûf°¯™°¯š¹Ðaæ‚E@á!?ñ²‚!ÊxtÕý4õnnÖª2M<…_¬DQr§P™ß.]ÛCnùê¦Îî$š¬Féª%úþÝ©éîÞ AÞ " Ì–A±Yd‚“ApÔ»m5ŽÃÖ‰`u´Ê‘oìT6˜_{ÝÂla‘Žb]˜–‚³àå‰5ßà·Z§×-h(«ü9™¤â´Cäkªƒ\1ÁôßEðzjUx_šBa¼…ÕùÆš†fTRJ*ŸO\ä5VíÔádá"¯y1Òš±C³Òôh?Þ€ÌL¢m,ÎÜ=Xø‘ÝÀ??f ¹KÈCƒœ7Àö¼:½ê]±X_YôqŠ6û5‡ÔAÍO%Pèš<Ìå-ïËÉçà‚»8^Æ:dÆ N”¨‚À²8k¬F[}êZŒ¶®b´]ݰü*¼«sÒïé«/êêj@T(i!ÜŽÜSñv/„¨h³Œå^7"(T3(ó%/÷Ÿ×…%‚‚/Ö-Ú‰hæLTìg5øRR}¨kÜÖ¸µ‡·Q œ|CN“Ñë aˆwup _„¥q¹a„ˆPÆ*ºŒ.…A\Zg3ùo{ÎŽ#ª{¶ÑH Ø'Þ¡×ûŒìp–B0(ÒDkÚí>Öv]¡03Ltt…z!xM¡yZ ÂÂYI¯usÇ8 vV‰˜rdw’1yÃYv(*•_n¸"ZÒ{^ ˆh®¬BN.{Æq=æ*&óJJk ™¶' BŒ‡Dˆ eÁ6å(ôf˜'‘o.%» ¡g¼WÌ$ä¶,Y²+TõmÀžÁ!KFu†z˜uÓ™0“t›Ù$Ø1!¶‰Z!<¡ÂÛw DYUÐHg¤4ÓÃò£¹NÞ´z£æ{å„·8´%5v¾hŒ[ ¼oÄ¢¹rˆœ"2)]´g›ó/hU9°‡ž‹Ì&¹Ð5½T¯ŒYÖÿÿ?mß[÷hÔt šˆ‹±zØœcÕ(êh ÐPm5@ÿ Ýô33pTÆì@ÌÕ™éˆ^Õ)¢= †ª#,æ"nà #Ú–nÚ0;)Ákp°ÐM:ÐçáœR…`ßä7Ü+¯x£@rçm<`æ` –ZȆ0…Hydš.—öÖÆB•æåÈÀUMİœì†1(w•Ì’‘t˜n" 0¥„ZdRE”¨`ªÑǬp3î™.›u²‚Í:Ö‰•{©DÓ[uå·ªØj ¸aО‘9;«m*Ì •Dí\j¢&j, ‘—<"«˜€=Õ›0ο¶H–©´<ý‡n„€ç®&ÁÞtéf‰ªi¶zεÐx%- ëSkNf=‡ÜÆíæ÷šÃøHd ;Éš]Ö Y±©,*òU%à„ê.rP];œq,ö`­)˜–¤±èk¦C²­7¼þ’Š÷rÚ¾é³U³ˆ¶Ïj7Gñe%hÉoÐ!¨F° ³º0*½È ëÒI)ú¿¬éÝgZ§æ$HZÖ UÞ,ŒÈÈùpí¶«3v~a+Ú#¢/ÔMÉ2廄Z¡¼F6ÄÛ‰ aT>›qf–?¹¹©˜õì0SAÍÃ…1 4,‘¤;W(°¨¼œ|9D‰c®Ò*Ì+‰`þšÇUBЧ|ÃÒLË?j²ÔH#z‰†à„Ì2* CA¥‘.mQp£Êï¬y8<Í".†L°CÌÄM"€ ª o\SâHãQeZÒ’±;µnˆT°¯f ûí‰)eV (ÅtmÄ£°¨Ì#¦ežs$\ÂŒV@í…èÀJtu *pv9¡kÔ•X Bt2Ý‘©_º;Ò^¥ïèî¨!¤©ƒJ6"(·5rÖ 2H•k-TŒÝóZ¹Åãñ— o*­‘Ï5*zÔ~³¨}oxÂ%QU!È?0tKÁ–iXñ×6·ÆsÕ¿ à­»Ý`“k z^†"Ø‘7”Á±pÎZÔ‚ma'¼°«¾ôX±Ò¥; OµÆM.’I áŠ3,¦Å”µ2¤ÀXŽ·Zˆ‰%”DEˆ· ˆ+.@Ù!F iTÈïNÜǹ¯öw-<äxÍ/- Æ°g5ß¿ÄkãJà®N×ÍLZö„Òvò\}eâH Æ,O`h“Ï"òóˆj6™d$@ÐÆ‹9®N¬‘kìÀó?òÆ^ZBÙ¸}ÿ¿x¢t{£ÑK,iôÊK¶áïÙgjÛ DûXæ¯yKäˆäXD±ÔþÉ6Z@堄ɽ½fÞ*ÃlÞ‡F=·–õéR@9,Äßå„\9 m:ú=Ô¸a€T–„Bq¯j}ÖHÎÕS2ô™k… ‘#AÂä=@íÓP¡¡Œ?:c½ÏЧ¾Â1¡¤P‚™LiLr ÎyÛÐ(Ç=tEƒ,×ÖcìÀ& `ÃQ‚,õõ ž6P¹è5Ó+óŠjd@Ähcœ€ü+ ¢”š;·­D•Oe•ƒze‰ã)K!Û7Œê‹%½ øSOp}9 8 †‰rô£™{PÞX<£È! QŸÄ“ħùˆË+Æ+缡rŽŒšŠ¦°ô9I8ÁI=¥"»ýÈËèwäœÞ™ÀôJnZf/·qƒ•«GúãKØp†à«Dk‚‘ÜD‰|€à&C·Ô¤¦ $*Æï BµeM æ¸)›—ê…:c$zqño „*ócàéµ1”Ó°zX0>)ÌHPSÊ›„ (ã¼Ë61 tí2®r ̃¥…ñϼ=%Í,BðPŽ>pŒ¨:‚þäâ((B0d3ÉÂvyz¶í†32 ™—˜w,-jèCØ"a|¥”2Hz¤¨Ñß4Ä葚{уà½Le,/¨8ƒ¼Mär¬ vÚ”™¼½ÈHØØi-²‰¥»ˆ³™úAÍ 1k‚š±Op*³†BnimçÉõ3¨M̽ÀH¯vTNÐÛãlN¢•1|;æÁqcY”°ÚmP;Wa v ¨ÝP¦— ŠWºJŶðXДlô›ëMð¶oý² ªF‡•ÒK ¹ ö{Ð0Ø­2íwöQ$÷Ž“‹ÌÌšqÜÓÄ$£oý èÛñ×ó¢ªAF™Eƒ%ö‚^¢]ý¸¸ÀÁͶˆ¼Wó B°D1eí—>Ó~©¹ƒQÞ=lÏÚv¬¬‰jü†¶M² °’B¬s°IjÃÄÁ&TÙtpŽciéz‡(Á\‘ÉAb¢§ýϺÊ—z%ø|DØU„B·A£òf°y¯² Á»dçLƒ3f°Éë¡dü,¶äãb(?ø×"WCoš³Ë4äš’Ëç]ºp015Þ7:šP¶¨=,æ“Ë¿æM0hD1Ûá@Á‰Ø‰TðM¬å6 *4Mÿýû_3ÂEjÃlÂ,û’ô;\÷¬Ï‡˜q9A[NH“ÀIç†Rƒ:½Ë˜ Z§"laÏÄ~Áù£Òñ0 { ž–g¼L„ ˜´kŸÃY4ÑHɘâLûé°Ïï&pü‰¢†D§´P¸ñ³i‡,í9Н6׌ÿ›—âÓÃzi¯·(ÌŒFS7ôR7ˆÁUH 3‚¡?Ê¡œíÙÃ?÷:fâØJ”X:5ŠY7P~ÛN“ašËõ©…SÜßµtÉ%<ôì€þ°GÖ"BlÚš>°7”´_®Ÿ0*W5Y¦]ÆÖr›D:¹†J\w, ­khl÷†÷3ÎrårËúÜ`ë¯F›ö“0Ä©ƒCœ®ù M·‡V=°e*­¿ˆó, M2Û‡—6 ÙçLØd.TDÈvä¿.N ɰï#žžÈÇõ ¿=u#³R{ņI3ps¡!€Õq]4VÚ)Ešš‡§™‡Ñâ4Ò!þ¼h¬LD·1%$´féÙ™xV@²ç!r§óvCØ!tt Gû %½ÉâKH°§x96¤M,:nvg¹²ÀÝlêfAwlu üØre8Ù®ZÛ€œ‹ƒ%$§2ɺrœ‡rµ¡.ô FfagÓ/äêo8†µ¥Ð$/‰™zÚ—PÖ[Äë®™\e§éF1æºÈæ’U¤f"'o13'R'À›”ø²Ù¥JTFYñlÆÁz Ù,7¦¹•ñ,!È3$b>O:–x>²vp2ù”†@ݼ N4©) ºçåYÇ~«"}εæ¦ã-ëæáEMFª@ ¼ðçCqÉÉ$ M.+º)\ÙË!Ý{¡Š@ƒf'TÇ"Ë ®"ÀY&dW.?3mÙ2“ëÃQÏðæ1.É‹äìaéÀ˜³7:·€5L jÉKš-ÍÙ9LAçe ì„Éq;$9p<¹(å9¨?µ;ʘší7'öÞ¶_˜þC–»o¦ÚóäQ0ÝD¤¹.chL!@â@BEYL!𨩗šÿËè~h÷ÿ±@žòö)÷/>|dïÔ¡yn ’ ûÀ[´³Ê¢8zvOÃ5$Í4 )ÚÛ;ö€†Ø·g\& :0˜¨ÑÚ5äDÜÖhÀQ(rôž Giè–D‹ëçVfÖ ˆªŸ¾ô«r,Úƒµ-§œ€tX y{jƒU«>bƧ¥=E­Q›¹F툵°pŒ:(Á°+aÙ´G˜‰ˆÀP˜‰\€vÔÅÃyµ?tÐ0ãÈ;çbuêHú ë&žÓù…%„ÑÊZ;•_Ü9a›"Q³¹bGªŒ1€õu2Ëø`bö3ïîÜŽWÔ:†Eºò œTÆu’ ªSGÔÿRÆ!0n‡°ªZ¶qK»÷À혎rˆã nâ¨ÂÌF—HH-k0ˆ\ÌT žo ™qaŒ–¸êg€ùX7 °!BD#Òc_°qìÖÉon؉@@ÒP ’ì劉ƒ‚[ˆÈç™J“C6«yÒå(Õ8´©É0„¢(Ãé¬9^¡Jtcî*‘MøsjÚÒÖR"þ Uç6^<7«ëLˆ¢2°ÿï]ïZ§=Úõ5LÚÏF?|ÿ³<Oùýj¸—ý~±lJùa¯)å‹eýƒ—Hò†ç ¹B­9ôqï¡R@=XNÃxûˆR€h'ÛÈréÓÀtßP þ¨$ºÝÔõP:ÝÊÜ{^]5¢"xsÆõœeõ[kø[Coy„DEÃ'*0`¾BŠœüO0çx5mjOUÄœÿÎ0~O4Ô¸c›ÙùÔ€}GŒ‰Ã¾¥uíŸDÓœ‚÷Tl\b.À|Ûýxq5¨™Vî3`&Q9 u Ú›Fr‹F2Ç\'UvئCªŽ)!I @Þ0S†¸&ôýèó'Ïr }úÒÄñ—vò6q•Z³3ųÝSæK©8@È €Å™\KÞFÌ39>ãÎ?×)/´{©C½‡Ðä57hbEêó68°~5J¯89S:¨™‘J›-îì sáJ¤ÅÓai76íÀkPäµTÚ¬¡(›Éê…ñ‹ÅI ¢ûnø~ñ–?À ª‡Bº ‡¥ÄC]Éž¯¡’ÊE×šÑ ÚJ^PŒË-ëzG•Ïa\COtϺÞ-šñYz Vlع|Ñ®wå‡Ép Öûûúç?xÞHâ‡Å¹jð QxCë-Cª£…É:Jð5E,T1H­^;¤ó°¤-…‡7ó>^1Ý:ù‹.Ù~£=Ïz·¬ @¹ÎÒÉ»âüTu 1R”Ör6¸¬(ûñ¸Ì[¤ï¡2¶‡J>!*r F’Ífì,.+¤çw¬ÚrÅ1N> endobj 6 0 obj << /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] /ColorSpace << /Cs1 3 0 R >> /Font << /F2.0 7 0 R /F3.0 8 0 R /F1.0 9 0 R >> /XObject << /Im1 10 0 R /Fm1 11 0 R /Fm2 12 0 R >> >> endobj 11 0 obj << /Length 13 0 R /Type /XObject /Subtype /Form /FormType 1 /BBox [ 0 0 1416 152 ] /Resources 14 0 R /Filter /FlateDecode >> stream xÚ­Õ±nÂ0àÝOqíÔb|¶ïœ ]ZµC7¤HJ—¢v¨åý¥šâ lÈ©!¢|±ÿ‹Ï˜ÃLü G$ ¿_ðk˜=m-,·Ý¶Ëxv‡ÓÝÏîÂå [hXug†©«=chW0{ñãí7T7hà¹ížuA«)p‚H›=g!ÕAp€ÐÆoGpO|Jv‰=±¨$FÓ$£îµh&d²ã˜Hky¤H$†3œ›Œ(SGWÕÕÿOÕûBª÷eE^×^!c„‘d ¤‘dÚ #95˜0iýÞJŒ€˜› Š ºFijÌ*Z룆 )-`”T¸`P=¾Âê¸3:Éø — 4<¾ÄE]v$¯2¤ ¹†t'B,ÛŠˆ38²¿ª)jL\jË×ÞòÉÄÞ÷šŽé¼s¶yNU7UÚC´ƒ8îÌt\0UµÉ˜ÿ2à¦^ endstream endobj 13 0 obj 353 endobj 14 0 obj << /ProcSet [ /PDF /Text ] /ColorSpace << /Cs2 15 0 R >> /Font << /F7.0 16 0 R /F5.0 17 0 R /F6.0 18 0 R /F8.0 19 0 R /F4.1 20 0 R >> >> endobj 12 0 obj << /Length 21 0 R /Type /XObject /Subtype /Form /FormType 1 /BBox [ 0 0 2400 128 ] /Resources 22 0 R /Filter /FlateDecode >> stream xÚ­–=OÃ0†wÿŠƒ©êúüí ,•"±°ÐhF”øõ$¡#ÕMu„$’óá<9¿ïÙ—5Ì` ¢Ú¥Pzx€[(`zQ*ÈËæ™€2¯ºas:©›ºc¾‚ó ‚eÍÝ`a¢¼ƒ²L¯ÇêìF'cÈžá2k¾u‚’g#[ô’XC‚ m}õ‹Àñ}a¶ˆª­”bñB #` C¶ˆ»i(Ò¥ÆRÎ'S R‰‰¾œQ Ej0_c”ñÃQA·FË0Ø¢½qÚœRÆ&ø¡ˆj¥êˆ‘”@¬ ÃÓ̉Á‚8gbªcAÄ+üc–u!ÕÜ5j‘QãÝ?djHÏ;R¦‹ÃÝ AòÐÍ×hÏü0‡íJE\Ñ„&Ë’¢xª. *²0)Šu) ÔÛçr³hN:Dv šF¢qÉÊ3˜,ÉBªMߪÏzêz§üˆä€œóšÃúÿ"Çˤ]×4ˆ×\¨¤ÖËâícåò©¸-Çl§õìrµåä endstream endobj 21 0 obj 399 endobj 22 0 obj << /ProcSet [ /PDF /Text ] /ColorSpace << /Cs3 23 0 R >> /Font << /F9.1 24 0 R /F12.0 25 0 R /F11.0 26 0 R /F13.0 27 0 R /F10.0 28 0 R >> >> endobj 10 0 obj << /Length 29 0 R /Type /XObject /Subtype /Image /Width 284 /Height 238 /ColorSpace 30 0 R /Interpolate true /BitsPerComponent 8 /Filter /FlateDecode >> stream xÚí=Žã¸ÇWÀ€R¡CBÙ;BCiÃЬPy' p¢Œ©à¨Ã—p8±‚Í(zÀè œ-fž?d‰U¶È’,Ïôî1à¨-‹?–Ȫ?‹œß¹Œ”ßÿà2R¾ÿãÀåna6̆Ù,ÍæofÃvÃl˜ ³a6ٰ̆ÃvÃl˜ ³a6̆Ù0öoØn˜ ³áÂl˜ ³a6ìß°Ý0fÃl˜ fÃlØ¿a»a6̆Ù0fÃl¸°ÃvÃl˜ ³a6ٰ̆ÃvÃ…Ù0fÃl˜ ³aÿ†í†Ù0.̆Ù0fÃþ Û ³a6̆Ùpa6̆ý¶fÃl˜ ³a6̆ û7l7̆Ù0fÃlxg»a6\˜ ³a6ٰ̆ÃvÃl˜ ³áÂl˜ ³aÿ†í†Ùü»Ù„Ìæn ²©M3››’Tõ±˜ºÞE³hL}-UÄl@Ñ›úý»ˆÚ.¯l7VQ€MÃl¬R6ŠÙØlŒÍ¦`6V)ø-kÀ&b6vÙýfÃÍ6Qգѿ‰_L×o¢«åÈß#àœkÆro´Zs¬ùÛfÃl˜ ³a6ÿ,ÿ†í† ³ù4l¢¸ÉÒ! EÓ¼XGª>tÙ&¿#›ÕE3¬²ŽLq‘ÉòŽNt•‹I!lŠ4rÔŸÌ&É¥Tbxb!µ.óÕÄïX÷Š¡<“Ú÷á|t‰ïûëß&X¢<ê ¬—×ú*×Õ×2ë3*`ýA6aן•¸Ô_uׄ|k]ë¤ûº†Z‡-D·Ô›¦*¸Þšúü/U·umNÿ`^a³êûÓd¨Û)llM¬N9’VžhˆýšXŸˆÿ©®`ÕtX¿±ú·NQ=›0Ø õ‰Ê®êÃa ®×Ú?¬œYmþ&kiÇêMýQ»Éj«/>NuûyèlbÐvÕHwfE|]Sð™ì¦nw£Éa·Ò—HÆÙÀõ¨ª§d6-ø\›q|Çô 6ðž×ðšVìýãl*°%{Ô7Ô’yìFÎXÛk¬;TÿxUƒ–«ëàa6M½ãÄ„õ©Ä5ÞûpƒìˆRÀx^—¸ŽX`6_fó½Cp\3ç©¶ã8g¶JÚ-ac[TÏawT\˜Bsk;g®Åþͱí¡õrîàšÔ{âVÈÖPý+{÷³–òÇÙ$èþ‘™…‚ %UÕSy|V­úúÛ©¾WSuF¥)œUÒªRËv~6iZì>ÊÖûUS Ðd=õq&é7aû_c*åó‰{=&ŸG&êFãÒsqJ–úhGù¤ùûÖ!—ë\ª‘ ðo2¢ÏjfŒ5àó#o•„:‡Ë7Óßm<—ˆ¾>•ýî?çÆwãÈûSnäùŽÒúÉš¢5ÒíF5ŠšôŤWj쥂šÄÖîÃV?ÎÆíaŽ3šŽQŠÃ±_†âp·4V/ÀÆÐ´K9Sç™òyŸ^ƒ®‡?íj̵ÝöMdîù´vÏÉÒvÓÇb Ìpp(zNäî§ÀÔÎgð]ŸÌ´Ùõª¼XzÌœ„Ò”°OK9ÇZ8§¦žëëŸèû ñºž·;è9£;‘¬À{üBí–²¾hJ[¦äߤQ9‹ÔYiæ¦!_â}·žs¹îóïCŠ‘¦û®Ï‰5wÆìEǖíýŸO•®´£zîH=êkø®þÕù7‰‘ûúzµœFqÖeÊœ`7‘hâÔ³x˜ƒÍ{¹ÛZù‡$Îì†$Rï?&çk,]¦°9ë*§qVyT¢Õe0¨:1虯1·ªë ".oÿ5?$ÜuËÍÎq-ÅVeÑøû¼i%Çý°4—ª]J¿±tÒùƒC¾ÍŸÈ“Ð+ír X·~ípÿêW»s¥të7rýF×Ûíõ¨ÓϽÂú+v›-GÚà| åÖËÀÙ=÷ûqX3YD¿ºŠ·½±ó$<Ùõ±.‘»¡˜YPb›КîHvw-¡ß´%-¨®ëäεå‘W¦r¯¡·}miý¦$h·±¢ÆõçQ”(Á¸cìs‰=ü^ÓÍPÏ­CáÝÿlÒ‹þÇíVïgø7å‚À d•sbüÞâ³9nrb¡#ʳÖïYÓ4)jÜnà¹%/7qxKÈ“ÁÝésÚuvÄ1øi øŒ§ôõý¦FûßpþMNÈ“9àáã80í—eü,ÄñÆ>•qX-i•ÈÁfXºížY¢7¨­ ¾ýYØ}8#óbˆë9…}Îÿø a¨ÝSðà²ßßCô°~vwècÄëzxŒ4ÿfÞtÓÆÖ°ª8{s#µþ¶ ì@°ÍœÚb€Ÿ  «7ï#Niw$LÕ̎ãF);/&Ì£XªˆÍÿdex¶›îh•c+Èi«ˆ*>ƒ~óÏ,̆Ù0fÃl>þÿØn˜ ³a6̆Ù0öoØn¸0fÃl˜ ³ùlž[‚î÷å{—Я›?&Üqä§í?íßžòýZþæ¿ñß?þÐÔ(ð endstream endobj 29 0 obj 3088 endobj 30 0 obj [ /Indexed 3 0 R 255 <1f316d1f3476233a7f223a7f22397f243b7e263d7d273d7d273e7c253c7e243c7e253c7d293f7b283f7c3e516f3f526e3d516f2b417a2a407b29407b2d43792c42792e43792c427a2c417a2f4478314677324776304577374b73334875344975354a74364a74374c733b4e71394d723a4d723c4f703045783d50705a695f5b6a5e59685f5d6b5d5c6a5e5e6d5c5d6c5d747f4f606e5b626f5a6b77556875566a76566f7a536c79546d79536b785562705a637159657258667358647159677457737e50717d51747f50707b524b5c674f5f654c5d674d5e664e5f6645576b40536e41536d41546d42556d43566c44566c46586a46586b495a694a5b684859694b5c68424d73424e784f60655363635766605464625565615061645262645463625867605868605f657d75804f76814e7d864a7e874a79834d77824e7a844c7b854b7f88497e884a90973f979d3b92993e92993e949a3d969b3c969c3c999e3a999e3a9ea3379fa4369ba0399ca1389da238acaf2faeb12ebbbb27bdbd25bebe25bcbc26bebd25bbbc26b3b42bb4b52ab5b62ab6b729b1b22cb2b32cb2b42cb7b829b8b928b9ba27a3a735a0a536a1a535a4a734a5a933a7aa32a6a933a4a834a8ab31a9ac31aaad30abae30c0bf24c9c71fcfcc1bcbc91dcac81ecdca1ccdca1ccecb1bd2cf19d0cd1ad1ce1ad1ce19d6d217d5d117dcd713d9d515dbd614d8d416dad515dbd614ddd813ded912dfda11d3d018d4d118e3dd0fe4de0fe6df0ee0db11e2dc10e1dc10e7e00de6e00eeae30bebe40bede609eee709ece50aede60ae9e20ce9e20cefe808f1e907f3ea06f2e907f4eb06f5ec05f6ed04f7ee04f4ec06f6ee04f8ef03f9ef03f8ef04f0e808fbf201f9f003faf102fbf202fdf300fcf201fcf301fef400fff500fdf400c1c023c2c123c3c222c4c321c4c222c5c421c7c520c7c61f828b47838c47868f45848d46858e46808949818a48828b48888f448b92428991438c93428d94418e95408f96408c94428890449096401f37811f3782203781213980203881203880223980717483717584717482878991a3a2a6> ] endobj 32 0 obj << /Length 31 0 R /N 3 /Alternate /DeviceRGB /Filter /FlateDecode >> stream xÚ}’OHQÇ¿³%B¬e&RðN¶Wí`ŒÝõoʶ¬k¦²Î¾ÙÞÌn%Bˆ.AÖ1ºXÑI:†‚b]"è(‚—í73»îˆÚƒ7ï3¿ÿ¿ß{@](mšz€yÃÉþ(»;>Áê7P‡A+­Xf$‘v™lqdí}…䜛áãõÿ] ‚U€Æ¬ÇמöxÀáû¶iO:¬äÒb“¸M¤’1âWÄg³>žöq†[ ñ2ñMÅ'"()Y'æ±ld4ƒä—‰»2–’'&ßÀSg^™öÐ}8õ¹&›°€åwÀ¥Öš,Ô \V:k²Ý¤;©iÝR;;\‘Œu?ÊåÝV þ°ÿ¼\þûº\ÞC9¾u¥(J•IÒÀëÃ]ýÜàBS˜s_ QP5ûFz¼Úë׋Gõ%«t{3qW°D÷0vz ¼ü \}\ø$€Ôu¡ºmþÀÍ+˜…–ÍÙ¬C–;XØ9:Y„^g±BÞ,Ú\°ACioci]g®©Å·¸(ñL;òz±Úï9ÚAnŒŽÐIó ¨Üê­°4“I÷ÐÝ x#Ã{zwA¼¨j}ƒÎ…Ðþ¤Š¾Q¥óš=˜ò8Ðmèñá Ã(Äo{1±cÚÑd5¾Ué­ÊgÒ·t¶üÆlaȱi"ßÐ\.5æ±”šËÅâ^Å8tph0èk€!‰~D† TÒhd¡‘”»6‚ØÂì±–:>f¤ß&Ÿm×çŠäíxÝA4Ž…¶ƒLþ&ÿ–·ä%ù­ük±¥ªiÄ”¦¬?ûCqÌÕ¸m¥&/¾By#¤Õ‘%iþ 'ËW©¯:ÕXl©Errð'ñ=_—Ü—)Œi7Ò¬›©äê,úF|ÙNšٮͯ6×rm^™Ü ®ÍšUáHWü «Ãÿ5;¿?ÿͰh endstream endobj 31 0 obj 706 endobj 15 0 obj [ /ICCBased 32 0 R ] endobj 34 0 obj << /Length 33 0 R /N 3 /Alternate /DeviceRGB /Filter /FlateDecode >> stream xÚ}’OHQÇ¿³%B¬e&RðN¶Wí`ŒÝõoʶ¬k¦²Î¾ÙÞÌn%Bˆ.AÖ1ºXÑI:†‚b]"è(‚—í73»îˆÚƒ7ï3¿ÿ¿ß{@](mšz€yÃÉþ(»;>Áê7P‡A+­Xf$‘v™lqdí}…䜛áãõÿ] ‚U€Æ¬ÇמöxÀáû¶iO:¬äÒb“¸M¤’1âWÄg³>žöq†[ ñ2ñMÅ'"()Y'æ±ld4ƒä—‰»2–’'&ßÀSg^™öÐ}8õ¹&›°€åwÀ¥Öš,Ô \V:k²Ý¤;©iÝR;;\‘Œu?ÊåÝV þ°ÿ¼\þûº\ÞC9¾u¥(J•IÒÀëÃ]ýÜàBS˜s_ QP5ûFz¼Úë׋Gõ%«t{3qW°D÷0vz ¼ü \}\ø$€Ôu¡ºmþÀÍ+˜…–ÍÙ¬C–;XØ9:Y„^g±BÞ,Ú\°ACioci]g®©Å·¸(ñL;òz±Úï9ÚAnŒŽÐIó ¨Üê­°4“I÷ÐÝ x#Ã{zwA¼¨j}ƒÎ…Ðþ¤Š¾Q¥óš=˜ò8Ðmèñá Ã(Äo{1±cÚÑd5¾Ué­ÊgÒ·t¶üÆlaȱi"ßÐ\.5æ±”šËÅâ^Å8tph0èk€!‰~D† TÒhd¡‘”»6‚ØÂì±–:>f¤ß&Ÿm×çŠäíxÝA4Ž…¶ƒLþ&ÿ–·ä%ù­ük±¥ªiÄ”¦¬?ûCqÌÕ¸m¥&/¾By#¤Õ‘%iþ 'ËW©¯:ÕXl©Errð'ñ=_—Ü—)Œi7Ò¬›©äê,úF|ÙNšٮͯ6×rm^™Ü ®ÍšUáHWü «Ãÿ5;¿?ÿͰh endstream endobj 33 0 obj 706 endobj 3 0 obj [ /ICCBased 34 0 R ] endobj 36 0 obj << /Length 35 0 R /N 3 /Alternate /DeviceRGB /Filter /FlateDecode >> stream xÚ}’OHQÇ¿³%B¬e&RðN¶Wí`ŒÝõoʶ¬k¦²Î¾ÙÞÌn%Bˆ.AÖ1ºXÑI:†‚b]"è(‚—í73»îˆÚƒ7ï3¿ÿ¿ß{@](mšz€yÃÉþ(»;>Áê7P‡A+­Xf$‘v™lqdí}…䜛áãõÿ] ‚U€Æ¬ÇמöxÀáû¶iO:¬äÒb“¸M¤’1âWÄg³>žöq†[ ñ2ñMÅ'"()Y'æ±ld4ƒä—‰»2–’'&ßÀSg^™öÐ}8õ¹&›°€åwÀ¥Öš,Ô \V:k²Ý¤;©iÝR;;\‘Œu?ÊåÝV þ°ÿ¼\þûº\ÞC9¾u¥(J•IÒÀëÃ]ýÜàBS˜s_ QP5ûFz¼Úë׋Gõ%«t{3qW°D÷0vz ¼ü \}\ø$€Ôu¡ºmþÀÍ+˜…–ÍÙ¬C–;XØ9:Y„^g±BÞ,Ú\°ACioci]g®©Å·¸(ñL;òz±Úï9ÚAnŒŽÐIó ¨Üê­°4“I÷ÐÝ x#Ã{zwA¼¨j}ƒÎ…Ðþ¤Š¾Q¥óš=˜ò8Ðmèñá Ã(Äo{1±cÚÑd5¾Ué­ÊgÒ·t¶üÆlaȱi"ßÐ\.5æ±”šËÅâ^Å8tph0èk€!‰~D† TÒhd¡‘”»6‚ØÂì±–:>f¤ß&Ÿm×çŠäíxÝA4Ž…¶ƒLþ&ÿ–·ä%ù­ük±¥ªiÄ”¦¬?ûCqÌÕ¸m¥&/¾By#¤Õ‘%iþ 'ËW©¯:ÕXl©Errð'ñ=_—Ü—)Œi7Ò¬›©äê,úF|ÙNšٮͯ6×rm^™Ü ®ÍšUáHWü «Ãÿ5;¿?ÿͰh endstream endobj 35 0 obj 706 endobj 23 0 obj [ /ICCBased 36 0 R ] endobj 38 0 obj << /Length 37 0 R /Filter /FlateDecode >> stream xÚÅ\[o7~ׯ˜GØLt¿ì[7ÝÚl‹5°/ Çqìt}‹]g·ûëw43âŒÈ¡Ï{NŒHSII‘)q¾4¿6_¥»[)¥j\mòMT¡µ¶¹;kþÕ\7¯ßÜ«æô¾‘ý?÷§ÝÙj;ü½ûá|ëmcukc7ÇéUó·ãÆ ¿ÿ8¾j^¿U­lTsü©9j¾kŽoþ~Ü-ŸpF·Î “Úh» |£lãÚåÇá5ÏR‰ëë¥õX_ì»~œ­?ì_ì³Nb5½B°ù/hÿbaý÷G=* ?:Ò-¢8×H‘)Ò¼ÿnÛ‹‚ lG×&Ͱ½,6ñäõ'± ,6/[£÷3[±á¹ ¶ÿcÅú j¨­§H»Smb?¶‹Új¶Å³­½[_ìcíÝ¡ jÏXö/V¬¯R+W›xòú›q}éZ¥_îØø¤ò }ÌV¬ò6ƒÙ:ÞlÅ“NÛh¶Ûbÿ õìc3Š-„Öé—;6Þ›.ʽܱñ6e5¬86{©Álü`6â¹ÖÞ dn6»Ù^›Ø,HxãWÉm͸¾Ö]O R•ÚÄ’ÚÂ^ØB¬;í>Žl/‰MØÚÕx%TTK Vœx½DÍ€¶¶•ë%°áÉ5Òg„°'â;#sFQ3`UOÿèÐÀÀ÷=ÓOÌè–> ‚3Í2!ø‘ÐAô„X ‘ A#‚‚ƒÛn Œí÷z¹¨Q1â×mVc]kü üŸ ñ,: ÄÎ4Å.°iΕ3êæM¯›™ÉÄ‘pƒM&„3l2aÌð>aË(k`‚’Åf>Ï(¢²™S<Æ,é)6gõ^”/â‰e̘’¢X6t-È Q€·"4Q(.0èP})ÉöAx3²ìçSô¨ó£“š" (ËÍØÄðf‚šsëÐÌ+‹K9ǔާ.IÔËðf-ÕÜà‡¬ç‘ EÖØ :Y(‘…8—åÖ8[Ö¹Å_²f¬³—Š~¾" ñpñ¹òF2;õVŽòS¼a8ð¡HôYˆ׎÷ãSäμòsKœYH®1Á*Æv‚×£…œ?CZZ›¡Ïu~ò ¹® æºúÀ%"S«÷[~Kðï‚ê—»–'‰8/Ó ˜sƒ†Ä2ägœG˜2ä¡WòŒ§æ’äuœ˜Q’s;ßxw°ÓyÚN½ÚØd•’s¥í\ÿ$#úŸè".p–]Ǩ‰,8¤Y‡›¹2eåšf§£L:æj.Žû23­ŠÑÜÜmá“+9»å<&xW›'x&ƒØ—³³Øÿ|õúoM  GL´šÛS„ãŒ,M×ÐjFxyò“¢Ëæ©•eÌsб©y˘§/ôûGeF$ð¦~Á~ФâíþYS„ÕŠá`BjßcŠOóý̪36ànI½M2nuWXØ.æ¾b™z@q8J¤ÔŒHi6¦Æ¸sJt£L±ñ)1lOxñ&„0lXÁKFÚ!·7ÃfB 111BêôÛL %§Áö“ÀN±ý$0ûŸ‘LS²Ëö“Ý50¾uõÝvH.®G‡¹!u®*¾?rCz˜â·³²µqM5ðG®ˆzÍQ›ük(nâ‚ø=¥9k&‚¬-çàŠxÑÂÛ>pZ{±|à´­ÓŒí4­ºŸ{FÒKš~µ5,Ð}Ýu½ªO‰ÐŠÞNˆÿ*Fp}†¯Ô 9#¨É95éÑQ.ƲÒíQÝt‘câìÊ(Î[Ü×ç—ÈæLLL¶ŠtºøÊ¹þ讜«Àåü–¹Ú˜Ê8H{SÒ |’½SŒûõ€bÿ“%@±£_ž£¹(4žXAñz(l'Bs@W¨Î+SÚÜ“Ä;n*wÈ“é)ÃÄc|b6¤£)Bb%Ɇ¦œÐ1®ÌøÂ©¸TÖŽ%ˆ,¸B L FXð³çX*w7ÿ!Ô3½WEÞ ¡Å]Þ Ø!|â’ð$A°¡Ðì-±T퓊W>%±ØÆªˆ€â?!LAàŸH•Äp§EN·p(èjÎ “5Œ™LA—ú2)-[ªÑf~-ªàÊò$ÜlÓZ¢ÌMCÖKO‰ËכϘ *ùØÐ8i¹ŒG'ÃT9”‘Í­“x 0ùñw2lʯh-|Å,¢4 ¥¥+’EDÇ–eacÔ œõpž³Ò.êÖIí\1.Dïil-6üpJhaäb!Ûa3ØàëvÎI”,‹zgûÔjIê«%cH»®¼ÚºZ"e~¿ –rè½SX1Ka'»Ôl »}¶{\çºIb\óBˆØpqI y²’\ˆPºòšî-cþ¼gË,™H%˜b5øà+‚LêT}»·5Ýæò³¯õ2% Šüa<ÉBiªÏ¾‰IiÏ9ºÙl‚Ñ‘3<-¹¦…®È„ŠIÔƒ!2 =Ë1alžƒŸÿý'©—8FKáŠb@‰é ¤_Ÿ‘\§ì ³à%[äWޱyoØ8å—ùzHnIM$¦ÄÆ|%–¸ˆ†»ˆ ÕÑZAB÷äNœCµIrRM—]SDWäðÉUtˆŽÍ’¥â LIÈõ>\’;àÈ^õN÷Ã-æC)¶l9=%;¦Õ’Y•ß*ËúcHP®ñå‹PÒüw´ºÁ]¿t¨ÍAiWÒ„“ ¶ì!” ‘“~®ÙÈ ›Îe'3gÅb³Ä˜Pœ-;y6-RSf†-U9°4[õxæÌ>ôwYë£/kVT=p˜ˆ†M4§A[pÄ-2q*‚êÆÿ0ŠOlœ®IºS^:ÒË õ*r÷ddb*,"Ä—‡–½À&Á°öû#$U P†<2² #‘±:("¹Ó\…ÑÙêv»jX°ÕCÑy ãŠ6._±x}àÁî5 bÔ1ŠñF¼¨]z5Ž–Ô8Ê£ÔÍŸù›þÌꃴõ+ÿ±ù8ºVÇ—ëϱAµþ`=œñ@=œ5×ß¼­‹vùªôÅzѬµkDKjD³ö ]`â¹V^¢¥‘9·{±.4«|k×DV¨L`•)ù”w±â”\¿P£°•z×K„ƒ>ž61¶qO×(Öž3¥Ô'\¸Ïm~ÚK%ìBùäÛ½T2^µëÒUú@Îq7×Ɔ'€íܣ領A›Ui!œoõýu¨ï,³ý ý£ô/a²:åwr:é'Ft»¨"R~ì&s£\Ìyg<0ðËÙÝéÙí'—ÍÝçn„î/êeùÙ0A3N;Ë_ÿx¥›n¶JL¬ö³^B¿ƒˆ£i%|èñ6ÓfëZ|ê¿ZÐI:Æu¬ï@¶\rb:“bÚá¦* iA†›ù­[õðɧ=$£7Ö6Ù8ö``ëdm»`)v2°³YýB:SG­ý@Ú—M@ÀMðîAæ:<Ô¹D™J¦óSAÇ,ÙŠ+o%I¯3T¿nH§±ZîæZ:f©éšíAþ udjxàDú–¡Æük@•°ùѪž¬Î»†cU–žõ좛ÌYÏ®2Lÿ­… îÙµNscà)ÖœMŠëÙ•\ÇìTúÆ=»Ó{$lUS¯!]Ú±¸Îv†¸gסN”ÙQ’ë'»¾ÛúCÉõß*©\Á>_ÊH6·çæ/ru‹kó¦çdd!¯¨´‰ýk/ÙÿÅF“†b˜!ÀÛ+3A€dò®¬‹mwصÕÆÎx¥šVë¾ç˜Öåöûjà0­­¦¹!%æÇ"h™7Ö®FV“›Xõ³!ÃlÏfJƒI†ÍÊåÿUo½¯ÖKøïjÔ0§¯æô"túÈýNR}$¯æTÁØIœýœ¾G Sdé­é¤Îwæä²l»Ò²õ¶»03 fŒ3&u›?'Õq­ˆšè¦S¹ ­Óêþ26L™fSŸ¬ä§toA‹Ê1—óQÜÝ!‚IMg‰ù30¦ÿð—V9ET®W< Uûõ`uøa=Ç€Uç†jû@v£2ß?‹S¹^ÉÂÊñ0÷låE5nä\Ó ýÇJòËÔnyl&:ÆoóâjÔ8©Æ‡Jçr},=¬¯'^ŽZ«‡Œ3–ÝÿPv\Ú endstream endobj 37 0 obj 3345 endobj 39 0 obj << /Type /Page /Parent 5 0 R /Resources 40 0 R /Contents 38 0 R /MediaBox [ 0 0 595 842 ] >> endobj 40 0 obj << /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] /ColorSpace << /Cs1 3 0 R >> /Font << /F2.0 7 0 R /F1.0 9 0 R >> /XObject << /Im3 41 0 R /Im2 42 0 R /Fm5 43 0 R /Fm6 44 0 R /Fm7 45 0 R /Fm9 46 0 R /Fm12 47 0 R /Fm3 48 0 R /Fm13 49 0 R /Fm8 50 0 R /Fm4 51 0 R /Fm10 52 0 R /Fm11 53 0 R >> >> endobj 43 0 obj << /Length 54 0 R /Type /XObject /Subtype /Form /FormType 1 /BBox [ 0 0 1456 160 ] /Resources 55 0 R /Filter /FlateDecode >> stream xÚ­Ö±NÃ0àÝOq0µu}¶ï, Ø*Eb¦ P+•¼>Ihbì&ÔJ©Úä«ãÿz׬`ªy %dïÏp[X^ïÖûî3ûusv/í¡=q½«<‹î]ϰ0•²ê ,oÑJl.©_`v6‡únêîËRŠh® jIŽ#‰¤:H—D¿žAÂæ‰ú`ð`|Œt0šcU>n0ÞŠÖ¡M´j@gE ùH KÙ– Uz)ó"…u¤„t.KãTò~Šâ±æ·ùÄS„„M¹(B*L"ªdOÝ?T ‘þ{¥°²™JÉl‹ˆ{B`ØMOYÄ%Ú[ghzÊY„Íô”³ˆK§Œ£H´'•ÒSS?ºmPÚÒŸ²H´ì€T~BÊ"ÓùÆÛ4#¥ì±ÊOÐã™|¹ˆ$©0S/âô:VÚ›JL‘ÂéÚ½+S¼‹”0YÏ‹­)S½cÊÑ4#Εoãs]ªD1ÖäZ‚‘†,r3Æ‚WRùf^£M|y©øi£ÞßGåÓØ_¢£à¬r@=¶ªÈêFFC endstream endobj 54 0 obj 429 endobj 55 0 obj << /ProcSet [ /PDF /Text ] /ColorSpace << /Cs6 56 0 R >> /Font << /F15.0 57 0 R /F16.0 58 0 R /F18.0 59 0 R /F14.1 60 0 R /F17.0 61 0 R >> >> endobj 44 0 obj << /Length 62 0 R /Type /XObject /Subtype /Form /FormType 1 /BBox [ 0 0 448 128 ] /Resources 63 0 R /Filter /FlateDecode >> stream xڥн‚0à§8ê¢Ð[Jî$M|¢ƒdðõ- ‚Q i m ÷ë¹·FÌ=Bh×xœqÂé¾Q(ÿ‹¡)Ý)òÛ¸]Úƒe……‘‘ÿj$âL äÄa+¤G2 ¹{Áz±½â`ý]cJ䪅x’+9Hœ%¬“ð_ŠÞyzÉÕ»÷w˜eÁDo|ÄØš õÆ3ÄàBõ²š4òÎp+W®Œ³.ïƒÜ‚©g?† i{ ™–³"ˆM ¤x:"¤÷ endstream endobj 62 0 obj 206 endobj 63 0 obj << /ProcSet [ /PDF /Text ] /ColorSpace << /Cs7 64 0 R >> /Font << /F22.0 65 0 R /F21.0 66 0 R /F19.1 67 0 R /F20.0 68 0 R >> >> endobj 45 0 obj << /Length 69 0 R /Type /XObject /Subtype /Form /FormType 1 /BBox [ 0 0 1384 160 ] /Resources 70 0 R /Filter /FlateDecode >> stream xÚ­ÖÍNÃ0 à{žÂpËâ8?Í Ü&Uâœ&mÒØûK¤ÝÚ¤´  iê´µß<Ûµ·‡5ìAøR¥€Ïx€¬nlíg¶/—Í¡9q³…ëœaí»ÎÀ²!´RPoau'‰£¿¤~…ÅÙÔïp[·_–R˜¿:((¹¶&’' òëâé%”€þy4to¼Múdø£©|fÌÉ0½ñQ‡ (Û#O‹"…\¤„PvEˆéP.J©â̆ê\• ¤Eò÷•‡œûe}"DI!!)—Eˆ¢$"Jr¢lõ¢Qý½S´Ñ™Nɤ…Å3¡gŒtó«ÌâÁß„¶ Ê9Ä 3¿ÊY¤ImÁI$ʉUfn•Ùi” gU™%FvTD3ªÌ2“?0.ÍpÎ;‡­ó¤wœ³£Ý’G¢¡P&ß.ld «2ýÂÆ—ÙPin"–û"¥Œ”°XÏË-2Í;¥Ä}7èÞF¢Í´o‘bªÜ>K0œ´B“ÃÈßÛNpá$…ÍÆŽÞcêþç„è<ö}S>Oý#ŽH‚îª: ë/ñAÄ endstream endobj 69 0 obj 434 endobj 70 0 obj << /ProcSet [ /PDF /Text ] /ColorSpace << /Cs8 71 0 R >> /Font << /F27.0 72 0 R /F26.0 73 0 R /F25.0 74 0 R /F24.0 75 0 R /F23.1 76 0 R >> >> endobj 46 0 obj << /Length 77 0 R /Type /XObject /Subtype /Form /FormType 1 /BBox [ 0 0 1480 416 ] /Resources 78 0 R /Filter /FlateDecode >> stream xÚ—ËnÛ0E÷óÓ¦M¾D‘@ÛEvÄ@7ÝúJ€Ä‹þ~II!k$ql/dØÖÑåhæ^ñoðExKãiñé€ßñ¯·Gûc÷›Àã>üMv¯â!þq_vè-tßz‹WÚtBà)·‘á”Ý®^­q÷¿îº‹QggŠT›¦µÉoÄ@Âi<ëI$©PiÕ3´HŒŸ‹Œf`„£u¨Â¡gÈÄøÃÒ!t!D%È‹¢}AÉR8%Ú )êúi%¹Éh)袬Y«Èõ|Ê®‘··C#ßnAm´0øÃYOÓ].a¼@çNzV¯óÄ ¨h¥¦q(eqa±—Æj瓚XµqÉaX%)Æ×¯»îÀÁy%cÌF+£0Ž‹EFQ_ï›X_`Ì*R³*òjêf•¢X ©ÄU³J@¤6 R7«Ä;(oöò¬¥[ 27«Åyj=Ÿ3¤n$Aj+Ç3‰œ™„¾g¤QþåPŽ›fJœø„³…eQofDÁ¤QT‡Ì寗Ht BXÔZÅ\$C­WP…¾X„œ˜Å\¡Ú,¦“n1íÀ³‹‰lž_L„;ð c*Ýçä’>fJeŠËhN»–Æ“niââÊÞ9'ÈS¨[›GΈÍ&Üò‰‹‚3r3Úy~Ö>û¹Äëb9ù¡‚—›6¸q¦d)¬Ü´¾-Šâ„•›mHj=¬ÜŒ;²(kÖ󚳆Ätö{ø{<à‹W†.ÔqÇ6²Ò·,†“£ NÕvm¼ñ3鑘w,È &ƒÎÜ> /Font << /F28.1 80 0 R /F30.0 81 0 R /F31.0 82 0 R /F29.0 83 0 R /F32.0 84 0 R >> >> endobj 47 0 obj << /Length 85 0 R /Type /XObject /Subtype /Form /FormType 1 /BBox [ 0 0 1744 256 ] /Resources 86 0 R /Filter /FlateDecode >> stream xÚ­–AOã0…ïó+X"xlíöBµ{¯‰ · °­Äö€Ø_¿N§qÚ¸­Z)U›~y~ó<ãœã ÿ"«5J6ø÷Ÿp³ \n¶? Ü,ý}´ýx_]ª;—+|,¡0õ·þz¯œF£–+|ø­TNþ/å+Þ^dX¾á¯rû´KìQHælM@Ò¹hH'A«'$‘ûUÕ nŸ) §F·¢Ëƒ nþJÂz-®˜VÈ{ ¹ýÅ„J:G~¦@¤âb[Èóí€ý:÷(\D)´ݰ„Euöªaâjˆ¹Ì5j¤H?ÌGÂ;DiWuÁžï,M;w9ËS0¬ÜH~A‚ì¿‹ãÙKPbôhlR(ŽJ'e±JŽx›Dq"º™î¦AÂÄ8–»‰0|“ôIFXµž¯ƒ°Íõû@¸å=IŠE'ŶH‹ØKñ–D´NƒTþF¤d)”Â'F’ë¶QCù—âmá#µ<ÑZá'R'åhoS€9Ö\*.&K ]Õ1-Ä”ibœ9½H$•>C•¤稒|†*)¶ÇV)ÄèžÝbî¦Q†GÚ~z3ò¦ciülN³Es‚\Ì¢O(¤ßrp…Ä’ªîƒp1mQ¬¾ç,ôdZhØq5!aÒélT‹‘Û‰NV{1l >#S(VX’-fþƒwE endstream endobj 85 0 obj 535 endobj 86 0 obj << /ProcSet [ /PDF /Text ] /ColorSpace << /Cs10 87 0 R >> /Font << /F36.0 88 0 R /F33.1 89 0 R /F35.0 90 0 R /F34.0 91 0 R /F37.0 92 0 R >> >> endobj 48 0 obj << /Length 93 0 R /Type /XObject /Subtype /Form /FormType 1 /BBox [ 0 0 1848 248 ] /Resources 94 0 R /Filter /FlateDecode >> stream xÚ­–MoÛ0 †ïüìº5Šº¢¾uè¥Áv/b —œlÖ5@—CþúʉfK±[Aûñ+’/Å7|Ä7dþCVZäþûï'>áï["\ow2Ü®ý}´[Þ¶—öÎõ+>4àôþW½V¢›W¼û!lMþ‘æ^_TØüÁïÍîm <4˜Pˆ×ÊèˆäjH˜'A§'&G’rϬcü.ahÑ3¢}™d¨ÀðWk´ :¨ÓñR¶—Hˆädu£@”¡„¢lDé¥lJ œë(&}nnŠ Že÷C%!òU5 @Z¶ Åòì~î pXû1D*9'?0tPB1f2*³a Q"_³—ò^ÞC8«%Sjr&‹úzUÁG2̤©.Â(=âç)HìŶ)dÍX ¤í•#É.¡X1bƈjÌ%”XJbéY¸dˆ)JkBÍ=íÎYæ>6ò1 ‰rMBø<1; ¼IFôRxÉwÞQŠô&ÈlhSÑ,+¥*¢¯N¶7RÀ<—Q¬Ž('Ç…saN ÷9ÊŠ©Ê †y75Ó”Œgˆ¯dòñ•’!¾ÒÑ©ñMÆázLÛgàÈè0Ñg43ÉÙô­gI|ƒìbÙå"ûï ß§8C¿Ôþ íò/.çíJëÿ§$$SY¾ íNI˜7ác”„Ù#Þ(Å2 S“Õã'+\„R endstream endobj 93 0 obj 541 endobj 94 0 obj << /ProcSet [ /PDF /Text ] /ColorSpace << /Cs11 95 0 R >> /Font << /F41.0 96 0 R /F42.0 97 0 R /F40.0 98 0 R /F39.0 99 0 R /F38.1 100 0 R >> >> endobj 49 0 obj << /Length 101 0 R /Type /XObject /Subtype /Form /FormType 1 /BBox [ 0 0 1400 384 ] /Resources 102 0 R /Filter /FlateDecode >> stream xÚ•–MoÛ0 †ïü\÷Õbk*RŸ>l‡Û½ˆ]v ’ÖthsèßŸäØ–)q” áˆ_Ñ/%¿à¾ ð_RB t _7ø Ÿñay Æõ¡ûSàaíçQÞ‡!Ì\ïñ±…Ưúñ>\µÆa»Ç‡ŸJ.ȧ´[¼}w‡íüÑvwË(ðØâ„B¼ÐÖ$$µ= Ë$õ¤$2Èþwdè‘ñ6ËÐ=ÃÎ!+Ñ3ÌÈø[¥ƒe"ÄŽß·% $ÕPt“P¢”ç³M ±®_ª ×C5)E¹(w¦–›P×óí§¾M!Úy£e¶½™@ 7ÿbµwŠÎ ï#DÁ[ßWËUßW«e±¯´õéÊâ>F;\y‚fì çg°Â펛Q(i"aÒÈûo‡ÛÝåìA³²•w–ä1¢I7D!ƒ›c¶‘(÷66D°ë#5ÍV<‰¸Ë.®ÒH`ê¬Ý¯±¼Ï¤¥ÓÉRll¸ØØeˆõ%‹ÿ¼zȇYH²;Xí ×èØ“pq{8£Ä{8*±#äk Ä‘*B0|¶ÿ^»±HäŸð¤@¹¡¯ °¶ %6è÷*Šä¦¨å¦†bœ9îå³çÁ™‡¥U‰Jêlc„¶¹òT9÷ÄE¢$n u¶Q\„àðÙì›+€0•VèdVž5 -h¡8áÌžÿå÷‘ …Éfb>Õ@1t•ÈJÔÊKó¹2¨‰ 5çŽß Fê¼£ ï$ŽßAN$•åÀœ;9¤.æÍ<ªA'j Sóô+y=µ endstream endobj 101 0 obj 587 endobj 102 0 obj << /ProcSet [ /PDF /Text ] /ColorSpace << /Cs12 103 0 R >> /Font << /F45.0 104 0 R /F43.1 105 0 R /F46.0 106 0 R /F47.0 107 0 R /F44.0 108 0 R >> >> endobj 50 0 obj << /Length 109 0 R /Type /XObject /Subtype /Form /FormType 1 /BBox [ 0 0 944 160 ] /Resources 110 0 R /Filter /FlateDecode >> stream xÚ¥ÕÏOÂ0ð{ÿŠ'^0òÚ×¾¶/=x#4ñ žˆ4˜ÿ}ËhXÑ!”eY¶t맯ßîÇ f°L[0#¬ßà ¾`2Ý(‚Ŧ¹†°Y¤ÛTs:Þ¶w.–p!°hZؼ›œ¸„ɃñR¥.ñ†W7?à>6ƒu)"õn¥¥u\HAb– •vNç¹ÂùThIhà4Äõñr÷) *í‡ÅŠá ÿl†ÒѧvâdQ¢ØÕúyjÖÅn«±j¼3TAT@Ûä2t[¥h ‡ádep)r!¤ ƒ)RÒ3ªBŒëD°&r¾s‰F5ˆAî¬qØ?X|ÿ`-r'¢j2±Dýƒµ¬:)e•Ã¥sé9mû/³Ô‡ÎJkÅ;Xdr]…èpþ£"ÉÅG¿Nè!¤¹Mâ÷⹚>5fîÏçõ¬)Š<Å ÓÃÜfسÖ.…¡ endstream endobj 109 0 obj 359 endobj 110 0 obj << /ProcSet [ /PDF /Text ] /ColorSpace << /Cs13 111 0 R >> /Font << /F50.0 112 0 R /F51.0 113 0 R /F49.0 114 0 R /F48.1 115 0 R >> >> endobj 51 0 obj << /Length 116 0 R /Type /XObject /Subtype /Form /FormType 1 /BBox [ 0 0 1984 272 ] /Resources 117 0 R /Filter /FlateDecode >> stream xÚ­ÖKOÛ@àûüŠ¡\³³ÙÝC/ ¸Ð ’¥^8µj‹@¢©„à׳6!;ÄëxWjr°åÄ_æ±;ñÞàªô¦,j¯ñïüŽxv±!‹ëÍø¡ÂÍ:}ÆÓÓá0|sý€ç=D~¿šŽ§&ìû<»rº£tKÿWG'ØÿÁË~üµ‰ç=~RHwγL§¶–%ØÅ#%îbµ5ìÎxi1H™"òXB:íU0 Ê#)öH&%úIZ·«=2‡39;ï ÌU|R'9fåkâC±Pw-ˆaš¯v-buH^…_Z§Ê‘|[DÜIGgSËÓžxGÜ¡r¸ÛFó´Û0³z*<çã‡åÕƒ••bí‡JA±ÜµHPá](Ï‹ˆ(wr ö{v߆8$ò¤oI'º Ò©š3D­ëÇÆŒŸšŠ s£œ%f£ub“䮽.*¢à¤¢»¤ªm…XˆíÿÔD:ÔÖj6ir‡jõË“cDͺP¬ħ-›9ð[–Hnª57Íæº)k²!çO‹á)rP/díör:á˜Úìí^(°:n™¤­|äƒñÙgx=ÿþ÷k> /Font << /F56.0 119 0 R /F54.0 120 0 R /F52.1 121 0 R /F55.0 122 0 R /F53.0 123 0 R >> >> endobj 52 0 obj << /Length 124 0 R /Type /XObject /Subtype /Form /FormType 1 /BBox [ 0 0 976 160 ] /Resources 125 0 R /Filter /FlateDecode >> stream xÚ¥Õ?O1ð½ŸâL ômûöÏà"ÑÁÐĈL€Á¯oï¨ôÀC¨ $G¸»_Ÿ>åèf°_Þ@#`ó Oð “é –Ûöœ€í2^†íÇqsh®\®à.€7¬ýÖ+§´†°‚ÉYŽñ–ðëïpÚÁúïÎ JN1M–I‚,íNç)á|Ê$WBÃH›Óq÷a|£< ˆƒ<„ø¢Å£s€Ê$ÈsÁvY?ÎÍú éœÆˆ=ò¬Œ"Hw ¦¹Ý)’𰜤 Î"^úÓE´ÍH§˜QbT/"J:Q¾‰F%ˆ–¦¾XÝ$©-–¤¬/–”èE°¤"[_,9êE8çEŽq¾~,Ùú²ÍŒjÈ ìMòX„¨ÎãÓéäº1xùO…+ÒhNþ;ÅS> ^*v¼C,Š9æ¼üá~m8/M‘í¦èeÜÿTî:!³o7ª…û endstream endobj 124 0 obj 358 endobj 125 0 obj << /ProcSet [ /PDF /Text ] /ColorSpace << /Cs15 126 0 R >> /Font << /F60.0 127 0 R /F57.1 128 0 R /F59.0 129 0 R /F58.0 130 0 R >> >> endobj 53 0 obj << /Length 131 0 R /Type /XObject /Subtype /Form /FormType 1 /BBox [ 0 0 1544 152 ] /Resources 132 0 R /Filter /FlateDecode >> stream xÚ­–?OÃ0Å÷ûS+¨ëó¿ÄK l•,1S¨•J7>=n%Žk'P¥&j“_ÞÝ{>gkÜ#÷ÒJù/Ÿ¯øˆ;\ÞÈàæÐüÉñ°ñ×Qsº ær›-®XsúÕ²V¨¥A·Åå½!Fþ÷†³‹9ºw¼sÍÓÎ(°r8 `º2I0Þ’0M‚NOHò‰–!;Æ×$C· 4¾+Õ1>JtXèÐãy–‚@ÐÜA1R”^É®R›´”ù†>‡!ë€Ò›sA K‘Ê$ëºç‰ Ý‘Çz&ìTlC%JД?ÿ€¢«Q`ÓÍëŒ?×G ä–PŒ©D¾·£0ùííO•Uåz ##!¦Ô2ÓÛH¥C›ûátY©)*‚hžu¹c)aŒqˆ“ÊÄeŠÄ…¸ÎÊ"-–ÿC`ÅV1%LPœxO©½mGÊïØ-â^½Œ¾‡ÄVÇIª!¶Íõõ7¤·æ– endstream endobj 131 0 obj 425 endobj 132 0 obj << /ProcSet [ /PDF /Text ] /ColorSpace << /Cs16 133 0 R >> /Font << /F64.0 134 0 R /F61.1 135 0 R /F63.0 136 0 R /F62.0 137 0 R /F65.0 138 0 R >> >> endobj 41 0 obj << /Length 139 0 R /Type /XObject /Subtype /Image /Width 964 /Height 590 /ColorSpace 3 0 R /Interpolate true /BitsPerComponent 8 /Filter /FlateDecode >> stream xÚìwxUEþÆ ½…zo*U@ 6)Ѝ€€Ò{‡PBI 4C ½I•^‘.  5¡„@%¡…"ÖÝuÝu÷þ>Ï}æ9¿„Dˆá&yÿ¸Ï9çΙ3gÎÌû}§}Çå²°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°HEøÏþóË/¿üë_ÿr^üý÷ßcûí·ßnß¾m³ËÂÂÂÂc€xÿùÏþÏ Ž¡kÃÛÿøÇ?~þùç¿ÿýïüe3ÊÂÂÂ"yñÃ?ÄÄÄܸqãúõëQQQááá¡¡¡ü^ºtéÇDfÿ÷¿ÿ™Û¼²°°°ð<~ùå—Û·o£œacN%­ýõW®maaaa‘,ø÷¿ÿ KCÈñøã?þ}6»,,,,<‰ßÿýÚµkW®\ùÇ?þἎ„þç?ÿ u«¿ÚöuXXXX$#Qÿúë¯+äX]І«ao”6¿iõ‡XXXXXxááá—/_މ‰á×L±3½ÐüñÇ¿þõ/ÉiÁ昅………ç„–NVç3ZšßX#†blˆQmsÌÂÂÂÂ3øé§ŸÌñ¯¿þzëÖ-”3Dz¸HN«?Äæ˜…………çcÆ ‘ÐpõŋϞ=«™Ò±XýÊ•+6Ç,,,,<†èèè­[·Îš5«gÏž|ðÁðáÃwíÚuýúuÍV7ÔýÛo¿ÅšbaaaaáÀÃ:@EñŽzõª[·n™2eÊ–-Û¨Q£I“&…††ÊÅÇÿûß_ýÕæ˜…………gõÉ'Ÿx{{CÈuêÔ)\¸pÖ¬YK•*uæÌþBN‡Kÿûßÿì D ‹äÅõë×,XðÖ[oeÊ”éon,X°gÏžûöí3mµ´…………Çðã?¾ñÆY²d™8q"§GŽ©W¯ä‚œ†´cù2µ°°°°H.@È¿ýö¤9sæÐÐP-ryê©§ mNÿýïKEÿñÇÛ¶m‹‰‰1!?ýô§ÎI}žOù÷ߟ€ƒ‘_~ùE'yc+ä›fÎȦÀu÷7oÞ4ÇZjzÍ”Yn)–)g=¬FØõeãºgO!¸xñ¢IYG3™c.þ/8ï•×*”껚Ø&Xâ:EOq®zvÚÌZ"Àíænܸe=DäüÉ'Ÿ<÷Üs†â†ž?þþýûsÌ»h ‹2端¾š1cÆøñã;uê4vìØ¹sçNž<™ß!C†ŒŽ=ÝèÝ»wß¾}‰Ó××wРAƒîÚµk¯^½8Ô 8åb¿xà¸kæÌ™cÆŒáY¤œ+$¯K—.ñ…§É0nܸ€€€anpÀ)ãK'ñóv&L˜áœr1¾t¶iÓ¦mÛ¶;w& ‘Œ1‚„ñˆ… Λ7OO 9r$Ï≤™d'ynŸ>}¸Ø£GîUβ[·näyûöí ÌE“ÎîÝ»s±]»vüq¿ûÇ”)SˆÙÏÏ$é\°`#3;vìÈë“NŽykr)¾üŒï»Ç÷Ðøò9¾xȨÏ>ûlÚ´iÁÁÁ£F"‹HU|é‰/?yoÊ¿ä)óï¼ó‚$¾ç6kÖì½÷Þ#L£F4hP¿~ý×^{íÕW_ýàƒ¸—Äó>ýôÓI“&‘K” ñÑG!iøúM›6­Y³f‡*UªT @âÅ‹W¨P¡²pÊÅgŸ}¶Zµj%K–Ì•+WƌӥK—!CÔQš$ÊŠòc=–5kVu]ò)R¤T©R,{öì„I“|H›6mîܹsäÈ¡ÎUr†ŸD¼oúôé³eËÆkòF^^^¼¸··7™,Zûù矡2Œ4Öìâ‡2^¢b l‰>‘* (’ocàÌÑ„¿»‘Œé'ÿ±Œ¤™´ñ°•ÙJ£WùL\Äî$¯–Ö–ýað@ñÃ?8Å¿Ëí2ñ¡èûÒòØdÿ¾Zÿ¥”¤@¿7—/_Vò¨¶´.ÕF¦ŒáááaaaÇŽ;|øðþýû÷ìÙ³k×®;v,]ºôÒ¥K)ã€S.þâÁéÓ§—,YròäIªçòåËwïÞM`ž²hÑ¢¯¿þš8IäÙ³g¥±Ô#ï @&!{öíÛçí ?“ÿ.\€ÕÈ]µjÕ+¯¼-“E.÷ÄÁs¥[xÏrFõÄO6ôýÆ—Ÿñ}îøž›@>Ǿ¬LI#âKO|ù)¥Ê¼ï½”XS¹‹ãÆ&iÊB­'‘Äú¬Ü¥×A'#MS979F¡E1¡›ä’$+4 €2ƒ°×_O?ý4Jž4“’M0“Nσ EÄ%Š‚Z–Ë âÔõråʉ¾~úé'yΩ?"irDDÄñãǹ‚ £Îò²X7Þ£f´4‹V!DM²EÄ•\ßZÕŸÚt× Hû‚õvCøoɾ“|L‰J9  ;SÅ÷-V¬˜’•á›RI¡MH)ÛárX¨P!õ'˜bf¦K¥(˜â§š[¹re¬F|eûâS_ œ&‰¹!KBÂëþ‘/_¾Š+roݺu7nÜH â·ß~KÆq´ûM3Ú;00rZd+ˆùÓ£] S½zu>nçΧL™ràÀÝH8~xžæ3¢-ˆJBÌÚFõ–pÀ)Ž¿ÅZIW¯^=uêv¤yóæ’úõëÓPŠ/ûì³½{÷ž9s†'’±¾1þRä{PW´WÁhÔ9D¥M*¹Hbˆ3&&æÊ•+|¬_ïêÿ!ÍDrñâÅ­[·ò}Ñx´jI0YªôüÃøò3½»"¾|Ž/ž£G†×_¶lÙk¯½¦Âùá‡Æ—žøò“ãWã_ÊÀûí”$sŽ‘©j iüüü „N:É»ÁÈF^Ù9æ¥!03—U§„$‡I^ö€9›óTrõU¥J•Fñ}ä‘8¹ø‡|£6Q¾üòKˆ´L™2Û¶m#÷î7)L2S…ùÛo¿åsÔ¬Y3þüÒÕž€fôðaÔÒZ-*¤ÎRZ(xçΛ4i ŠJD!3õ¹E¼üB´éø÷ã?îÑ£G—.]8$™ Q¶ÁƒóÛ³gϾ}û¶nÝš2Iòh×÷îÝ{ĈüÅu*8’+íÛ·ïׯ߀ÚµkDZFOÚ¶m;$…¼êСŒM~ðÁi>|xJK§H›ÌìÕ«É 9rd2¦§{÷î~ntìØ‘ï«NŠbJË7„)”œ¦FôéÓGÃâþñ`ܸqcÇŽ%{¨J¦ºqª{¹Á§\úÄj•Ô„!rNÕõŠú%fÍ÷ÕX<Ç÷û¾AAAiµk¦OŸþîf‚­‰ŠŠš?þÛo¿­’ÏG‘ÑùÉ (eÉ’¹…Òà—`ŰÅX7L˜œ83G{ÝÆ²þ‰Ÿ2ã\<KAÊ»vízbÙ€øÒ)ëîÑ7 æ.’B À­_¿žäaßc%ã7”“rW[²N Ç-Fîþ÷>7µÇŽSs5::Ú9²ÉS¡ñâ{n|ù.\¸`†ª}}}•¦øÝõ¹÷’ŸE£:‡ŸÌ'ИNÆŒ!j§RÕ¶¡j2m/mÚ)Òùʤ‚áÔÕ‘‘‘ä^³fÍh%©ühæ­„ýÿ’ &£øÐb‰ÀûGÔAª‘ˆ†Ä” /ù"ä- †–~Ø—NSrô‚êýà hŒNÑ¢EÕ-¹aòBÝ ¼2/N>äÌ™3oÞ¼aaajô¥¨7‚W¯^]°`Á-Z¨ñ®^ÚVɸv’Œ¢‘Û¤‡ævíÚµ«U«–} ’N¸ºyóæ45Múúõë)°/Ož<… ¦Élú. ûíÇHBÈ.ߺu‹¼¢Ý]¡BÚ›T”–oTÚů¿þz¾|ùø²|î_~ùÅž{‡j½1‚:pn D¥vºË1WΜ94„ÑϤÐ2q6—НA«Q£F=t;·Š1œ6wùòåØ Zâ ¥¶êŠÖ€ÈîÝ»rB¯ŸvÒnq…“z¤ce¾„½íKá HÐZ$›Ó=0§e‰/÷«ï*툙’&»V¦L=×LD$Òâ>]1Mh"ÔÌO£ÇÑÇÌ’~Ï;'1£%PMæÃŸæsñH‹r×ĉ5w"÷ýÓü¼Çô« ©I¶@Æ97@ŸÀÙ?¿`Á‰ÕXùLj¹×ÄãÏ÷žžD´•x„4<ÍdN?Nò4hpôèQ5fõR2¾ÿM&˜âG2rçÎM µyßýÆc>ÊWƯ¶!±¡Ï‰ß†;öO¹Ú8S‚–ÏŸ?¯6È7ZµjÅ›vîÜ™—=}ú´“ZÒ… ’4…ÃSÔZHfÞ¼y¤üí·ß†LHF¡Wx{{§OŸ>e®Pƒyš4iB…“ç—fÊ”)[¶lNò¤'ïòRCÔM=JöôÄgžžþyó}Imâ¸K½=ÿqÜ&À3w…‘d¸422rôèÑÈÂÁƒs AJTjßÞ'\îųÒÒC† ÁøBÚ—?¢¦M›.Z´È´5È1i*õ¾^¾|YùÄ*^¼x† ÔB×»ÓJ‚ŸÕhº+¤âvEj¯X*KßèOר:a­pïðáÃiÁ :ôO_Ù ÓŽˆ/ ô ܯ‡âO¬»òºA–ò e¯„_ÜÇÅê»s¶M ~wà?÷ =QÛñ*éÞ½{5kQ6šÂ@†`²1Ö ôÉÄ—ñ=7¾|N໓6 jO˜0ASÈÔsž€–¾ëçSw“¦”üésU»•N’}×1¾²èE«+V¤)GP,PŠÓŸ¤>™sÇçûÊÏû…z0Ô‰!«ÁG|òÉ'_|ñÅ]»v©¾˜¦Š2$Y`,,•±Zµj>>>$Œ¼½ßxL'ü÷ß/&×r<ñùàää‡tO@³¢Ÿ_$¨ŸŸŸù !ª©’?þø#ÅLÂ@y‚m"W Ë%£Ö2Ýéä¿ÌeRŸéÝwß5ú™j /%€zªR”bK (“¼”¹™šºæîZ˜“PM ÿ¾È3“<§$Ž ),uX™n%±Ÿéö‘O•?âAZWzÉhr¤‚& 6LrNÏ%òÄ­ïæ^ÍcŸ5kÖÃÈÏ=zô ñk×®…Íx—úõëg̘±eË–N±ª&R6ˆri­â›¨ÏìŸKX:u¬S߯÷}ã‹ß˜ER5jÔ¨2eÊ 8P=« ¨hãJI|éŒ%râöÆ‚sCܶa:uzõꥆYªžO3¡×è@I/S)Œ–V©V¥PšMõ}AT&7YG=qâÄöíÛ«T©òÌ3ÏlذáäÉ“\ç;Ò™ˆ6{|ÏýÓ|Žû½”ŸHSšÀê—>vìX|áãËO›Z»ˆŠ„Gü•½qU´FOÐf´Á©/ùúëÈ‘#•+W6Ã"$@³)ŒQv>1Vùר}"ÆïÈ7M WÑ¥œ>|¸I“&_|ñ…PmiCñ. Lz÷NŸ>­ÂLyÃjÔ®]›†y"ô^DD„J5ô®/²uëV-·Ô†Ú¦+†œy¸ü,ÅÙá÷ý÷ß/^¼¸ü]ð}5dS«V-®DEE©Ì«¢µºº—/Nuþ#™`¦Ù˜ZC ’–¦djŒXû9ò5àØ g¯8¹­FJ2¦'›HÅÑS(š:®òÒÒ©e†P®¦ 8$ 4N§zÄ·6Zú”RõñÇ«C[,Ÿ–vÊY.õ*\‚ÜvC<°fNx°Æ€œlÓ¦<%‰Í¢§6-ëûƒ{óæMåùcšrdjµ´…ŃëÃAE˜Ö«ëŽ#ÐøÆû4CE¸Kå[ÆcÊDú$,Nç‹ÒjiOB^²5ŸGŠš/®¹ýrˬ]øâ¦›š0Ú«…"¤5¹)öídhÌæJɘÔûrŽšŒxë¬Ó-UjË·»úÙHà¹ã÷5£9‰n¶?ìZ:.l¿´……çqãÆ í²aè2IÄþ ±”@ÜiiHjÖÒN#ëœKo,µÌ:?4ù uñÓf£)V"jxTŽeŒÓÎdÔÒee·Å]IíýXS•R4Âéö‘,c¦Ë=µi鸞 LËÂ\1í´ßºÕÒZ°`V„EEEÅ·ðÐØ)ãZDrÌUF¢ƒüÞ?,só¬–Ž¥OL{G30d΋ÿüóÏL„ÃÕk2÷©‘‡pM¼LöœsãT3`×|=D 3EPq÷N=ÐëSÈå!JËX-}/{¢¥-­1AcnäÁ8V?˜V^ðõå(Òji ‹êšSKPÏŸ?ìØ±ñ 44tçÎ . ôucøðácÆŒéÙ³ç¬Y³öîÝ»oß¾¥K—úûûó—swXxXÖŒ§f-}ûöíXÅCZÚ4¬bm&‹ ¤ü)RDÞ}53$ejiíâ„Òp6$“ fæ'e‰ôªÄùØ·Ìž4çù}FíyÓ¥8i™^ò¾$!öC›z´ô­[·ø¸f!œÆÚ?Z›ðòûÈ÷óXX$»ÝqžbzN:µÿþ¿ÅƒÞ½{¿ÿþûUªTÉœ9s¬¿ .Ü Aƒ¦M›V«VÍüßs_¦©YK'®ËˆO¼»0 ‹ãÇçÈ‘#{öì>>>Y³fq-0àêÕ«+V¬Ð¤Y)S&ÃÛeÊ”™;wî¹sçž}öY]éÙ³'§ÚeLšÜuÇ'¿Ë½a £ÝŽLkZ­fÕ÷Xû£É«Qøf¯=­©Ñ—^hQ³ÚVÃåÞáëÈ‘#‘‘‘Úbš5)ê ÷^»vM‘s#­'µÌ蟎:=zó¥ÕãA«œL0_M;×[-mañ€`v‰5W8:t¨öY^·nÝÚµk.\ÈÁ‚ ÆGÝ„–¿ûî»5kÖ,^¼xåʕ۶mãt×®]põùóç!aø0 @´¸Eœ)r3uyâĉðùk¯½öÁT­ZµR¥J"X“ù×Çšîm§%>7¼öÜsϽõÖ[†ð1έ.ÌV,¤ðwÞ1L˽2zý“'O*˜Ù‡Å¬kذa‘"E”<¥3ECìÆ ³ZÚji ‹dÊ–ª—;wn~‹/îííݽ{÷|ùòÕ«WoÙ²e6lظq#lœ'Ož²eË6iÒ¤U«V£Gž{ölèîÈ‘#J@hhè¬Y³ÚµkŸ={6¤s@´ü{àÀ‚uêÔiĈ\C¢ó „i ]°~ýúQ£F¢´‰Ÿdûí·‹-Â@H‡Œ6B=hYdÈбåÃ$––&sÆŽkµ´ÕÒ†fþß¼y3{öìèguÀºÞÕ«WMG±Y¬]3¡ÎPÌÿÒK/A¤ê1ÚÙM ¥ûøøÀÞ‚àà`„w¹råx >}ú´Ë¦ËÑ­î­FçºNbX @x˜¿H­¡Í'N8'8q—$7,­]’1%IèË—/c¼d)t…_9oùòË/ *Ô»wo«¥­–¶°ð YD¦– R ‘¦o½õõ®W¯^±V–™ Sg‡Oì믿v9†x{{É´iÓ ;(] %À¡C‡J–,IÕv9ÆQ¿bà_|1K–,ÕªUC¾Ö¨Q#$$„H2fÌØ¹sgøëÂ… ­ZµJ›6mûöíK—.ÍS6nܘ+W.þýüóϵSêã?Þ­[·7ÞxŒ,÷òòjÓ¦ ‘7iÒ$_¾|aaaiÒ¤!XýúõsçÎ]°`Á;wÒ4м”Œn`,ôèçŸþÕW_ßÊ 16övÎæ}1 ¨}«¥­–¶°ð0$ÿ ØlÙ²ùùù5nÜØåÞÜSÂ2((m,å¼{÷îo¿ýVw!€¡ýï¾ûÞ60Äuýúõ“À†è¨ÑÒº£Fâ¯ÀÀ@g7¼yóˆù«¯¾ªP¡Ü‹‡{¿ùæ› &À±œÂóÐïŠ+0¯½öš~ضmÛ;ï¼£ÓvíÚé T©Rl©>Žk×® Ûó"ÄÃÓ‡ EçÏŸŸóäɳÿ~”9ä_±bEÝNjyJ£FòæÍ++½÷éÓÇji«¥-,}úäÉ“Zk†0Öæ¼Z®Y¸EīΠp€ %Ø[ËP¡ür ìM¥^ºt©œ«B“7à|Ô2q¼råJ˜V'ðÛo¿Í¸ÍŒî—®[·îâÅ‹“'Oæ/È;B2ræÌI  ò±cÇ`/¤´ öä“OJæi óÊ•+:uÒ_bxb %ÃøÖõõõÕpäÕ«W§ˆÞ½{—,YRNö°ÆqqRå[´hs†‡‡s UjÇj8)S¦Ö­[CªíÛ·ç–ºuëN:ûR¸páž={¾÷Þ{„ɘ1ãæÍ›öhoþjÙ²e‰%`ò¹sçU›6mHÝ»w‡9 *—/_žÖ‰yñÅ¡tÒ@ú¿üòKÞ·aÆÄÙ±cG«¥­–¶°xÐp.÷3½ÐÐWÿþýÏŸ?/müÅ_ÀZÈHªgXX˜fDk ô?þÈñ¥K—\wQݰ7D½víZ„®t51XÝÚP7t×£Gb“º¥óïøñã ,hz¿©þZ#³jÕ*N‡ ÂñôéÓÕyâííýÄOŒ1IÌ)*š0éÒ¥3B&÷ññ)UªTÚ´isçÎÍ(¤–§øùùñP~ ÿÍ7ßð Ç\ûŒ€9r É;wîìrwÈ¿ð 2dàÈ%O”+jâ ÒúСC<Ýji«¥-,< 3Fæïï²~ýz¢9â=~üxdd$!5¥ Ò Õ¼bx˜ÓM›6q »¢ZÀ²ÎÍ"ßÿ}ùºŒõt¤,×èrOaNÓ} (ÍîÛ·Ž…xÒ7oÞèèèáÇCÑ;vì£9²zõê2ZzæÌ™DÕªU+-H!žëׯgÍš•0Èi®Ô®]{À€eÊ”á8ƒp/;nÜ8® 4Èji«¥-,4Œ? §–Þ²eËþýûõêÒÓ¢ôó÷ß6Þ–#'½ˆIMrƒÄÉO?ý“a¬ÝÅÏ:t@NËI5W~ôÑGÕªU+\¸°I\b"ƒ×­[Ç)$ÌéîÝ»9þøã»wï®åêhfØ»B… $IĨ‡ÖªU‹c8þüð9W¦L™’1cFÌ O'6T}ß¾}  «7lØpÖ¬YË—/ǬL›6­y󿄹à†4ö­[·d†\w–·ˆ©È"Œ±Iù[-mµ´……‡µ4| 7;vŒÓƒBÚß}÷z* êknÀ`š¡ñ~óÍ7çÎ3Ë«µÖ[³>ÌÊng-îÖ­UÓ ‰\Ù¹sçØ±c±¬YÉ‚žG0ÃÆFKgË– =Œ†'Z‹Õ!p43Û¶m&LШ%jÍÌsɨ^††‡fÏž}Μ9VK[-mañ !ÚÑ„ £«—-[5:ttvD@¿Fè³q ÅAàrq©0ÈQ´+š\§Îx`<êõ{ï½wæÌn×)¢¶ä@·DDDpüôÓOCªÒÏšï©Î›7oëÖ­hZ`æ ”/_åŒ!€„¡Yž¥NŒ7ß|sÅŠšB P®:¨¡nu¤,Z´’áM‹-š+W.d6éA`c84‹OJžxâ Ži,ܼySìd–RºÜ=íòº,moµ´ÕÒC\/îP¿çÏŸ×uˆKí}g˜³gÏšez®;[æ™NCbÆ ‘Pµ›5k¦È1 O=õW Dè´{÷î.w¿t•*UÒ¦M«9ÌÒùLž<ë0räH’A®øøølܸ1cÆŒh]´4¼­9„Õ«Wç_yåÊ•D;`À€Õ«Ws¢æ|”Öro¬ W¾þúkŽ9íÙ ¢%«¥­–¶°ð@½s¹×¡À«Ê2QpË–-‘µš¤árÏšž;w®Ž¿ÿþ{dð©S§._¾,±ý®_¿ÞÔ\*²——‘¨[€ëâ(­%çªÔT D,ê·råÊ¢ý&Mš¯§U«V…ðüñ%K–`Nœ8ÁõãÇ?ù䓨V #‚“'O¢~yœF!Ÿ{î9¥!%Kè´nݺ0É!C|}} @8…i¥êK”(Á‹‡……iók½¸Ë=‘¨8%€ºÇ¡¹té’œéÉÊÈfA_*ç+Lg¹råÒ¥K§Ìyˆ6²´°xH¡Å&jÆ"b?þøcHR#ÐÚ„ ¾úê+±+¼ ‡ÿðÃ:…©`9nçºÍi]Æ Mu&0ôxìØ1ÂÀ–5jÔÈ”)SÙ²e!í ,X°€G,\¸°fÍš"ϼyób5ºtéR¸páŸÜà€S.Âçо¨ãåË—gÈæ'ÍPúŽ;bbbüýýaQÂ@ÝO<ñDÓ¦M·óˆ5kÖ,Xpß¾}.÷¼‘ñãÇs€öΓ'OŸ>}àätdddëÖ­‰ö™gžÁ‚@þ<:µii5‹øšücôÒK/Y-mañ ñóÏ?ΰ+l AÈTÉÛ·o;—ÚÉk($ Íj{;ñOtt´Ö¹èX5uêÔ»¡Ž\n¤¦‡Ï÷Äù?þ¨™É΋ɕcv¯«¥-,RP¹={öܳgú4`rãïІuá^X”‹°ºú-¹®ÍÖ Ì]ÚY‘¬¹Â_f2Ÿ#n'Mš4zôèÓÓòí·ßŽ9røðáZTŽêž9s¦þâ€S..[¶Œø9E0˻ݨQ£æÍ›§Í D¤ÄÓ£G‰'Κ5kíÚµ[¶l!ÙÓ¦MÓ°æÊ•+ç¶mÛ:DÂNœ81Ý%K–ˆmh8øúú.^¼xÆŒ©Ð¿´Œ¬ó yKkÅji )C—Ûg³fͲdÉ2hÐ ñ4«Îgt2DýÅ_¸îLóàʘ1c >Ý(*s¹—ãUªT‰Ê;~üxØÉôK fEÌ}ÿËQ¿Ù-Ëji«¥-,R-´ ÄùŒ;õ+ª4~ít`\ç¹Ü3îbbb¾ÿþ{ãII»úùùÉY¨QefA)~íÚ5.Ê+ˆó/íÛ.oN±6+7§ÒÞfø’[D¤ÎEŽš[(Q—»bÇ}k#øå[À:\¼xQ³÷ÒÙòèiie™¦ÝÃuE~n­–¶°x@0»¯½þæ›oÊ•¨á+‚!€¡_‰j3 V,Í]°ßéÓ§"³@D2|øp*µº¦ÍCÍV÷¨––›¦”Öú°ZÚji ‹d×NüæÎ{úôéF@ÊQžþ2ºT”Îé?ü€®†Q5h(9 ]Ã`¯¾úª1êÓ¾ëC5"©N³Læ¦ÆL˜©è¸„@2Œ{U]‘cR)m¾&lsQ+Ê¥95{И¨xqì×ÿtßðG[KÇjã| «¥-,Deâ[ê 'Nœ¨_¿¾z'6mÚ„„_EGGÏš5ËugfÜKóŸðHhH »sçN×Þi¨5C† iÒ¤ñóóƒýø×ÙS¡^ÿT?k²ö‚?ž'&/-X-mµ´…EŠj×çÊ•«wïÞòngpæÌ™XÃŽœJmÊiLL ­N‘ØK/½dH˜±R°ªãÜ"6Fyª£[æC$Ï#¸Åth˪žK z<©¢{Ïž=‹‰!Ý%zǦ˜½e•x.J®ó‹ÝÑž(mL‰º  €IB„ë¹RԤLjüÔ£¥õúäÚŒ)¿òÊ+VK[X<8ܼy4m|ôOdddóæÍµû•:“å0âÒ»ji(H^>Ô¥pîÜ9qÔ˜1cOv6–ï:f·q­ôó¯n˜ë<‚DÞ‹ ·ZÚji ‹GÚ®N“&Í;ï¼å¢T5Ó#$$„Ó 6H"BÚ3fÌ0S;\îN`)R]ñ÷÷×f¯N3«Ë±ü¢x¡ß?Õ¨¦óÄ n5[[6Ålù- %Z3v)n×αH%Ò$>®“XsKîz%5hir[Ýû9sæ´ZÚÂâji-EQÛŸcHxÈ!eʔٲe‹á[ÈYŒßˆˆ‚qj–1>ñÄ™3gž7ožB:}âý)+fžh‘#á믿6T ÖVK[-maa!øøø9rDÛJ¬ªúU/ÔMÅ$€VÛÑB°â䀀¬N:Î)y†iuáåc_¿®;½Óâ='·í†3…¦KÄÉÞz–“+Ä®fÁ#EæÃìVëÞ{¹˜ª´49@ªÁ¢]ÕäDÅji ‹±ÌFßL´[¸paË–-µ„¼xñbí'›ÀÚCuY¬]»V4ÈÁŒ36oÞlú̬éXëYâcQ4„€àoӦͲeËL µ)¹ÕÒVK[XXÀs–,Y,X ™‡ G9kRô•+WŽ=*Y%i uköèKsóF¥½ÁŽt¹ûxµ'—"!fãÄIuŸcÍôÐìèÝPòäÈšd¨‡Ä9íäüùóJ§ëN7udd$éùN“ažExì6ENHDÂfö/®ÝÄîeìò‘ÔÒšœC¶Ïä¶[{ßX-mañ€ E AYFânݺլŒ†ÖNž<)êñÆçÏåÞÌE+]wœu˜½Z Sm’x/ZZKQ4ÑŽí¡¡¡sýòåË_~ù%ºúÀ÷¢Ém-M‘}4cúF|”èèhÓÜà©WêAw†yóæM“& OäÃ97 °°°xpó:Ó†=xðàúõë©€ò‰Aeܾ};!/áv~×®]ËEM¢ƒV­ZåúÿËÖNœ8a6±œÒÆ3´/匈+B>(ù¸·ÈÿR¬dÃíÎ0¦·ä~×§']KCø°6”××^ÀD"aÏ1y¨—"«±¤š7.›k:ç ð§sQîq}⑞ÇÜji (jíܧÓE‹i|a|ñâE]¤y c؊ػw/\-B€NÏŸ?Ÿ›¹Ð~~~Hë;wR‘5ÎTð¾}ûfÏžª]¯^½9sæp/_>9ГҮ]»¶–À¤K—Žƒ 6.\XʹbÅŠÙ²e{þùç¹Þºukx˜Ä{ì±—_~Ù3¾>ÌkJ»òjAAAz©dá+³ðG6‹S¾&ÒØ&õ;=h-Í£ù”|,EÈ8æ²°°xÐØµkשS§ÂÃÃEPÔ>èÑLÏsjTQ±äÜßÝà˜‹aaaHè3gΈäQŦsCÍdöƒ>ضmʮ˔)T,ÃÕ{{{Sý V¡B…Í›7תUkÈ!üuàÀIÖ|øphh(ÿBÝjw_½zöƒº¹"ïyªÌ™3¯[·N{¬ ´T‘9èÝ»7õºmÛ¶GM›6-ÇD?gÉ’eÍš5M›6åʾ}û wéäÏ>û –æ^’”#GŽcÇŽýþûïr6¢}lW®\‰n,P ’û^6&I/SKóKÚ<¼‡8TL†“¨RÎT9-“ fM‰ôŒžç»øøøðM5,m«˜…ŃìªV^ýõ¾}ûÎ;Ð$‡ãÇ7oÞv¹ç`ÀÔ"qŸ»<èïïo\O÷ïßæoРfýÁäè^È_;žHvvêÔiΜ9ÔqD5† cÆŒ;vܲe‹v3$Ø;3-[¶-ZÔ¨QcúôéÄ^§NžÒ¥K‚•-[ªäFÌ„ö¢õóó3Œjºk-}W$]îZà/çT`#.\¸€I•ºv.&²ZÚÂâaÄïnˆ@¤¥‘dP"õnܸqªãÚýÊHª¿¤ß¤Ó >Úלž={VÝ ð'‘Ìœ9JqjižÒ§Oþ‚‡‰¿`Á‚s¥^½zèäñãÇgÈU,MØ®]»ªU«¶iÓ†0¿üòKµjÕòæÍ+‡H£GFf‹ í´iÓŠ-ª5:ßÌô Ía +ÆŒƒuð$_ñÊØ)r^Ù Èêððp®8 ¼ê™$i’4]ºt*Lù]Gu-,,’¶3D¼téÒmÛ¶Ý»w/ÕPW dhÖ9_Bƒ(äD$ÖµkW//¯R¥Ji\Rƒ•²„Ì—/_åÊ•À#GŽ„èz÷îT®]»öäÉ“»uëÆ„7äÂqçÎsæÌÉõàà`!,,LÓÿàp‘6I9pL„Z[¡u‘®{[S“¢´4y¥î}s…6K¯^½FŒ![f¼üéxóæÍóæÍ;zô(Ö*i×Ñ[-maáy@§òoïºã#**êÝwßMŸ>= ©‰gΜ‰ˆˆÐHÖåË—¯^½ª‹œÂgÜ€~p:•´CK?öØc„‡‡µOבX~~~оP¸paŽ·nÝŠêΕ+>õÔSUªTáÍ*UªT¬X1âA*—+WNúPKε¤BM{øC`úc(Ì|“uþþþ¼¯'ùÊIûØ>>$ôŋ͂wÝà³zFNóAiSð(Zv²´……´´ É>}úÀ„ò>§‹F§Iæ™Àò-«½Å94h$–?þXÝÂÜ“<ÿüó¾¾¾œöë×/sæÌÍš5ƒÉ+T¨0nܸž={fÈÁlhëããƒ,GBøá‡£FÊ”)“I nܸèèh3¡Î4«Í‘YŒLõÔÊDõŠèâŒ3à 5î’ለ˜dÒ¤IÚ¦ö;§iÓ¦­]»¶˜|ëÖ­Ù²eË;·¸¨ÿþPšìÝ»ÒÖv!O?ýô† ø÷7Þp¹wõª_¿>|¥±K“·h¾´Ò˜Å 4¨B… ÄùØcñEÒ§OÏ1Ø,=‹\®aãºuëfîMÂáT«¥-,<¨"•Z£BŒŸ|ò ¢줗°°0(‘êõÕt‚~ø»à8PýÏš]@uo˜îPšÞf:˜Û÷zôèìÙ³ÉüêÕ«óÜ2eÊòÕøÐ=z >|èСK—.…ºÑï½Ó8™ר™oËê‘™3gv¹çXªs‰O¯Ž2Œ±Qr<ãWÄÂ"5@µìÌ™3°e‹-\îÝO¨§Îå{0WœBQS !.~E¤Û¶mƒlEb6lPÍMØÅ(ŒMu5hЀäÏŸênܸñ¼yóŒO{"‰ÕâyÈK'4èÌIéÆÝk.ñˆŒŒœ1cü š…õPõùM´ãP­I¹~ýºº¶œ&"j3è€/Q¢„DQѱÇ\ùäý¦áïÿ;†`ÇŽKÜà€S3.™r  ¹ ";iD(‹<Ùö—BÞ¹s'-r[‹ôÕl1ޝí$0Ö‹¨ …ʪ)‚œšö‘1Xr²-ë ŸŸýСC¦¯ƒzlÎF\h£é:–sIMæããCŒ1Âug·)ϤÊ9¡%ÑöÚÙ¡¤Øä‚5{SªÏ‡Ïííí­>(ùÚÒbÏ,Õ·H=øßhÒBêyqçøµ’VCTTrZ¾‹Oœ8 7n\``àСC;vìHó¶ÿþ°®ná€S.Ž;vüøñ„9rä¾}ûôï®]»‘$8 ~Ñ ÍIù& ‰,T/ëÕ«WÔî𘖖¯oÓA$*Ú/ÒÙ÷‚‘5ˉ |#¤õ^ÔÓML?ì­^íà`–’34ÐŒçn>I¢U7ƒƒƒ¿þúkj\:u4¿+cÆŒ¦—ãé§Ÿ^¸p!5±B… ÅŠCYÉ·¿———fðnذæ?pà@HHˆbNx¢ÿ"¡MuF-‡‡‡#‰„c'oËËSrå)tnY.s_ÁK‘‘‘¼;™@CÀuÇËk>𬨴i–Ñ×××ÏÏïÓO?íÚµkïÞ½?þøãV­Za+ù^eö6ëÖ¢E‹víÚAõä¿fæHKëëhÊe¾|ù´‘¥e`‹$„–Ë©oM-Du3¢$MÙV'he„{reÿhäƒö—Ã:ù‹v®)V^ø‹|ˆÕrçTƒø ìË{„ÇL&˜ƒÅ‹—+WΓZšìÕp¡ Ù²eËhÑ|öÙgìܹó€ ðáÇ÷êÕËßß?q6ˆ:B{A>X8F“9m¥Ý»wÃÛÒÆJ)QVT«V-wîÜZÓ$§]fºP4Ìj7C´°H*PõÄ9šnár;‘¦–ÁÆÚD¾ïbñ’\FJ'Ì‘#GbÅœp§å}­,NÞeÈp‘¦Ch¯#˜ÉŸ’%KÒö×çæ¼døo¼¡†ŒV Ò~Ñ(€.V®\yÒ¤Ie‡G>ßСCi.åÏŸ¿D‰yóæ}ú4nܸG]»v={¶¯¯/Œ€?x𠞘 y]±b…Tú¢E‹6nܨ1ˆÀÀ@óD+² æ¯jÕªuìØ±_¿~2dÈÒ¥K-[$ $ÿäœS ÙIégÂüó´XOý´@×ôßï@r:î™±{hG›ÆÄÄ\½zõ²Ú.œ‹fLŸuS“E‰½Ò¬uôÛ-7Ôm‹äS(0Я<…:R=¬¥ùpäϦM›*W®,åœ={ö‰'>|äÈ‘np¼páÂD´GÔk¡™“p~¾|ù0 ={ölÛ¶-¯\´hÑ%K–˜cÚ•¯¼ò ê½N:$ Aƒ£GîÔ©Ó¬Y³NŸ>mf‰ædóµ°xÄ`œcHDi8ÕéfÿæÍ›pµsú"5÷?nh_T£¾4‰ËðpýEÚ‘g ]g:9o¸Az´yAJÐÒ²qjnÌ›7eÛ·o_˜ªsçÎN?¬$œ? éAÈ0axx¸­± èèèK—.™VÏŸNM ¾T›6müñùóçëÊÉ“'5ÅNÝ â[íS,†NçNÚý!ÚV‹TE\L Tk‚‚ä´|G'GyF/i­$i*>œ:sCÞ©«?qþöaM5f?©¨¥çÎûî»ï6iÒ¤eË–/¾ø¢q걫c<22R{¾çÈ‘cΜ9Z«)LêáS&ΜÉò?O!æ²eËN™2E¡ÑÕ7Ö¥ÓFLùP @~in¼úê«~~~Pé’ó;gÏÂ"©x@Ò×ÙM-sl@S4{Žß•{5!ÄtYÿé¾WͤF_wCsÍÜ3mò.{á]²0áªU« #$îc=V¤H‘·ß~[d5yòd±e®‘D±s•*Uœ}J:–3UòJ›;Û‰ÐÒܸ|ùr„´±¿ÇŽƒ~1ÆòŠù±¤~ø¡··w»víX›>ð¾vºÅ_ áâÅ‹Ú×ÏI0µéôéÓN÷έô`¤¯¿þzóæÍžÙ”Ù3Ð^*š_¡ÚGæPÁáUµöÆJà•aª˜˜ÉlBþÅ{q¯sÇ”Ò9sú"¯BCCûöí«¥ñK3ià¹çΛ8q"Ö¶4:ßó57\î5€÷¿³‹fÆ #FŒ0ÛÚn2cÆŒrÓ¡,Eºté .<{ölJ YAÁ€Ø%5Û[XX$•–6Æ »aÚÎêvê%ÂÄš×§I}T^gß²îMØWÑ"žl3O‰{ Æ%yýEðtãOã~øða³&¨V­Zùóç‡Üœsö’»wïF±gÊ”Éì¤àrwË]¡æfÇšQy¿Àñŵ´üÔ©SìÞ½»Màš°Ú©S§lz¹ŽÒ3f ÕçÅ_Dp±S§NiÒ¤iÒ¤‰Ë½{5%íÚµ”Æ™3gJo«°Qé¸Hë’vå¨Q£øK;ŸÊZåêÕ«š– Q-?{ˆmµ ¹H1öÀÞÖž™Þ&äw„ ÚêÑ“óR(uèÛ;wV¬XQ›E–*U*88®FÛ#kýýýal³“û}AbØ,ôÞ¸qc½zõ2eÊD ´C‡ÇŽ3&I«t­–¶°°°ZÚ dÉ’f­_±bÅòçϯÏ2dÈ>}ú²eËĄ̂…_~ù%®CÂ{áçãÇ?ûì³pþSO=µfͧ<Ž5h>vìXR²oß>ãL@)îƒf‘¼ç4e«PÒ´e¡éXÃÖ‡„„tîÜ9mڴ΢›Å ¬?"™r®‹hƒ:uêPòÏœ9C ~~~ÚÚµkSéž{î9jßÏ?ÿ¬±êà3Ï}áòEc?Ó#çzµîýýýµc¯Ç´´™övèÐ!¸ºK—.”í^½z 0`ôèÑÝ»wç uëÖüR’71†!…œ{·mÛV³fÍ&MšÄz;çZB«¥-,,¬–vv¹ LÌ90ëk\n÷fö]"üœ@°¨h9ÁëÖ­[çÎÑí;vD±³vç1]( äöíÛµ0Êhië_Ú".ÏT§ÿ­–EöÐj;zô¨)®ZH+E4eÊÍØ¿|ù2*TP áØ±cóäÉÓ´iÓ·ß~›wýúuäúôéÓ%™4ß"Z¥J•Ù³gs¼eËdy:u8þðà £ë€ø9µßè‘Êt$.¢´øùùyÞ¿4„Ia¾ëX³a%ÇQQQ‰è—æ^*lýbkôvTŠ &´k×®C‡k×®U[Uã†VK[XXX-«Ëz}zÕªU5ËbðàÁ—.]Ú»wï“O>ÉÅFWoM›6}íµ×(~ÚÜðÓO?%@Á‚ÕÜCD»Ñ¬Y34öèÑ£¹…jˆxΕ+WÞ¼y *¤í„ŒÆ6 ûðà f?Ð#Ihùt¹çBôïßßÃZúúõë$K“ †óQBCC›5kF€ž={nÛ¶MÃ|zùÑ¥Œ=õÔSèp>Ê–-[–+W.‚M:5S¦LãÆã͘1ƒ–,ÅrذaÜ‹ü&Xž=[¶l™3g¦  ŠÑÕ*lÅÝÈ;·ôµ@ÅUÜ©S'㎌F.1èYíÛ·GÃTsÃŒïDEE}ú駤áðáÃ’ú˜¸í/ «¥ïù$sæÌÏ?ÿ<iÇŽšp¸gÏþÕ~8sæLÉ’%9FM™vTÁräÈÁ_ê‚VÓFÖÞ9ÜÉÔ5ºK‹ßoݺ%ïUvš{e#”üêÕ«“ó4v7nÌ72}ûQQQ*¥|&2Ü”r1lʘëÎ\k§J7ÿ¿sÁ8#Rùرc΢è€h×®fêÔ©.÷îáeÊ”y饗®_¿Î?¸a—eY-ý×!ª‘kkÚ€W®ÀÒY³fáÐv£àÑÌ7Ã%Ô6Qª!m¬Æ©S§~wà ‹+§5j<|øp'Ÿ' :$‹°k×.NK•*•={vÍPýæ›o²eˆ¸Õf…h’$ìMMÆ9r,\¥JseàÀ\éÖ­ÛùóçsåÊÕ£G-–\¿~}þüù›7oîrOÐ 7n\÷îÝåð¨_ˆìš6mZÅŠû÷ï?`ÀÓƒ¥[²dIÇŽ1»£FâÆµk×JŠ£¥y/»Çô½@[ªœ”/_ÞËË ÕJá¤ab&;‘“j³˜[œeFFßhŽÉΡžgÊF,íDH>½3°¾ IºvíÚ¹sçÌÄOCIëh¦Õ¯_?_¾|6l Œ¹‘[4O›‹šedaµtâ€!Ïs -§ÚHÄ;wrLQ4=”mrƒ| aKJþº¯' ‹ õÅ9ÒXó$Œ¨NÚí?»téÒàààZµjåÉ“§L™2ê×|Ô‡]Kÿæ Ýkü>!wyñ‰'’ž4iÒ,\¸PkI׋/þÝwß5jÔˆã>úèé§ŸÆT)RDjœ[ø.œbPLNR~HôÕêի׸qcî*X°àСC±w³õƒ-Û µkøj5jÔzùì³ÏLEpª\s7cÉsí.Á_ÃΑâ|kyÆN­Kጭº¾ÕHxD8ZbñâÅ9ú=z4×5i„f©f™íx„ÕÒ‰€)B”7xr~î¹çŽ9¢12ŠÙ¼yó¸(gþH<ãP࣢¢’Ü0YXXX$-¤"üýý ‰%¡¦]±b…æ #ö$^~ùålÙ²•+W.oÞ¼›6mRȤÝÈ;û¥y®T­ƒ¿»Á+“û÷ïß¶mÇçÏŸ7“ äcjذar±{÷î7ß|x&ÀñãÇK–,ùÌ3ÏhBlÑ¢E Icä›o¾á€–² MõÆo™ýúõãÑ\‰ë?Ä"¾¶´.eC+Òä!k®°ð5Ú㎦•ÑwN¼¹víÚÅ‹åØœÈ¹…ùLÄùÓO?™u¦g§´¡h)û¬ÜÉ!鉉‰)Y²¤——ט1c–.]JžL«$þüÜrôèQ#*Tà1| $ ZýòåË;wæ¸{÷î’Üò Ê–-;kÖ,£'u„ûK>, [Ô ÇG×ÀuëÖU¬X1_¾|”Õ .˜Þ{»%„Å£­¥µªÂðÿ™3g¶oß.·¨ðÕš5kræÌi¸Z;yåÉ“G“=@}úºuëxbéÒ¥ù²¯¼òЧZ/yNÿÏ*óZ æÌ™£bðÃ?P$(3Ö^[<ÚZú®s{öìíÛ·É@Ó±-Ó^áêÊW¿49Ì÷ÒS.]º„&”§n„ô”)SŒ7BžÈ;šÄðe öÔSOÉ7l*Ü[Üù‰·nݪ™äÚÙx÷"Çdx’ÏÛ·°HiZ:.äg‰@,ZoøØcùûûË™$d’7o^M™5yP_=x¢¦¨%<ÿJÚ[•=>ÏŸªÚr× š^…¨¨(ç1/Ë'pNt¨¹.'šM±-n•¥“'O’i¤üâÅ‹ˆäŠ3 6ˆ/Χä@– ’Ê4ÖߘEg¯áo»aYÂYÔ%–(¢|gæðÑ5®M 'Lîb‘0Èp¾…ZöNrÞ>}ú´\v¼óÎ;¡¡¡0ßúܹs[¶lÑf‹%K–T×4¥‚ëIût‘D!ùúÉ'ŸðDSðD ÚôùQý¾²Aˆm-Q\±b…lо59sáÂѯ™~sW3AvÙ«†ŠTe‹ùËiÈRñD¨[ å¼hV› 6&6}8A_tCüo GŽ¹ë·“Ws¨›"§) æ/žXªT)²bÚ´i©¼â“Éä0´lr³hjG¬OÌ_äj*Ñð˜ht6÷ø"3fÌÐJmii¾8"1uêÔüùóóh___Їj=õèðáÃÈé äÎ{óæÍ)MK;]^chDb{÷î…ñüüü‚ƒƒÃÂÂäg^”hŠúºuëªT©"b §¨ëq’åÎ b€V¼råJJ^Ê-Êå5ÈÃwß}wذa“'Ov¹÷Ò5jÔüùóÇ7qâÄ™3gbúÉ¢ñãÇŸ={Úœ={6`ñâÅcÇŽ}¸‚'ÿ)„ â:74h̘1&L !òmÛ¶ç”)S ؾ}û9¥hîܹwhÕªU|þåÞÞ½{'åü³Ï>sîýÊ·#ñBÕ>Y’Ó–%œÌ¬IY?¸¡ò7‹œ^.-v-=|øðŒ3¦OŸþË/¿T§~©,T(m†èïïov—{@ZZÓ³å/UiiMáMwïÞ-?!õêÕ3›å©¨F–£iÃ×Ñ®.°P(Ç-Z´0®W0©/½ôvªyóæÚz[½XiÓ¦•㬪U«ò飢¢*T¨ WÈølÙ²åË—O^J¨æ°%÷z{{sª¿ä7à¹çžCr8p€»´#$¿\Wiá§NB*ëAeÊ”)R¤ÅŠ#<Í%ÓÝaŠ“éî  ÀùØÍJ•*ÉÇ ÕÒ’ ^^^|²1S¦LÒQƃ6ñúõëv¿òGUK‹ùEQ›jÕª¥GÓ 5³©QDXŠ9rh™sŠÒÒNe+Ÿ<°ß|={öÌ™3künåÊ•f5Ф2¼‡4[Ó*~nç•Í4ýôÓÆ‹*Tˆ§óuNœ8ñ7Èd¾5)‡«Lžj=P%lÙÍŠªX½\§]œä›ßY$£–~çwÐÒ0sÜFõ¥fÍšÔß–-[Š”’°í©Q<ãR˜cšo:tHmZšÕà`ÇŽåË—G|6mÚÔ¹RkBe#®]»fÌ„É(+ë`àjÕª=óÌ3]ºt™4išö»ï¾Cô¢`[·n½fÍš%K–p0}útHUËÿ×®];uêÔÏ>ûlãÆ[·n]·nÝ矾aÃÅüÅ_ ¹¹¥ÿþÜB`õT¨®vcÙ²e4¾ùæbX°`¶€‡@°æü5þüU«V-_¾£©o8†xIŸUlŒ5ÔÁâÅ‹Ñöhu5ßÝô>Y-­F $€¢Æ,'ðš #PlTBœƒ³Œ–vÝ”9r$Ï ÐEÄ îP`$DÚ)JKÇššÅ½ˆFšêh¼°°° ÙF­>®¸îÌ k×®ÁPÔêÈ5r:::Zœc[àvø'Åzé'Ùò¢ß¾}{ÕÜ®]»®_¿(9L hذaºè™mﬖö°–ÖÆ¬ÔP-¯ %«sƒJD1ÐømÛØ/-éevz¥eM Qƒžd)­ƒ\¹rQì–ràLSÝHl<ÿË¥Û¶m92C† •*UrvºÒŠO±>‘¾%K–„ZѽꟄÇŽ«Jͧ$z÷î Oª«¬¦šËŠù1—fi6-ˆW~]`uLg³f;ûî;J‹¦h"§M—8­ Ã!¸A>ŸF€’CÓ<@RÂ_˜Ž‘| ™õ‡¤ZW®ñá‹/¾Ð@°ÑÒN!mðæ›o¦ÂµQª–†šh=yyy!½¨zTR‘ÏáÇ›4i¢ MfTd÷¤z®¶ÌÖ³ôKõïÞ½{jÓÒbQ¹zÓÔª^Z·n}áÂõ?“]ä?$‰¼äW"±ÊGùöÛo1IÏ>û,!95ÕÔŒ,²Z ”œDzÂX×I€v?ÇÒ!¹*ƒŸ• (Zœ¢ávTº1ô*«2š¤Á9ê7{öì‘#G¶hÑ¢X±b™3g&µDHÛ8$0OÃhb¤sv¥ÕÒ2Xñ­¨"ÌüùóÍ{Ëœ¤–¦‚S³4N!9ÂPLSÉ;ï¼Ó‡NÛ±žj)wãÆ“_)˜FŒð D-Ê4Ñô1gÎývxàöíÛßxã è«7Ç“Ü0zôèÕ¨äf~âì¢ÎãÇwà uÆï¢>5kÖ4DžÁ¯F%Œheâ_nÑ"…tMR…~¿9åÙgŸ5‡'ÁÝß/_¾<#›æŒ!ö"Æ…‘*Ìqs˜6}•½òé§Ÿz6ÿˆ³îâu9޵Væü#Üæ»ï¾ uR´{÷î‚9p\P7­óÁÏÔ^# „ñHNls_wÝuÍ›7Ю½öÚË/¿<~¨ýù•W^Y±bÅ)§œÒ¯_¿ˆÑWi8Z”`ˆ@ƒsòj®›ü×ô"@§ÍÔð믿zÚ˜Õz€^°qãFgÔ¦M›ì¾‚–O<ñ_ÿ·lá_U{ï¿f‹=ÌEt(úS>Àý[¶l‰ýM~µ`Á‚°Añ_Þègf ×§OŸtn¯Zµ áD Ù GO»;Õ©¿€<ê­·Þ*Y²¤Þ8¼Éb Öjp9Ch:ÙŠ{î4Î6{öìôÀ&*ÏÃ? 3 Å‘ ¯×BÁwŒsiÑŸ³ÖL«„¨u!›S›…/¹rdYîÅÏ G!—þ»å›o¾A{½øâ‹áŸ¬G×øÌ|€÷JA[·nýí·ßz?#DÇþôÓO Ÿ= ʱœù/£©¢´xñbžc•À£§¿þúkfˆv nþøãAoEö[Õ«W3¯@ZÍã@ºSE‹Dÿþýyò%—\B+¨°Á«‘¡TŸ¬_¿yáWþ'1™¡–ˆ768^Ñ¢E q`hÙ>ø ¸\³ÚCž&8L¼BüI-ìR–›6Ò#Þ±¹îJ8”O>ù$4Ò 9Ó¦MS'寇 Ï9çVV¹råÔ³n»í¶]»v€ÙeÞ£GÞ¹k"ž¤ aˆCÜŒ;¶aÆ<ðÀÚµk=xÞ¥KžÙ¤IÁ¢E‹ Öz}¼öÚk`]ƒ Š;wò4Ó——-[–q™0aŸ;tèeÕÁ#`ÂWኀ¡{s ¥²¯dwäNŠ“õŒAxjrq*œŠåHØÔx"äx&û|š#[ÛÓ½ &\qêI‹"þœÏ¡€§¼ŽÑLŸÆÛS§N½é¦›îºë®tËØ¶ð+ÍÑzžœœæhƒoÓ|Vb˜>´ç—*UŠ¿Ÿ}ö™ùß´“C9ÉÞË\Ú½x zså•W¶iÓfïÞ½°µÛo¿Ýpñ*T@ߥ£€uK–,q3èîréÄ6EÿxB)éqé?ÿùÏÀ¦GÎ?ÿ|H”7§;t ª’"ü:øÀù9wÂÃ…nµª˜NZ3ò“®ÈÀxpM£wjë0%™_ÛµkG+`ÔÔœ:Eg²‘@¨˜R¦xñâPš§Iõ$älû])ŠªW^y…®K—˜ÌBNÝiw‘fË/ ¢Ï…¡«§—vÉÀëŽRñàÒŒ— n÷êÕ 0gÎÒS‡QÎ=÷\%5ôÊ}Ï=÷¤ ©g`vA_-¨y û,›ž`³wüøñpcä2ŽFmݺ•¹Š²P¯^=…HrK ý‘;™ù°bnŽü#W_}õ‚ 2Ùö@‰%êÖ­ë < BnvëÖíÓO?…½xæš^=‚v¡ƒ' 3dîܹ&´jݺµ|بw‚'=© ´vÝuÙÂï4«``©VŽH5ȺְO£ ¸¡°6êl&蠟&k>k{ñÕÔá‡~p¿ “ ÞEÉäE/ä9nbjѸ‘ÚÖb(y‘D%Ä9ÅNNB˜.Ô §"Ú|¾•+Wf>3dÆ9´Êá+4}³\:Ý:th:u:wîìToÒ¤‰:;uêÔªU«‡z¨Q£F|¸ûî»[¶lÉKA!¥ù!¼ú ré¿[\SL¾ñÆ5þ4mÚ´L™2õë×G¬|ýõ×mèhˆi8ÂeòvùÃW§éËÁDâžyóæiа‡ðíÛ·‡ß5w®_¿žþË ƒ(’3I>ÿüóØ={öL˜0Á‰´'ƒh 3yàÀÿ™-âÉ믿np¦å?þH%™™€üIÅȵ”ñºw`¼Ä?þñ“'OÖ6È×G ¿D‡žžWæ€I!¢Z‹èäXY[¶l9JviT¾ÒÏ›7ož4i’ã¡Ó+V¬`AuïÞõjøðáÏAƒ=ÿüóüåúo¼!):Ú…º!5Ð‚ÕærÎYä—ALïиµ|‚`Ï=÷\—.]{ì±;wFL'P¥_¿~<ÜÜÙ´ˆ¶KÛ¾úê«>}ú °Ó§O—³>üðC¤Õ¸qã¸n¶>i$«fÈ!è«sýõ×{F±ÂhÚñ[Ç͵£<„` 1B¬E¢G™ý#òŸ(Ü;v¬X±bd¨§9M›6-Q¢Ä¤I““/¾øbÙ²ež§?~|Ù²ei&ZÃÊ•+Óä2'OñD|º|X‰¿üò‹ƒÝôçoz¢ÇIÂõaÆ!©S§ú‹&»‚ÙÎ>á‹9=–Éæ=J\š¥Ï”KàÜR¥J™Í…Êyß}÷mß¾=‡M1â,ÿãÒ¼÷å—_.m¸‰ƒÜõô„ZN€&„*M€„üÝÐÐ978!L.¼ðBtI½›ö›IüÐdÙ!”§Ÿ~š*=ùä“ZÈÓuëÖaƒ¹´víZ4Ý/íÀÆka ð¯™¼³'ß~ûí†lჇ™¢¨i\`hFÃc@ozãÃ?ä«Að¦M›ÆópÑWõë××4m”§1cÆ„í¡Ó` ÐÁy7 Д6>|¸––-[¾ñÆqηŸ„@á)Q4N3!íôI$wàƒþÒ|îÚµkÏž=#K{!ÞË\:¤3˜ ÚÀg2ÙÀD—_~9’÷›o¾QL Ž]¡|5;a˜Óþ”B.}ðbNm7×@?¸Zµjºµ»3¸mÛ6ldfaød¤ ®a7<|ñ ô—f:É$·¡ÇêvD¶ìv³9°d?ÿ·û·`kqÈEHñÅ™i |p¼Ù³g—.]ú”SN1 Á'Ÿ|Ò°aóÏ>›IÈ•wß}·B… çf M‹ëIEØÒCÜ,†A ÒîÙ³Ç:ñ_‡QÈð-Z´èÞ{ïÕ%•ë—]vY‹-¼¡wïÞ:ur‹¼°rѯ†åÀ_ ð(qéԸDzl·nÝZ³fMÞ#b2<öØc|fÉ0èÎ#CF´iÓÍ«ÀÒ”03Y¿î}¤P¿D¢LÞù8'³Q©™·?üðCj©“%Y´‘z8ä<Ó÷^ñsƒíï×:]t; `)ÿ±Ý»wù®»îÒ5+vˆÜïK¡8“wÒP‰oÃã4bŽuׯ AdøòúòåË ¸eË–n¸!ð“þŒ(£/±±E¯Fü.„ëȃ`¯êLø ¥À0MwÜqÇ‚ Ü>;i£ÜÓö5kÖ,Y²„þ‰Ý Ç ™ãÎ_8˜®æè,•+W¾æškP¦Daú›c–K3:±ƒ“qÚ¿öÚkøÃ"5üرcÇ7lØ0ôÐ7ß|³OŸ>Ý»wŸ:uª†PÃGBý÷[ ¹ôß-fw§`àÀõêÕÓ4]·nÝpޝ>û쳫¯¾š9²L•™3gòÃXÈ<áÇÔ #¢vg’=ÁHb%J§^…âðÿw€’JÆÌßóiРAñâÅ!öañp¯vÈ!—^zé„ øïÅ_lÄ~ýú9K™xÂòE]tÆ&M…Á4𘛇‚ÑM˜qô,’H¢}Üxã!:¡^¬h~Ý¢íÂô7‡S\hóÐ1“MNz4¸´ù›=—oüñÇb–6«¦D‰Æo1? ÒAÃ`ÖŽ§’Á$žnyP‡Å‹“5¼°rÏ8ã Dª1ýÃNi˜ç^ ÆQœI¨ˆãoªøÇ`ñsͼ(MÀdX§çŸ>K-ìg %Pœ¾%¿wï^Øoýö(ŠUåâûï¿ÿÕW_…aS˜ ëÇŠ+˜Š@tÿþý™ˆ ³ç€¢íÚµá#ÛýC5B˜š¬<SÞË–øÊhòX¾¬ž¯šwh­Ø°aƒÚQßÄí¢E‹†vÀ¸Ÿ„¤šŽÝµkW§NÒúȯ`üºë®£2&aiÁY=€i`dé+®¸"¦BÁ øW«VÍØAÑ'Ô$Œ!'¶Mc¿…î2 ´E±‘ ‘îÖ­Ûúõë…•åiÓ¦±  mÇÉP˜œEŸ¶mÛ%.Í‹X•¾Ë˜f|`q¡„^ýõ¨Ÿ\p:Ôi§Æß‡z¨wïÞ½zõjÔ¨s E‹­[·6Ôü!ý XË̘áøñã]†±o˜Ž÷4høðáo¼ñFûöígÏž„ÊcÎ|îÕðË` }òóÏ?Çöz¬²#Hð€Äœ€À\¡7èºråʉқ6m‚-{X›î…Aù“z‚Ìß|ó P,çâ¾l±†\ܾ}û¶mÛ Óh%b‚ƒÒ2[žlÞp4nÈRÙÍ{‘LöH87èæñÏÿüÏÌ®zÆßz8]ü×€£™š"Áÿ{¶ð¯Íu*F•¨<÷óœŽ;V­ZµyóæÜ@åÃÙƒöêþwò`ŬY³"`© ÎW™†Õ‹1ŠÐÜUªTAbf²Ge¯¼òÊÂC.GÄEÇnÞ¼ƒ[‚Øà˜¨3fdò¶½[˜ö¾‚Õ=sæÌ=z`¡|ùòÈbhϳÏ> öíÛdöC÷îÝ!ð,óCŽÓó¡9Àï2ü)ØËJLm¤6‡¿ã¿=üðôšæSI4åøü‚)±ÌmgI½ 3Yân¸n9ï¼ó5zƸO|f’0¦5!]¤HXiê]wݳÊäÿ × -]Ÿ}öY;æž¡Åã¥i@-~»gÏ÷a=ßÄØOÏéÄÍÆÜóÈ 3 ?øàƒK—.ÕHõïÿþïªrüdÑ¢EæÖ XºtiHuº9Ë”CƒH4ŸíܹÓíuŸpÇ÷8—cWzs|epÿœ-†ÏUû®]»6èݦM›ýþ¶°üÖòÎ;ï\sÍ5NZflì »t&9-.‘y ¾ì²ËXbïe9h„‘}Eì¾C(êÑÌ7gD€G0Î¥¨r‡—Î:ë¬[n¹¥ÿþ!Ôíàg`ÜÌrÂëÆŽëö Ñ $*ŸßWä0KNF’©S§j"˜3gN&/y±À‡Î<ý§/´éJù¯ƒñFøÊEî‰ \N®ó@0_ï—Àà &T¨PÁ 4ÞÂ(ÀÊøI„11©–6>ûF]Þài&«mèã(žŒŽÐÜ«íð …ÄΈ‘úÂêÎóOl^4œ6mR8 \ \ÀŸÃR¬X1®@ŠB®!ß¡Ðéµk×âíáì E‹@šTëÒK/5µwX#5êNÆç@6ˆM¥J•n»í6MÁ¬÷4€¤3_intâCx/dï‘G‰<Ç=ŒÒ£|÷$UêСÃgœQ¼xqÔ7­¬ «òÎ$X‰–ÐÎ4&§€ïèW¯^Ý|¸h¢eÅŠ›5köñÇÓ“±é7®ß}÷݈Z>°–Ó<îf²ÇäyQÏž=Ýeâ}÷ÝwÏ=÷\&qÕxë­·"…P‰>“ç§Ÿ~‚Z;>‡üÜ‹_~ùeÇŽ©ÀUW]µoß>TBX´ó Üfzøá‡­Zµbz_rÉ%5èM¿üò œÙgR%Äß‚ ˆMš4Y·nTœùéÿ“Kç$ËïBÉC¢›0Fuã7¸¾ÿþû€x‡SèXx©¹IûÃQâÒq˜4“ç#¡q/@›•ûí·ßzŠÁDóò+n–xhtEZÎ\b½³x‡ =>—Vå2dÒ§OŸ7¢¡C¨æÍ›ÇB¦’²5]A `Í2Ãu÷õ+PóÔSO™pÜè͆GœØK)ݽEÞéÜ>bÄNo„o$ ¹˜!†^"sY˜F4µc‘’|ý"[øÀר3ðrnÞ¼™_¹«øÀ¤JÁ† LÜ£Ù³V­Z³fÍŠn÷Ýwá´6ÜE¦£,‹føx£yùÀW.*x×—Ùb ¹8sæL_ÐÃ;vì@Xx†]/_@[êRªT)è4¯HMC–ä„GŒðl ¿#³Nà4“ÝsWM´ëÔ©hÓoÝ»wgŽ`.“­0» pIƒ™.½óÎ; .tôíÛW»å!ìOÅè¸úX§²##´ôïß?µ~°4Ð= a¤ùñIÚP,Y²dðàÁ—_~¹°4@1dÀ°Åx-[¶dá2TÉ ©[‡bLé"÷ÎRmáH'¸¾~þùgû .]£FH$½xñ⸟ŽòÀ‘ dçÎË ‡Ë4ÒÍí< ?Œp¼wÅŠ)¾ñ•9‰šŠZ17R#'XºtéR÷¤¸ŽÆCäÜFY½zµxî —M›61«©bâ /´è ±Cá{ÝOß¶m[×®]ѪÎ:ë,&*s‰™sbûüÜ.IR·x³ö¢€Òò/ÄÙÕW_É £{3…ÁÿÄÐH 5µ=ÿüózÝŽÕ$˜É;þÏêàu×\s 1uصk×c=V¯^=íÒ¬ Vº©¸Ì²‘ùÛ ¨¿•ÆG=âÒFyzùå—Q+æÏŸŸNÑj :JqÁp§üt”sû1šÚ.”zd_­ß²e ÍKSßcިߎ‹7|•p&Ï ÞŽ†kn Ãÿò—¿ÀЀ_z2 ÈK_¹î„Ô—À¼Wümß¾= ‘‰ÝÝ|ŒÃžŒ,RÞC‹qp5ÞèE%¯½)‘ù…Ù¨YÆ¿1¸Ú«÷ìÙƒ,èСƒ–ÀœˆpT€†Ÿðz}N\Ó­5ɘ)毽öZtR´WhšËÉKðHY?t7Í÷Ä¡(‡l¡5P¤¤úì³Ï†œL›6×Á‚Ða¯»î:¹´:”gH‹R+·‘H_|ñÅœ)—åǎ‹t^Ìå*Þ Y\S9~ 4&Éú\ 7˜É“'«õ[FŒ‘Éîl¦T]¼ô-ÄU¿Ù;v0© l¨™Ë¤„` ® &ƒâ¶cg@QÃGó_`ß™É<T¡çü¶U«VÕªU{î¹çr¦P‡Q•ÓsŒ¿¾æîè Í5²jÞ¢E a9@éä´Kç¿ó@(MÿÐc7ß|³î1+V|òÉ' f“ýD-Rǘxƨ9JvéLžW@&ÏÁzÓ AÞ…¥&ºU+VÌX=¬ÐT·5áY?X×édУÄ¥uÞ€Ây晋-Š_éæZÖZ^0\:•5¾ÁááúŽ;ºñª[Eš´åˆHm?’qÒ'Ås!×-q‘›uíõ'“/OG|5øUü089øá+0xðà¢E‹"Ê–-‹vS¤H‘x€ÛöîÝkYÅíà•‡ÈxåV5^çŽyŠ6ÈL –ÇrÚ b뱉¾ös'çIµG¦oLNÏëÕ™®é«&Mš R|ðÁúõëBîá(¶'¼;w.%>T©R…e2f̘C~¾îRÒ­šðóÔ©SG‰Ð®]»… N™2eøðá3fÌ@çE—!7lØðÍ7ßxVâ0}-&NœÈ‹Ì3r n˜7oU…›E|¤û 0c𣠅¸ìÒ¥‹Ç7Ö¬YqÕñ4îÚµ«]” gžyô®U«*-¼Zµe[¶l)S¦Ì©§žúú믻ÙÊ «V­ ™Ègç˜!‹áÞ›7oxõ‹ã]<œÑ7Ø©–m eL§Ý»wsCHæ¼gÏSÍ;—+lšóm¶H ¸mÙ²e]tuƒ˜WKY,’ßµ#9îàðK/½T©R%”‚8H~riÞ…½ÑxÕ('a"}¥’¿`;\pAá¦á¡¸r$ÀŠ5¥›ÇQ2ø‡ó3|xã7<AÀK•*Åò9í´ÓXø ®¼ÅSçœsέ·Þ9›~Sa.1ǘW‘tT9ˆ¿4S®ÿþð7óô§ kŒûnníÑù—ùª§•N³ª ŠäW\Á*€¨ð_dµ:²ôžgŽ?¾e¶,_¾Ü‹&à ƒ„ðÏ9sæ¸mä^­Å\3±a*ÿoÙâ¼â"`ûý÷߃¥zy™4<Âò€ØÓ§Oߺuk½zõ©I“&žÈóì³Ïáù—„J¸›—†'Ï×_MÝT´?ʧ7ù ²€ûµ·ó¯\¤LTã½÷Þ3ýO£™L’4[3°U«VTéñÇŸ}ú@]Š/Ž„: ¹´çîY‰ z¬‘àÕš1íFµT%µ½ê^C!ÆN MÄ™ÉT2dÈQÊ!žcí”̰(`ï¨Ø¬šòåËvéöÛo €Í‘#G‚«Ï=÷Üðáß~úiî<´¹Ç 5䂌ô—_~›ˆK‹Æ +W®\z¿ýࣘº¬ÊñÆØªQiº¿)_ÓxžG¤,]ºT‰ Beí  ûøã£íö×ÝæˆÅë9ÄLž»ÅOÙ_­- £ÖÐáV'\»¥Û¤IÅ4o¼é¦›"È÷@Qß›6œÛ"¶^&9ó_yZÌC7ÍÓSLøœÆ3çuã‡Õ[±Õ«WÛdí6'°}Œ.Òj”Ⳃ•±ópS²¢–Á­Y³æm·ÝæÅÁƒG$®Ârýï,eæ€ Ê ñ—_~™ÿ¦é0þñÂÉ[´=ºS§NÆñ¸òÊ+Ë–- >ƒÉãK/½4mÚ4T]^÷ì³Ï"2 k–ÉwÜé)ûöícAQa@lܸq—\rIïÞ½YkЉGeŒ6Ï:5Àʼníà¡ÅØ!YhcÆŒ¹á†t{kÔ¨£¯5LÛ”÷ñ‰¾b¹Ò£G ¬\¹ÒÃ#<¨ýßõK—Þwß}Õ«Wï½÷ òŒÌÕÇ’¯à3ã®[?™7o^ÄvføfΜkß‹„|:t¨{—o¾ù¦aaRãC(€‚ âþ‡~à½L t·»îºË)Í÷îÝ;uêÔ?þñÑ3/¾ø"ÿ¥i2"ÉÚü-°<Ç—þõ×_W­ZÕªU+(Á<`¬øÅ–þ69èiâ }<§Ø{ô­œ‡é _u‘˜#º±ÝX¤¬ ÚaÇPÆMÙìçà å‘:‡€ü“'OÖ½Ðõ«Ÿ˜ûûN×^½zuÖY~U~kc†!êŒ3Π9Ú…2¿ÝU,œm¸=ô6lÈó«U«6{öl:„~ã¢Lø±ÇƒY©³цÀOshòuРAq’È\ã¨x”˜¯f+æN0–ßnÞ¼Y7fæáܹsEé+V[fΜ9îkó@¤­ô~À€¥¿ËϪ¿ÿþû[™3t]ÀùCUÁT'nÐÞÅ=ãLJÆ;©¨ µZ¾|9Í‘ŠP+ä‹{(©yNÑÝiU»vmºë©§ž¢ói&òú¤Í,ö{­ÓX€|5TiAré¨ËNå¢`=¦´Cd2—N-“`È’%K ˆ¬b&¡1ÐB;s9wïÞ½H‘"`Ç ó¡Vt×5×\S¦L™J•*l9“·ì›gxÿ® q¿8m)8Ó¡C ìÒK/Zµ!ä´‡•üêxÅÌ1Û©_C/v|åÆ +È@ÍV):uŽm¾¦M›V­ZÁªK?÷p3 úÄO@°ù׺u뼨òŸÙ“sòaQ ®ð ­ú¾ËÐaÜl+\×uGÑcä•Ï:iiìØ8¬{þüùt "ÀCˆæXäæTšh»v;㸓þv)øÉ'ŸT¨P¡J•*<òHa¥žK;ô>6²oß¾ˆœÎÅå ¹¤TZY8è³µjÕêß¿¿kö@\Z§_þ¹JOà'¸ß‚T:ÿüó‹+6jÔ(Ïßé>÷sQ{2="q[ß¾}Q~ãi:ä… q«V­x~ÇŽÀ/¿ü2“u·ÓèÍàþéOB4»êƒ*KDÕ²Ó‰ÇfŽ¢{õêå¾³òB·:·^ãþÎHHÀdpæùçŸÏüí¹!E[|uzÈ™Ÿ;wî\³fÍ AƒV¯^ÍÛ݈Ìä A` Ôüôà/:fxª+ì`_|ñzh5jÖ¬IÛeJÚó ±ñ¤âÒ‘-:“~§K—.ÌŠx€Ù2vìØ>}ú¤Ù÷Á(ñÙTxQo_ýu³ë8gM¹‰/õ:f•;ˆå–-[€V”ý–-[zQo(ê FÑR½©nŠ€œÜo8‹æÍ›{2úÌ3ÏKƒøÁXcåíØ±é&#݈nòùçŸÛ<M™u¦ªmÙ•d Á:“ϲêwíÚõ¯ÙâÀž={R8›Q©˜Ñ]œ¥çž{n©R¥h2ÀËsº‹ëöóÏ?/X° ä˦M›6lØ ä" ¸Çc,Îð­[·"D¤»îO™2…Whç{ÇÝ´°3fÐ4Ÿ©õ¬³ÎBʯ_¿>;ú:úŽJô´W7É9 rŒê¬ø;ï¼óhríÚµOlÿðB.ãžÉ¦ñzíµ×5jÄ[n¼ñFûÒ¥KGíŠÖ¡‹‹i¾Ñ߄ϾhåÊ•h¦F *äÒÁý~ýúöÿu×]ðB5Ý&cÜ¿ûî»èŠ÷߳롧vê‰qZø;$[âë¼yó@iPß ¾._¾:ÊO~üñÇ9sæ€ô¼2š‹0yšIU:tèðõ×_ƒçܰvíÚ%K–„?Gv¸ËüÊ+¯ §@Kˆ4óä£>Z¼x1õQuÞ`§OŸ®àg&Ož œ2% +V„Æ£geòÎh,[¶ J`|Z."ªÂ÷ƒG™¢xñâh´.Eüʰ0ÑÃÇW[SŒ¥¶,„¦p.¾øâ¹sçæ÷Bl<©¸t˜"AÑ«®ºê¢‹.2(…Uèi0f̘CÓ…‚˜|eú±Ò]Aæ àòƒÁäÅcs¡9dÀèç¡¿§£tÀ| ”¬©·¡¸¾•)S¦dÉ’ ôôó,¡ ¤àùa×Íd3p¥ô믿êÕŒ, ¿dKبjYî›o¾‰zòÙ°NO?ý´BS˰(Í+@lì¬Y³2y.dÑvîüðÃSÃNëKß+’§ÿ¥Úq%+¯ÈÑéÀD›ÉJÀü§žz HOɳÎ'QSZH§-ÇV AÜ{ï½N6s–žK³š>þøcóyy5–I>|øp ¤aúí½‘J °úì³Ï\æ…>9¦û]»v»iÓ¦éÉ0äË/¿ ojŠÃÅÃN:A±ëÁ¬©¸tØ-Yfå€ÅuîܹAƒ*V[ ¯\¹ò¡åórÏ=r±eþvO'b¦e’À›Úuœ86sp¤›ta¦ôïß?…þ”\0xú+¾¢Ë;VpŒõÁ( jaãŸ~ú)÷7nܨDà wˆ=mqSOhd®&úÈ8ÊÜO>ù$Ý7D¥^s;wíLvó:3ð5dW–/_œîÛ·Ïæôë×φtíÚ•7~þùçk×®õ9Ü0bÄ%ï—_~ Æ–(QböìÙº=£ø@³5wÈó¡ÔÁ}€óøñã=”áXÓ"¹·Žè†#àÚ†{Ú óæÍS‚kߨ°aCÀOƒcÐÿz³É€ážs÷uAõ㈫ñ ux¼`ÅW_}eŒÊ§žz*UÄ QôÄæÒ¬‹"EŠ@H@©/ò_` °téÒ&°Ëä9»‚9%?LúxD—hàÞ¢E‹€z€ ƒ¯ðÙß7n\¸pa(#€ÞâÅ‹uºƒdŒ`l‹‡\54ûA Àÿ=zp¸û&[èstés^=uêTý¼Ù²eaæÌAl¿¾sLE£Úz^•9²áqn Jæ°ÐÊ»˜on÷íÛWH&ÈáwìØáá À™6Nš4‰'S[M%[¶l¡&Æ$מ¯Ùœ"c_s¬(Çx‰òž£œ5kÖµ×^[²dÉÈ…ÁÜP ëaXˆ'—†§±FP¨4hpÚi§Ý}÷Ýj^½zõ2‚–좋.ʑ㇌ՆSÈäÅÀ”ÒÛÁÒ¬,—°z®Ç™µ±35ù?ªmÛ¶§œrÊõ×_ß»wïH/î)¿ƒ<Ç£—Æx§Ïš:u‚F‚ÛÆ$'G¼]Öêq¿´bî» žûvéE:ٓ憙e”/_þæ›oŽƒ‘|VÌ`} ‚ãÜsÏ*½!Ü)ᯠ¸*Ï1 e¦mø•gŽÁÀãüËE gƒö\üé§Ÿ¼Y`¤oáççœsbC¦ðÒHhËèð+P4LÓÔç–õ„Ê>¼L™2-[¶Ü³g;ŒÜÀ¯Ì¶ zøÁºé#¤z~‚óŠæºuëÖ®]›*ZrѰÑöˆE–îôE´ÒmÛ¶M™2eÅŠ|}ûí·™´—]vYÏž=©•Á¯)¡³º âžÎ¡Ÿ }㸻wÌ|(<~Rqi&ëúzúé§;+˜ÿÍ›7¯P¡BTã™gžÆs\ëÿ‘’?ê²™8ܽb²±âô  HºXÝ;wŽ_ÜylúSÅi¿¢nß~ûíT›õEGYg`J_ăôœ³Î:ËÔäºÑ-ï¿ÿ¾gµHW_uƒîî¾üòËàÒëׯPš”=ôçYϳ%rLó¨O?ý”‡+(ó•+W^|ñÅgžy&¬ÀÛ"Bu &S½F]zé¥Ë—/OÈsÂì`»@un62eÙ²eÔPÕiçÎÜl¼/CÝ¢é#\`õW±’ô0ÿUÙ7Æ Ÿ%žš‡`ÓoÞ¼víÚZµj™á‚AA§ ,õüÑ`kW]uCloh:NÛRÈ¥ÿñ2tèP®Xt¬HZ˜ùúÏCqÝx:œñ@Ö¸¾Ó,«BÙë®»®\¹rkÖ¬1Èí…/íÞ½ûçŸÖYâÝwßK•VŒÂ®]»Ö­[׿ÿ’%K–/_Þö0(·9[ô¾Ëd¹lß¾=89p§Ë3Y_>YeŠWƒùHíNü„:Ìž=›÷è¤]½zµr‡›{õêuÉ%—¨j1” 48,Óà 3gÎäEúÓŸ<¸ 'ç dž9F£.\È‹¬R±bŘuaþE0ÓÌ䥻oçi¼x„¡ÇÀ,â€2"/¥Êæ Øî–·éáÀ´‘#G_ñ.Ôtèa”,ZªâPF€)š£D>Ž| ¹ô‘*¬Ü®]»žqÆ7ÖKùÁD¥ÕÂùý÷ß›Ö6bûmŽÊÚäu4õ8 Y0gÎÝËŸþy Ï“ÎŒl¸¨±Ô”´>½è,†7‘Ã~é| ¬óxˆr ÐcE#+„ÝÆ¹y¾þúk]û<¨È£|e*þKõÂ&ŒŠ{£Fâu†øp_€)¡ù‚mljjb¢ðóÎ;iiµ¥‡/7SC~nld=:.‘€xw¶Ð'<2ÌÁa¥Ÿ4?„×чü7ŒíHP:ô,®ÕÄd÷ÔÄlËmÛ¶ôtRjРqÀzn0²:½Aói¯'ë lò{ÍŸÏ–8:dÿ£Æžzê©Gg‘±_Ì!^ˆ¢'6—†’ùð¯¾úеàgçáJê0|¼ët"äÇ .l¢" Ó¦MÖÝM7Ý4bÄS~ûí·ž±É&¬Q ¡‹øª’ËÓFÍHuëÖM¸þß³Å8iA,@N¦Ó&Ø5¨ˆLç‹F¶,ú_fˆ‚ÒØJ`7n\Î9eêI3=Ø’É:6khõ¿PßL²Ùß½yNdj‹Eü% X”³MÆCêñ!ÂÆrT¼E‹]tÝ{Ê)§ A@rª+ÖÍÐ4aØ7?#_sv{uYà Àö¨™Ks•Ïo.ß'dq>hod0—äTÉ¥ƒ¦Âµ´ãµk׎e‚B]½zu–jfDHiréý–ó„ èº+®¸bêÔ©i}?€™á5'b#›ÌHûØcå Dz"8ÂPçíHˆƒ¦f2œs³[“¢ïÒ£ëFÜB:CæÓü‰Â¯©aø•Þï©ã³¥hÑ¢¨`²>^ªç¶•IO»»=šÉ ˆ­=9ìäÑQ©?Ol_êûááAó´»4Sk0D¥¥ÜiäÀ† ‚Û0ÿ™3gæžØ:ñh§Îã“Úa ’P0óÇs‘ h{†éĸÜ~ûíS¦L‰ü;F(Œ_zÂsi Ø‡ .‰ºdÀ¨ûî»oÅŠÛ¶mn oÏäÅ4„™ü-V¬X™2exËÒ¥K3Ùí]ë¹gÏ>hŠ¡ Œ&àÉKÕ ô½·7ÙU«V™¹Àì¢VZoÀ*9räHjù1ým´·oßN• µÊ qÖ ‡8p`³fÍ*UªD?Ó(tÃHsðõ×_ç¤ÓLdžg7®éï(C¡f’Çzõê… *,¿cqP´¡™¨nÈ!nôØ$«Ãí[ºtéÊ+—]v¦T©RT©dÉ’«W¯.˜*×\Z¸X´hÑå—_^¤HQÎä}þ—~6  ø³nÝ:|}‘ùúgòYOÏñÐ,“urj^sÍ5f&»EÈßjÕªù ÅÄ3Ï<ØFdTh¤­5ØGJpÀ'e9„Ï›º…¿0I7!T=²Ä‚Ì@kŠ¥Û¶m}úÄÀÅÎ{¦0ÀIÀ¥uOeÞ2íYGéÎ;CÏ"êf&»k㇣¡.TfîÞãÚÇ#“„NRÓ‡”>üðÃŽà™gž¹fÍAÀÎdÂׄŽtÌC"úhl] 'J:ÓÀàT™ýùxXŸÔ‹Û*Àšþoô³>Õv²cÑ´iSsíwÞyÖSÊ nÃc1Ï<óŒœÓZ©p…),•§aºÑh£+…‡bÒ™ŒŠqûí·‹ÌJ+•‹°°*êå8xÄi¿ê nm‘’fiëþK¶(_~ùå›nºÉA2dˆçåÓ|¸û5 >Ó?Ý»w/UªÔW\»®…ñ:ŽÒ•ù½}i ªwß}@VA|L›6M¢L᫼FÁœwîܹcÇ`–çÐuT2f¢WéŠ?ÿùϽ{÷^µjÝ¢E‹úõë£øp‘ê}üñÇÈ[”ÉK:R¥Ò°aCûüüóϯR¥ #¥œ-ÄÀß· gÍ‚0s¸K—.zJSÊ–-ëö7z.(‘î€réƒ!ÇȵڰY`¤xñâö'¹`ÁcuFÚHÛãøÑGÕÂÁT¯¿þzwøß¶mÛ‚Eâ×›5k†hˆÐÊô¬ ˆaÀdÊuèÐ!tÿý÷S«Ñ£GKPgΜÉ$8ùš׿øâ a6Œ ޝ„%~sæÌñþáǃoF©…ºCP Ä¡¨-#5_?üðC+i^Â¥K—ŸÄ…€Œˆà·¼qË–-¡>¨/pEwq^„T’3ÛùpãY³fÅè ;>ùä“pÑ\.‹)½ÜkÔ¨q÷ÝwƒäÔÐ.Èœ1ZË]€5oø]°–‚çÒ”åË—ëÞ_´hQc“zL˜rã7~ðÁ" kíprµ¨Äù/Þâ)éã:&^ áçŸÎb¿êª«Î<óÌSO=Õ˜ è¹° •œÚ¾ÜÌRHÑ-ëׯP`îÛ·oÆŒðU´þX³tÝÁcâñÝ9¥d/½ô’¬@f ¨ºá–Ö­[SgÆ‚‰!^ÒÈpzôè3F­^½:?ÍÿꫯLeåÛÁ7cbxƒA?hˆ¯F.8©hiùòåúkù@Dü€â‚ÒFqÚD`m‹»„ñÊàQ°ëôà ½m4ª 6x$¬T©’§þð‡?Œ?Ñ™zEí‚Pàí¨æØzbàï[Ž…˜xi’eS°Hõ«¯¾Ú¾}{õ•)SfÔ¨Q9G0Ž^yíµ×N;í4¦(Ýr,(}žY6GðÅ %þ/.²Æ—-[6}út löìÙS§N…‹wÞy'`kœL©xš/<Ðâ9áu“žªÎ$›tlžÂlsÏ?üðóÏ?§]ÇO<)bù­¹ÚI-É‘Ì=„EìGX˜yµÏÔ'ÎUÞcþU«VM}¼uÏH;'‚ŽZÒ³0ÑvžÆK㇠e*¯£·ãþ4i{Hy݉÷»”t§»ÐSÜ€uó% Aƒâ¨W+õ½5°¨ø:ªAç#ÎDuþÅK•YQáØ8x¾Eå¬NÑéÛMotSœò^È_O¸H+ÂÍ;“—`”YÃB¼=¹4ƒîï»îº+V¸ðâ… ÞqÇžÍYPGªhpN#µjÕ åNß°L^ä·›Zn]ç'õ*I])âÎLžc°Þe™ìöúë¯¿à‚ J–,9`À–|lÓÃTƒfƒH,vOg‹~ÝØÀåá(×èþD»víŠ+kĈZ6è"¨µ.:Æ#Õ‹6mÚÄë\ÅBK­ÜƒÕ{=ò‚­Y³&¶í³4jÔˆ¾ð èèü„;åÏzïæÍ›e­´ñ—_~¬øK==âí±>Pc})·Ür˽÷Þ‹vÀ"ŒZ«‹n‡æSÒÝÙÔ7É& ’h?ãÊW•ÆÑª!ݸA¿tš)AwÐÜdžҙ@´k×càÀ,•+W†ãSÎ~„\¢zú1ZÏØ‚É$GQœüFµÒêîÜHOúÓPWq¿õ1{NLÂhŽ® v&«ÈhA*´—ŽsFÚè쟫ű†¾jî˜ø R²„ÙÇÒ]g‹ga¸(IÃø9•ܲe‹ ¶Œ‰G5x‘Gøàƒ‚6 ¯hxì±òÕ}Ϙ©íHLÏóýÌi²ªt±W©R% K¶qTîVø@-f4Ê8ÛAºôÛt‰y¼¨0Nõ!wÇÄ@ÇôwáÒ¸úõëÇ{k×®­ºš _æyÍš5Y°[;©¸´™ÍBZ2E'=6gΜ—_~9<ÙX˰eõÙ0€° z÷î­'Ê Ž9ú¼ ‘XÞWOT²2Ù|‚†×`±S+ºÈ""4"™œÝ@=¦š¢V !7»Nùk4þuíµ×šÄpó‘Ÿ@#y¸Fx½ûx X$(EOÏV/TÏ'‡{ T³téÒp°Ž†ðýÙ4\lÛ¶ÍcïzVƒ„4œÿÚ†* <ÏÆsÄ83 …dÂñ4æ'wêÚÍÍO"*Ô;ï¼#v9©¦OŸ6‡Xn€¶¡¹Ó!ÖPca×={ölÒ¤I©R¥Üæ+V¬˜y»àO?ýtÛ¶m_zé%Æ+Œ„S_ŽQ=ä¾.Ü\W{Dp°¨9Òï;m¬»½q´ç@¦<-Ø:Z§;.Í\âÉ*T)œ>-˜ÿ<س ûÍåtÈû•Ú3#~/ï­Q£Æï˥ݒhEæ>Ï;SDÎðß:¸¸~ýú§žz ¹¦{L«V­`ѬMµïÔ¸I[ÌÓäy#|—.„JìNãÄ7àlNmÏÊA¼ÓÜî†Ç—hù9“œWòu:|¦›ñ­уBð8j>ž¦Á«W®\çSb\öû^*¦\‹­®ÀU™¼pΙl@ÄV÷îÝ}ÿ¥º)­´´Ä¾ÿâ_5nÔbfXƒò™j\pË?ââ?5ÿ§¿-}úô1O®æqú>µFæz:ÉÍtæ*Ò ˆFÁß|óÍÏ?ÿü„ ¸ ‡·G–Ô(­g»v鮃uã7‚ü<*0v÷îÝ1—Ü%tè—(OÖæ¿ßxPÚçÝ'-ÄÒCÖ²#wè T¼æÒŒ ¹–L¯öÜsÏ9 \Á¸¡M›6¬#ˆâIÈ¥Í@'~þϼ¢­5%É'NLû¤I“è½ðLæ·qªŽÁ]°`ŠmÜŒ4”´kœäoŽó£‹18¯›W%ÌÑ:»³Ž¹ã–šÓ¡{óÙgŸ=eÊ”T«¢’î'柾%vB©uÈßüV2#fGìMEÍñh¼6|#¬Æ^˜Gür^c TèCx©à;^d2§€áò¡ú1[”b¾HÇEnûüóÏÃp‘É‹` ”á™4–¿á«L…¿øâ ¨5c׫W/íáÆl¡\tÑE~€í¼õÖ[vÝN…s¬äD¤t¸ísô òÐofÕñØf&ïŒRÎ^Év¾¤ÓqFµ°G\š©u饗¢ž+…•αU‡‡ ’Éçu˜ÅÐÄ¡€ó•)§]÷wáÒRD½ÿ5¯kÁ[¨!t‹Í©^x…´hÑ¢ôz}ÿþý‡  ¨D f QŸ5ÅÒƒõ‰Q<Ù­. „ å]Äc1R%Ehعs'ŠO¬nžóÁtî(A¼=Õ¢_¹èÉ;Þ«û± ˜¨¿Y-€ÛÚµk}/7дW^yÅiðË/¿/:?À0S{Ý~ß«‚@“5qÈ3Y7r(mÛ¶mb÷Ì›7¯ZµjL¶Àg«3yÇv°O%a2pïZµj=ýôÓ¢Ùܹs¹Acéð¿d øÊEúA±P4Ë»ïI‡Œ?Þ%V¹rå3³eÀ€Š?æÂT.Êý¼–™1_-;cÆ Ô(æ€ò.d.”˜ŠýéOBp¿øâ‹Ó§OGt]$g#¦q=Ê«¯¾ ¼3‘Ô)xµq¶ã'²÷ ˜¢ý¨`!—>|*«o¿Ý¸wïÞ‚·K[–§vépÉc&ø™‰Q³fMþ˲=Ù¸t “®ƒfÊÐñ‰¿ˆ•7ß|sñâŬµiÓ¦!kî¼óN³ÁîÚµ ŽR:‹ó›|å6Ðæül9ãŒ3N?ýt»×“ÝpÑ „6l@ ŽUÉ»Z·níAo£j´mÛ6Ž%ÂÖ>ûì3 è¿g ëÖ­ËWP—¯ VõêÕ?ýôSYß}÷ÝJË=0Γu« lܸqþüù´1øsïÞ½u`°&4A6e ¤Îï¾û.U¢D ,ö8€©{î¹Çm5/Ò(^gÀ:à‹—šcôÓy#¤ 9r¤[Ÿ–9sæX FÛ¨!­pžlݺµoß¾ÞÌ!ŸË–-cŒ|5fK&Ï9œ:3p‘;Œ›©ª§>S§NµŸíÛõë×1Ѧ§ õ§ÆÙSz>øàƒ]»v¥;w¾úê«Ýydpéú¿^½z&?¢>ˆ˜Ž;¢ºò@7Lé%]=­IõGW]uUŸ>}B XÖtÆm*:rÈBÝÓ¨¢aÍ=ÖÂØMÇ—f.yÜ i$øÞE‹yâ¶èXãÒš24•Çaæ¶®QO80ÕƒÄÒ]ô¬xÇŽ01è–[{r!K+VD£-*ø<Ó=}á4“—÷ŠûVS‡èïš:8p HÕ4ñ“¿ -ž4²¨ÖN>ðÕc8úÇÅ{Ã"ÊÏ}êÒXµšÂC/[´h‘ÖGÐ8Ð{î4™ÛÔB_îÁFFÍäyAzôèºyC(ö½|ERÜrË-Æ»xûí·ÝeS­po1|<øÊÅqiɧvªråÊ¥¨–NûH[&ò‡aY¿útòè‰,@ÂÒ´jÕŠÆ¢hüIS‹žsÎ9Œ¦°‰€·3¬æF×rÊ”)f çõçÈV“†M0Ô~ sìþbéᘦó΢}ûö0—|„¦ŠÓ :‘îD³@ |ü«bÅŠ¦7;\Úýšý6BÕ¬Y3„ ¬IòQÔ@YÂ(Ýâ*’H¬vÐévz˜+ЧnݺÅÙüªU«Ḵ^òäÈ«¥-ÚµÉé2áúå±` ïõ”‡;k¶‚ßîÞ½Û$2Ð~„µx !tE#JtöÐ[Ï]?ãBƒ«¼E›ŸâjøE´-q*Šj¯Y³Fÿ4§–>„2¼Ë‡{î†nñ±¸ãἈë†,}ÿ5EjOÖi$ÞK%yÖ”ò N̹=U¥nVØ-cQ¨çºÞ2™¼Ì‰Ž2]¼Â‹W ó2}ôQ&³§ ™b1<¬?'MšDý‘þ¥K—.S¦LãÆ_}õUÔþ"ÆæFÃf‹›ÔùÙ³EF8m\‰­(€¼`…\úÈri†²råÊf‹nÒRA0¹J•*guÖ5×\“9 ‘ÆMü–¨XéTäœ0aÔ¨ZµjhÔ[ÞK7²Ž"ÿu޼$™$M _ÎqÝÈOí_¥s$_à9ÀR€9ëcyΧµƒQ®\¿¦ZLæosŽÓÌ ýžïÕ«œvþüùƒ BÁÑÜZ´hQ€7ôn¸„Ä{¿ïLâ˜F&4Ž[¦•‰Ó@]ºt)R¤˜þxþ7'øbnXW¢D Ýü¾úê+U¡œA4™Â~}<ìI"žS«V-dÊ /¼ÀߦM›"È2yá[cPÜPа†¤Îä¥Ë1`Zj Ó,¥zõêEø2 ¼]CÄÑ ,Ó½ÚF@if1žüăKŠc¯Pm&I´—;ÃßOHhˆœýD-) B' ˜K›ÓÓÏ7ß|³ÆëPæä¶mÛzè!3f>ùä“V«c‡K³d"7•óh­¥7 {B¹á†Œº™Éºxâ‚z³XøÑÌhx¤‡3íž={€GžY¿~}“ PgœË—/O+³~ýz+ªx ÒAŸþe¢C_¤!]#öªU«´/AáÂHžFò7 ? '=ªçÛS§>ý+è¨ÐÁiT… J–,ùÎ;ïxÂN{‹ô˜z¦°)(É•Ú6Á”…`„FÔK!%* aÎòÉ$'òBXØ MLuÕÛn*œpfÓСrô¯ÙBÝ裰ڎ‚Æ^ºB“µ•ê#JR Ÿ9s¦´ÜÔ÷Ýv¤Ë 9 zóæÍçÎËH!ÏíJ•*éTÏxÑd¦\Ë–-6lÇž6mZÏž=§Nš#•"ÐM`Ž1Œºpñ¸ãÒ†^—!è4*˜Ç1ïP8@ªÍq¦z¬=Œîe!Ã#V:,"ãñǯY³&ÄòÜsÏ­X±"kdÓ¦M(Î*Ô`«Ì5 Dµ™#±5ÿ’_™öZÏgºÀŸ•+Wz`ÄûáH "²Aà!“P÷êÕ«s'/eÝQCÀxá«ÇúLø]¶ðA§¾Å‹‹F™¦o³«PCóÊ»`2á6mÚ ”i¦û\þõô^…´wáÂ…ï¿ÿþÞ ‚Q-3º4›¬Mû<««¶'éèêuëÖñs¦¢f[¤ ‡ð+þKã°9Pùúë¯3KËe †zÚ{æ¸1ðÅË1œ‹:{8oÞ<úºK÷>øàƒ†'åNÆš‡kÊÖ*·͛7›}Ò¾‡=ª? _Eoyèg^ªÛ9ÿ¥ç!ü!kºvíÊ¿øØvìØ¯R GŸÍØ{ýõ×kfT—aò/êé‹ ý<–‡ó šCÓBÑá~•X„´»¤¯hÖïãÑÂ+ÉÄ|0.»!’ÚÜN.J `yðàÁ7Ýt“Ê…áa8ÈPÏYk4†¼_ÜÕ«W‡©ŸÛ€xšg.¸Ï ’öOÈ-DZ#CŸ>}^~ùå‰'Î`…QtXìþÖ>a‘¢ìÄF7øÿ5<Á#ŠÚù/o¹ï¾û\ø‹-ò‡{÷îÐ@~Ñãf¡F³ÿ<ÔC¡2´H2©ÿÆÒ¥K££¨-ÈÙ®];3Àò/FäÉüdÖ¬YÔM E; 2s°€ÒçDó5ªΓ%„¼hÁ‚úº°R˜·ÌXmM:RŽ5JçC!Ú©Û$=ÍÃhÃóûõëÛ‚|õ˜g0Ï¡C‡¦£ÿÞ{ïE¼Aþ2â© º!µFt>,—ÏTðxm”Âô0c Ÿ{B>RºFÝ«W¯N:qò"ÒÌÑ“©ƒ½lªN:ˆËwß}æ#q†Î À\Ue;ŽbÿréýÚ¥™r“DòP ÒŒ{&/TÀ„¾c'&ž»x « ¨Î˜1cìØ±,X0°iÓ¦±(n¿ývoxM¸f.]a`Šõnª>ã,…¦é¡9årÄÏ×l!IÓl :c0 r®ƒ*þŠuÍg'Õyå´é&Z U¸v ÉPòùpZö±÷ß¿Š6óAö =ñÄûµÑå/ƒ¶Y>¼><"ZËîlˆ–kh?úÅ®Y&/c  †FÞvÛmŠÈ‡~8¬â¼%çÀ_}õ~câɺ‘zî2Ä 1b„áõa£†Е®PäÅÌ ÿ ÄgíN¼—±Á§Îâùýœ8“t¦V)~nŠö*}ÎX)R"]ºtieíIØ>TêüóÏãè úÛo¿h`¶Ðí÷(Dé#…)­-`.ãeǬš€n—*Chfi0Wu'8ÚõÑ!:ÁÛ!Zz„z€Î­£C¨‡ò_£‡ÅŠáyu“H{جÓù_ç©mÙšÙU@Q&ùŽ;X­¯¼òŠæÂ /œ9s&Þ¤I“êÕ«_rÉ%‹/Þ¾}{¸êYrÝ…Ù–bš˜“. éèƒÞf¾FJÕ§xñâtE¬Ü€G·,é °WXóÄŠ^d ¸vË1cưäÁ7ˆMß.½7ñ·>!ntJ€=“É;㬭^¼M•Á”aVªT ÙHs‡Iòo‡ØùÊ/sÎhäø¿ÅAC³jo§2Ñíéò¡!z©IÂÿW¶è[¥É"š@m+"jºÕ›~àç9K©ªJ¥ü¥DÖ+£¡;î׸ L_êéo»Î Dd ZÌ„ ž}öY˜3kSH®0g4„„Î_µjbqàÀLÚ§Ÿ~íìÕW_Eãˆh¨ùû–µSÚè²9G#õzràœÕÆGõœ©çùðé§Ÿ:Fƒ‰í~¢ïºòÎ]ר7‰*i,rñ†õÌiÉ‹KéšJ-?ô3ZjPÓOPÕH˜c¥×ªiÚbƒÃwE´X½[ݱ먞–&z‹°G¼°fa‰Œ&ÚS&_DÄpù¤éit2áN$à£>Š´-V¬X‰%/T Ã˸]¾|ù8ùàƒ2iˆeõJáÔÊqóó˜ªeË–Ê,ž¶páB0?hd™2ex‚Ÿé·Øâ uëÖÕÖê  0Àx§F ¹öÚka˾‹Z!ø"œðÈh*†L•âÑ톭ÎdO—€™¬ß5`“ÊB+€tº.ø­Ae™«†5¢FÃ_Ö㥠 ‡ˆŸ¶cÇ`rƒ«¸03µ/ìĺ‹Ía¡ÅW@e–¶@ç÷ÝwßöíÛ™r¼‘׹ůWr0+Œz±/[2Ù \¤æL0Ëoé:-ÛtõðáÃ5éû1dÈC} Ð0`††¾ìY<=7Ž'žxÀw ²T&ªaÚ;’¯Yb Žmn/þ»eË¿pÕCsdiÉ’% D­Zµ¨Þöª+âL·>'à¿‘LxZW ¦Ÿ¤ÉZÂM%Éše\‚eñQPé¦V-Z´¸ì²Ë€2î4} 3ŸŽ©€5†@JzÕÜú«p/R‰ð¿B1Â…®¶o½õ¨.Í4™æÈ]šÇõ 4®8ŸQXxˆ6&€ñl)ÈÐ[n¹…žüñÇžãÞh&ïˆ ªs‰.š?>9eÊÝEÇK.¹L>óÌ3Ï=÷\® ìðFŸEA.#^;uêĈ(5Œ^å®JþÄÐ wºÊ" –K;:w|‚àå0OÃÕ†@tÉçìÚkÌÙÄ7ölú4]IÓ€'iBa!5dò>DàÄÈl(Kw1ó³}ûö5kÖd>x…Ùˈ·iÓ&œV/pi&ØôéÓÍëa#É;F„Œ(ý™Ä-VLÅJ˜ Úoawè’,ó²â¤å6…=óÌ3,7ÀMm”©Ã89B‡ö·PíµF†Šœ³Fì ±h¤žÌ û¶ç=)D4iÒÄ´°¸=kÍE*¤¸Þ]­‘žUGwµ!Ÿ©½‚öèÑ£T©R0+ø!sÏ)§õSµÅkß>HMåÞÑ *8 À\ i4‹tÃé©gGÊëá—νêãšg]éaªõí©ÙP ±7¢ÀÑ¥v{zÂ(>§“c¨të-,ÏiL912ô¡]Æ5V{î/"ËøZCíÖˆRaâ6¾ ?…2yç|~*Ö™üMºðUÌðé|f{»víИKzZªÜ{ï½áʰ3íM3T£F Öó„ÛºtéÒªU+è=´gÏž¬š°§ ÓÅ«çdºûЭ±È{î1eò"RUÖÖÅ„D׈Pù‡=i, äÛ#s(Kƒ.²÷RãFD K÷ñsbì+wBEÝ2N† £ß)æµG‡EÚBäŒu¨S§Îå—_Þ´iÓ•+WîÌßÀ’6ßè—•*Ub†Dߪ"E¼bÙKNžèÐtbÕë² ¿Jã®ÓŸŸ}ö*p³fÍž}öÙêÕ«;!!Šè˜Ü†0{ÑþPH¡U9òdFléC·€9èžB¥æD³{§v{Øf*Ê5ŠÆN˜¬âx–¢ðx‘»Zt ä¹çžcÉP7{†{´{kðÉI019ÿ.uÄâ_a¼r·Nô¦»Â›bÓ¦Mžs´À3Ë–-‡PêÕ«ÈÓeäøÎ‰§í‚ÕgFʪÜô”Jʬ¾hKŒ7^|ñÅögT;> dñ ®#ªîºë.:Ê ÕLZ¹4Ãx˜ÉKª…jÀ•˜l*#Q¦‹ }DZ‹1ÞIcQPñÂ≗2îNNŸ‰Ö%v&0.ˆ{;pàÀü÷õ×_7q­Š•Ýn=ЈmeGEŽuᚯF§ G£˜º—bàø!@•ÓÅT#Æ0: 1ºÆC=dWŒ;–NcÕÈ&2Ðù–ÐÝ€‚8®’W­Z¸¾ÿþûé(¦ËT:tè¤I“Ö¯_F3oÞ¼8x›3NBn-—I^ÉRŠHò±ˆ²’É;©dP¯ƒ”tçE·œô¿üË”d©ƒ ýœ†C½ó»ÄD\tÓÛ©Ò@ˆÆ¥ÝBµ7n¬_°àö(S×ài¨ohUG)YmŽ-ˆN†KŸuÖYºÎ¦öðüB*G|0ÐÒH·˜ÆðÆ9sæ@‰™NÌU]­ ×åÊ+¯¬R¥Ê´iÓ<ßÍüq'(^ÇRJ“hx,EÁa@–ž$Çjæ4ÑÄ8F'–áø¦ÏIXžÒt2p³‰«tŠ@"L:µråÊTÎt´mÛ–…~ ƒ™aBa‡ë»s5ޱÐ.䯇&ULE›iÉ”s³&l¼±}©Ý[¼åºK v5—H绽þ—·Ðáö°qeÚt¬ž–´ÚÇŠ6Òû`-ó_¿F+M’m£ð)¥ÜŒZŠ.y)“^¡€AEPý1Üœòì¶–™}:Š¥ÆFŠþá®Á1´¿IΩ*¯ ŠfR¾êvÖîw›Õæ,èǨz®ú€uŒ”sçÎõT uà4Pž'qb2P©/Ÿÿ˜-oï½÷¬ ®‚äb²=õÔS¬>¦3 }Ï=÷¤Ç(<¡L1÷¨dëÖ­&h Ôù+VDÅø{Ÿ?>•yã7¨?õòeÐ/^Œ\xçw‹-â_Ç÷¯‰Ûø/ÿb”Ñå!Û¶mc@ö«…ÍC¾.¨£Jx¹;š¡…Et5õ/ƒ ON‰G(5þË)”Eaò°6é“Þ½{g³þ Ê‹‘Êè¸*;FÇë 4p(53©÷êÆÁ+èVœ­H‘"!BïË_è& LˆÐp è¸qãLG`‚pµjÕ<ªÀèGh2fc×®]¡ Æ ‹9lˆËˆ8G•<Âà ‰C»Ð<æ'ê Yz5ð2‹\§në3ë6nÜÈ¿ DÉ£Òó–-[¶iÓ† Ät…:F«™$ï¾û.ÛÙâá‘Q£FEP *é¡HÖ5Ïí¶à›³%¥zå)˜ÛüV”àù .tãO ?~<«£ÿþµjÕÆY2 oAðRšÀÏûô风L3wìØA=(Í$Q:øœ¡Ïù¡NȈ!{ÀMèmb•1’¶Ë¿Õ¬änŽ&wê …Ë? ‰$bPÅZS#„5Ŧ3GG 3>ô:ßÕÍü'Ô ‹îÀ Ò±áÈé Ø‹„ÖÅûöÛo‡° g"†ÏL¹°8Wã|Ð'Ÿ|ìÄ4Ö¸;μ‹v1ñà½,@’ÎéСCðO„`F6‚rû5Uü™BfIv^I yÔœ©B­$tCÏXCÚXôÍ *\tÑE,.ÃôéÓÕCñį 6ä·ðœ8zC©°:Pw#¨ëß[¦Lº…•ex[ s†!o䱨'2SRûöí{ì±G}”9r$“?ŒQ²#ýŽBôDÒg%xþ=…x,det DŽæžZS™ÛÂrÁgfG…á½L†`°á¤gî-:S§‹£ZäœÈe4Ât˜ Æ’0™ÕÈn&ËjôèÑÀk™™_2[ÂàV®\¹æÍ›Ó3±‚Ûà9M†èa+rŠpí{¡+A5ȸF¨†^¦òŸßÄ¥y¦>®#ü8ÙBk£áš‘Á‡F¡Œ³p˜çtò^ç Ù¬:=m§û(3œšÈˆÀ%w^€JÃ+iMò qÈâÃçÒ!˜PÐ\ª¡ãS\Zï_£ ÚQ<Ç4fS"¸©§s¯ðHŸYâ¶àoâÒaùç©õ@\Ú{7luðç°þÉÔâÁH87ÕS“£ÿò欑rû0P[f†„rÔ”¶=zôèܹ³‡Œ\kó“ºñ¨œHSà¶Úº*|,ψìJ¹÷Þ{Ѽè;î¸Ãûa2¬__Áôbæ0uÝu×ùÖÒ9‚¸ÔÀèpCEÒ³Té.CoøÏ§n½ÜŸZ¿sŽÄ„WègØZ*ríˆãáСCé% LÊ—Ir»Å@™0a‚t¹´¶ g©=ÌÄñUW]{^ÌfBðúu«fÑËêׯ‚ðרQÓ°ú9_}õÕ©F¬#sYAüÅ fEÆ®±¡“Lê õrœðÃj‡Z­jÑ¢… Ü,ØfnuûƒaÕ[× L^JSÚ¢½+“éŽ9ŒÚÈ ¤ +V¬^½:‚À(úÔÁ=hšoªY2]á, _…œ¯‘^ÖݹtL<-ŸÎ4þ¾ÿþû&y²tdeœvÚi÷ß?¤1¿i.µòüÓßÒ@ê¦!‘š»x5Yëû!²Å=ý. š©Š˜ÞîÕ«‹ÔBd.ððÃÃb¢fòòóÚ";|ÕªU “–å ¸XVº-1gÐwh/R/ä>·Ysž¬ÔæÕ`Äò–n–ÉÉ)<ÇX4tˆu ª4 èÄÏÃ^šF=õ $/R Å’mÐ@T]Ä1³½R¥JLXk#ù¼Û1‘јϦ ùîô3јYf¸žº”ŸôQÁÆY¡à»(h&ËöNœ8ñ†n VuëÖ½óÎ;[·nɆaIj—£íTûòË/gm>òÈ#T*ÚÐ¥:ko¿õÖ[ßȺ`•ñs)·^ñ¬hÍÅÿt€‚~=ƒi£¥ÂîXéLcXw¿~ý ÿÁÖH:©/ _c¤ö"Ë °Æm»6ÿ©ÎR}t žKÓRÓ´¥NÔ‘]Ž©ÂÑY Æ›>çu =ÒŠ!¯‘•ÌOÀ *‚5Ò#"Û,HŽ8ÿ~¶Ä¡£Ìm>ø êØW_}%9‰Í¾p9ð¼CéiA½ËXÅé¶…LÁ{]GÆj ÏÿßêãèS"=&­òàdðX¸“„å/Ó¨ZµjíÚµ‘_ ÓäÉ“Yh—¼Èß²Öx2Z 2‹®ð Fê౉R“Úáûx(ÂLª¥Ùšvø1âãa8뜦é|(è¹ærðòmCÏ…>õ[}ùdÆL€ö@ÅyÈsÏ='ýöpRèxâ‰'¨€ûª™Û4‡•ŽÔHʲ2yqéaVEú\ýõ¼ÎÓUG¶xŒ‹•«ë #¥q• ¬\¹à¿4*ÿ‘ÛÃ,±âê3Ê48Ãëzè!ø*ý™á¶ùóçº!§PÉ+VÀ»ÈèòôÒóÏ?Ùe—½þúëÐÂü„…µÊ “`¯žù\g¬ù•|qÂÓö8$°ð &•,hýúõÌ1X„fgÖàÿÏÞ{mY¥ûžcw9¶9"»Õ´1gŠPB‹(I‚dA$#("*A$(H¢€¢¢€€Š †Ö¶Ûvwµ½wïpNÏ>{fjb:_¦¦jªžùÕó«÷_ëÜ/xl|±ÃñþðÖó>Ï}¯{­k]y] 4i‹… ,túé×ÂþRQÔ%ˆr3*„Á«\H“óÏ?_ò÷|Máu°b0 ®k&ÿªã‹¨¼€"´ÓŸ|òIËfêãß´Áå½<«_ ù ‡ˆíϯ¬«cÇŽ`„ ¶nÝÊ||@=øàƒeöTsá…b³¨Î­[·Ž_õ‡p¿=Gä ü‹&cY8Ó6OS›9ji<² Ì9Ý;tè5q$CcpÁeS0îÿðÃA/û !ƒ$wÞy§·iòhŠ2²a3‘}Àö™gžAÝ‚¬44ô]x¢‡è2n¶:4Ò_· {‹°X·råJ<š ìøŒ3zè¡7¢ ¢ ÞvÛmÀ›;w.@Ž-`ß1Ö˜2æŸ}ö¬Ì8È.`Ï‚«ülW?!Ù&í#ùÃê—S!dÌÓÏ`è Ÿ¨h{¾ð 0–áÇDŽÔéÁ4ØŸekJQRiS®n dãRx ¹,¯†“dGÌÑûbè°bXxò¥—^š¬p` Ghh¬BéÀ2Û´i¥ƒ«Ø5—_~¹ÜÉ e^>,|@ãÔ6¸Ö®] T7mÚtÇwÀÕï¿ÿþY³fÁða€‘b÷ùÎï'N„ ƒK`>dΪ٠´tôFè‘A(ɰøÎti&{ ã½L#n()EÉW\ÁÚu€ìïùD‚´‰¡‡a…”t-Z”fTJ6Å_Ï<óLž‚ˆ€m=<ÿ…F‰HgÐCíöÏWô_ ‹–܉¤~öÙg#jáºÓ§OOn”›nº)jäš5k@ÅhJ …}÷§æçY‹GÛ~ƒþ™@¦O?ý#Q§“ÑYðIp %ÄÃ_‘S½]ÅCuEÏ!¢yóæ0Áƒó8_¾wEýŠG«©r™$LÛg¹Íý‚@þÒr!|&©\†óÏ›7æ k‚I"J`ª¯fˆÛB—%ð: >¬ þSsáÛHFc# #\Øý½åêó´Ü+óD“aG(¼43ä¯ÖÐz¦E‹ˆÈ¸dùl¾dÎðj8ª°‚é)§<…abIs¼ýû÷çu¶>gÎ5c˜a_$7êIy–9XÖix¬³A)æè~a!L>J;À1‡K2ÄV„™kÏŽ3UM'ÐÞ ×US¿:wî¬Û¤ÔèÐß:uêÄãì)4Rêáõò%b\bãø|Ì1Ç Ÿ§û0P…“€œÚ†Ø°|óóŸÿ ­Í÷Ðù6IۉΠÀµPJAà”bkBŸ†vh¢YzõêåŸg<‡{аzz÷î ‚!Ë ¥%K–@¶e©¨ø’ibê–Áöª»V+”Aá´òÿfÍš9Ò#ržrX§ >€00XöZB6Ní±¬ö–ï“ò¡+á òt»1š8–ÆÂ«A•ýèG²nF†›yüTk¨¥\ÆyD˜s±²w!KSÑJ‹èr`E54dÈbÌ8²e¹·Ç‘¬UÓ"(äfåç8F'C™‰?CR›ƒÃ:—*§ÆÂ âÿMðf–ÓºukôüÖ8n1Ï„¬² ­hí$‚ÕP2NsCóÜËÀHî—`&ðLhUÍh–JžBÇy+CÔøa­)øðÍkâéçÃÿZ¿¤,´þÚkÃî½9´J(cé-G!ŒkNaLJ„ ‚‡|y 'È"˜¿@PYÒ‡ 'Ö´©&©‰Çã`¸¥òU<*ªý…ÕÄÛµkW¶; wTF§ Q|t.Yé“Á2¶ö›ÔÄ3§1™ï­&^%!¢ÐzD–ÜI_ÿ‚EÖ_5Âÿ÷¿ÿ½ øÔ-Ó‘BJVâÝ[çqƒ”â 3n'¾&צa/áJÖv©¤‰BŒÉÀíít˜üîw¿c(i°<˜øú’ üÊþnÚ´ M#]wêÔ©Ã[=ôÐÄ–ðùR'Ø9çœVÿ$Úµï²TV:f¹¬î+¨›ŠÚsé€%¢ÐâFMun,ÐíhÚ^<ñ'Á™K 2Ž÷Nœ8ñÉ'Ÿ¼•þ€{œƒõœP×eïr Te³˜Jm`‹–.äÙ27]N惑˜úcé®.$97$iâ¶E³ý *„W]uVFkÒI<ˆLœI¤!Û]!|ä6WjJ§¦œ€Me­|õb­ÈÐØÜ´Ä!yP(™lbz£ˆJ´ß«c>ú(»ÉþêJOØÄ¡×%€M³n¦Q&‰ýîüÿõ_ÿ–ÂSàLé7{ñÅ59±+¹È$ˆˆG<€¥³:Е_ƒä,jüøñÈëhŒÌÖÉÌ  „¤4%Àù裔§†—‡ô8&ƒCéa@—ÃJr®Që¨(ºó­·Þ²® ã`׈`’íŠ+ Ùkû©ý?Å¥?3. ÚŒ=âÅœЦ ã…èüq €.Ú®]»AƒIGÜÙªU+Œô‡zEôÖ[oåסC‡êŽãïñÇš1»~Áð?&ðw©K{ÖS«W°ÔÃÙ¦M쬈¹7ß|óì³Ï†pXT™Eû'¥7¦â½J›’f‚F«ª6Ø'š¿v©=z´.²AÔ&–*”ü4aÂð\ràØòÌÐ=eÌ2|‘a±òѼ—x5úêêÕ«“ûÀ$qREF0”‡ø“—iÌާî:þ|ÐÀæV Ž¡ z„œ=UTƒåuXÁº $Šõë×낈!Ì2íµÍ¿Ül‰¡Œ Vz=sôJ‹j1“­ØÖ¶m[Ë®jð2>ã0r²ž¡JVÁ’C§Û·oÔ,JŽÁÍiÝh¢7¤0Ù)Y °rJ̘l«8kgÎZî\°ßôz`ëÖ­Û²e‹ªІçð/DíhP(sÈÿíßþÍ’­24`Ë>R+B6š$‹Z³f “LzBÙD’iólÖ Vv®ïˆï `꺼ÝCF7fò /H8òCh$©©Lþ¹çž+SõaÎñ}±stÆÖêµ’ÌF‘Ya-–ZýäÉ“mìÅëø€}d¨§MÉ‘ ܲY× ”‹†À¿Q˜€M½_¦·víZaeÀ$7óA@q3û’ò|ϰ¨Ä:µØt !?TBñëJü:žI¾Æ5Ái‘D©1¾¹~Å6áì »i­ï·ß~;ÒßÁaé KÑ-K¬Ä¢ ¡1UÓ…´ÎRãBhÛÃÍD3–’ °k@XuΨQµ=Û+x/³U²°^¤‰}<…˜Å—àé Ñ„¹áº§¸æÎ«µ L®½öZE-ì:2±L·ÿæqÑ!Æ„ÜG½áC&³fÍB¬C`‹ìNæ‰Ô‹" Õ0•éBÓÚõ-V!¶² ð„@ËÄtÁ”Ð Üq0‡›=®REDÈ.[¶ Ô½øâ‹O;í4CdÝ,f˃{Ú¬Y3Ø”^‡ü?þøãÄÎ¥ ±0% Þ3Î8ã”SNIéf Äô•W^™x{d‡‘#ó7`zê &D@k2%H•MRà3P‡‹åñ¥K—Â=¤wnf2¬ŽÝÐ2uœ.\ˆz Oãq(¡B„^ Jëà½Ë—/O sH/!Å=h,OÓ™#’:˜Ôï.€59±ÖP‘•Ï`ê½Ìê¾ûîC⃤`pëáè%Ö:ÐAÇŠø×ƒàÓO?ýšk®QwõAþnÛ¶m‚ö!^›8”~Wh5[(òR©xJÓ¸sçÎN¤æUNU &­›ùó"‘Á3d¶œ¸ÅNu"¹,q"lAxxŽðE©»ýöÛù5¬€ˆ}QÖÛzYaÄÏÓ§OŸÒÂOÚhz–,Yƒ&÷éc¶(f:uâH Xwœ FäæTgÅ‘ÐÏ]ºt1xªÀ s¸<ÓA”Xœ½€-ΘF¼³–DàÐa’`¾¥ü°(X^«Y-=*–I}$SËçvÒS³®ïÝ"'Õ1ƒA]YcD(ßlذAÓ‘­ ‹¯QãªwMuå8Ã^EØ/ÚöëŸ€í¦‚Â»à·¬¹TšK. 71 -›¢,m­d‡[:a ¸4Û§n=LCñ ƒ=â6dG,ë—Àcr3Äpñ2âjŠâÁhXI†)J¼(áða&ú1ÎÓO?]v‡a¡k±)¡ˆz¦#b s’¢±Ã„m  ÞyorW1ÿc{Öêµ@™‰EEÂwÞY&õ@;pvP™†– ‚uöû€ÉÍxoôC5ü'žx"’×.ÙSnáÐÄ–3¸o¦Ê³ö¿`2N ééñgb“_Þn»sÌ'’…i°pc=QW–ˆø` { e³.¨vÁÛstè¯É4dê¥LîgḜ¡«³b€Z·ƒ Ö“‚Øme¨ÒûÄ‹\9bKñ/`7”)B–)‹aDæ]jøvsZ}–yê~ôøè… lL~¦9Z²é9#ÇqÄvÃyRJW…*‰ÁEA`OR,˜í»^ÏáÿšÕfwò”h]GàÀ³H±”ÉÈQm^—ñØŒ¯é))âÕåø,·Ôp‹{ßÓŸxA!±Æßn^Ë1Û´1kâWyk÷3 †ÒÆ·fiy„aI4&líîË/¿Ü’ÔMëf­†ä:ûì³ ®€E£À·kךí±ìÕ7 «3Ëä8º’”WÞi çÒÿ摇¡ªiÙÀBq+íý—, v Œ‚ˆ´‘Å3fÌ’Š´…7ˆdoä6cxȤI“Ì4‰ð2ÉÚÛXEìz ¬ÇLš!r$vQæÀ³èNW_}õ9çœÓ»wï!C†ÀÒÑ”PGáè`£8 C‡()¹#¤! -ÿ"ª<²±û‡Mb‘$Ã_P«RÒœ™ÑZº÷[·nJj9Ï$†h-r[’ÄY—õÆÝ U?g¬vHgœº”eäùRŠ66ƒ›í‘”³*§¼ùÒ¢E ôsãIR-€ç¼Òôá“SH‹x€ª: aÌÌŸ·‹„7ÜpèóÐ4jË£å#V«Vð8û®»îЇÄzøÜi ¹¬FÇ["ð|… íQxÒ¹mÛ¶]tt§&ï*‚Ìá3wÜqÇÈm6.·]»J~ÊÁÖxï©§žZ¦'>_·m¸¢…pj ºN±ûï¿_¹²•.ÜqœUŒâTt·7",nÕôs4:Æ/óôm"—.ùjy4lbWÄ ê"£uìØÑðËZCYTçÃ&àWrc…Ry0T+ ÒVd]&Mà‘€´)^f€ŠÆÜá”!(H´£>~oaªežQ¥Aaäå3ÈŒivÕUW•*öÑÍ7ß ëÛ·$ñ²hI%8ao„l¸‹ äHµÿºÏ—Im¥rX²wÅ¢˜ÆO²ÜJÑB7Å5ÃÂ"xħ¹3Þ'¥³ÞH[hÕªkB})•íÏXbËÞúœL™±‹–ëŠÀF#L.cU)Ãhì³3}HPáÏ»wïFò”®»î:é+­r“P`ÚcYç@¢^X`íòI´ý?Ö¯Än•Xͬ©5´SÔ- ‡·»víZ)}£^ä´Õ¬’Àh” ËÔu)eÉHå´Â$µÔø)£î¬3Oã$ë9ȽYøÿT¿Ê ò|SÈ—ÕÕ[´‘ ,÷6]Rº¤~Õó! “Óh“Xˆá~>•.I9¬8Í6òŒ8…`¥ð~²>S¿zŽqÙ,q[Õ"B_}ƒû]šñr¥_”ÊW”RÕÐwC•4ŽÊhœ²HâeNnY¢¹ÖÐê%ä Ð>ùäF·ÓYXϧX¶Nã*uH7¥ÔvlÀFÇJYN¬ì,6ù5v\U ›¨›iç'íÄã?^Å2'>Måî@I8p`«V­UrÅW þaÅÎbÚû¦K«D6eµpÿµÙË€èíÛ·çÕØì²AØ‹®?`c13ÅAPQÌø³ˆÝ÷ì §>i‰ýùð¨þð‡£FÊŽh}—Ò¶gÏž ØcNH!dð™÷f/°¾d;ݬY³C=þgc&;wî,+rC³gÏfj‡rH§N PƒÕÝ¡@ ï1},š9sæ=÷Ü#(˜*#ëc ë@Ïdz2^þÉų²YPL{üñÇMZ46Xg…PòõµÆ}Ǹ2]Ë2kì¦ÌJ„aài¨[5¼Râ§(H<²nÝ:y‘Ëbm¾£J¼|ùòÄÔ±#@´ÄÄøéO Jj2rRÿ$ŸæzôÑGp“*±ŒNª_&Là]ü[™L@‹SÅÄNÑi&ÉVzŠ$@ln’'ŸÍ)3líE•fäÈ‘ 1xˬ”Ó§Oš"~ewÖ41b„©”ªÉya CëNq3„ «d£õ°!²};‘±"¬×.™zoä-&9ªŠÏÉ“'oÚ´éÌ3ÏÄX†âD!pÆ`3ÆqVzÚ!+qñöíÛ·+P@`Æd»Y5Æ Fž`Â@M«W¯ž5kVYyÏüðÊ’Ÿ×/ßbøŸ‡Ìäúë¯ÇÀ‡ã¡N÷ë×ຘE²M–ÃÚ1--£OûÉ'Ÿ4è8¯\¹’_½™WO›6 =³{÷î_|1Ë·˜ÙŒ`‡‘‡‘¿|I‘ ˆÂ:el"܃™Û3hÀ€·ÜrKTqãH÷‡.mëäÒÜ÷à `> D¥‡N#µ÷Á7®Xú£¢Q—Ť/€e¥E¬5Üd›R¢Šè1qâDãçaw»víB¦ ¿ø ÞBMÏ>ûléôÄÙ9 2D–nô,¼è3 ŽÅúÓŠ—Ïð=›Ž„’(؋ѣGg-Xv°šèpxìtE?ÈcÈT>@ÅêK¬qÞ¼y÷Þ{¯=ˆ•¹sçÂU6Ð$nîí6N†i^ÐOº ÈÏ‹•ÄŽóx™FŸ>}d\ÀÁ£Ü@ó8ÏÆÓPØ¥ëL(Ýzë­ÊD¦@¦qéÈ}öN¯ÃB/üEp«²zݺuk`\ÜÉãš]îò•W^i¥}æ zCS†6ÉçÇŽ›ãZSbÓ£@;,Vï{õêeî‰.À6v/b З€¼KŸ†èqã7&c˜ ¨÷ê=ã_]|\¬æ©oÇFo¨ÈG‘¹i„Äv´lÙÒyE*P<ØöçU¸Mçž{.¯P:ûǶZ ¦qÛm·ÅU¢ÅeA×/°ŽWÄYÇ. 4H Äs†H+ŒÄSN9E×ÍþˆÐcAE5R1ŸSô,¹lû\Ï*1F–²õ6MÓYž@’ .´¶’è2x°.ë°£%Èo‚’§~q~òèšÐÀŽd/ûº"âsš¯…Ë{-ø¶Øø-Úpw6ZK«öˆ—ædðÃ?dV¼Ô{# ¤°Kµx–‡ †àFæÂ"ØYö:ªø(!tz÷îútÙe—ñÙ‚`0Kh2g9§Í7¶A”ØùÒÐŽ[xØ1p¿˜šsŠ­„ö~íµ×‚Q¶P´öë*u6VuΜ†4³=ꨣ †±F+,.}BÙ#F¶Ã…•ÕáuòÆœ?ºwØ y/¶aP5Ó"6›ðf–ïþ»Ô]!@fé÷àír!Ö‚°»ð ù^?àJ ŸØeÕÙÔ—³ºiÞˬ`o¾ù¦OgÄÁGqþùç+Cí¦Í³¬Q6˜ºPr¼e:3h†t@s+ƒô ´ÀÖ â–þ pÕÝt ùOõ È ‚±Œ˜܉ïAW^í*@u+äpÉ·ABÏ‘AWÞƒO¢»*Ñ€ŠVÊ!FõB#‚UZ¿.¹!eRÌLô( ! a¬)Q )Ñu16aÝ]»vµ…•«0àÓî¾ûn>{°"o” RýŒ/3ÃÈYl“|Õ~¹ P‡C…Æ*t÷=s¬dTiΣq$ƒÚŸv½%·oÚËÚÉÈå&VröÍ7èâd0UÛЂ”3ósŒ­Ïv³×K—.Õ•aU(SË-“²º•ò°Úæž’#îÑ”Î[ N€rÁ%˜­âöųØ_Éy3fŒK€»4¹­ñWxÆ êÈ ©,-Âës¯À1Vׂ¸Ük~b(x"’—bJ >b40lóæÍ Ðb2(f Ÿ¯€ ZHŸ5ˆ BîÖ­[N3ah™ÈKyPC2µ4ÓŸÑü8ìsdäE(êr&‰ÊŠb¦®b¦œÇ`3€‰Ã7ÌY F$Sð ¶²Ág`ez« g˜(‡5ÇÖ(úQê"¢ù@nˆ t†ùóçCÎà-XjÃƇ{³¡¬è‘GáfØè jy’È6bÈ!÷Ýw`ñ`ò>ø ÚÜÒÆ.ÐH÷¯q1ßvÕäW:Œˆª©#%ꃋ»o~i7‚íׯ<B/H[Ì…ÐìËÞ±ƒ©Gtî¹çº›à]wÝÐü—{³ {$À¸ø`BŒR0lØe )=À s?ȦŸ_!%X#Ë"âhM=ô÷ lówèСn7XS‹T0E‹™Îay;LÍGÙ jñe¾Â÷6n3[¼l g5'àÜ[´hÁ{á6gŸ}¶³â'´w„»î¸"ïåKM{8PQtaïH‡4ÛÕ6ƒ]üË¢”ql {-ƒM.ÉÿX¿àÆ’°ÑtµlƳ0CÆ1ƒ†o´Ë-·X²Ñü ÉjVÄ÷^\¿L´úÀ–/4ཬ-TزdD”ÞÖ<"÷`X>Ã”Ø \4v ÈO¨µØé>ú(k‰æãÒ¸G7K®œA#ÑõM7Ý„~8`À9€^#p’­ß tncæ÷ß?hc÷+;q³niÄK†Mq?0Áö½ù•Y!¿¸ &£uähñÁO/¾ø"<Éë÷–eó33GFØ|ÐJ’  ŸìP 0gJ¬ˆ›O?ýt÷óRø¿@¶],°°G4$)r3\œÏœd' \ž×§,³ß{~Ç—h°Þóԉ ¢?°GˆÄ¢Ó³%Ó)õ ÄÈÜ ÚIgâa¨ RŒÅO÷‹ú›€Jyd(ÑF`|Ž÷•i3þÊá™Ï ";Î^Ê#ÌÇñËt¡¦Ím17ªìô'ßNµŸòÎ}ûÂbSŽfþ;ÿ÷¨CÉä©Cê—¤„äu[ÃñT‡Btì/_‚{0HFªšTö5v/Êo$Érw díS˜ÿ‚º œ°Ñ’Éà<&@AH]ô\ªpüEð+ó'³@2‚Ñ“¬Ú#WÔ¥ µ‹¬wsQlšmYaÌõ²Ríël ’g½‡Ïú,`b$sÿ0«œzCì|‰VÉFˆN­U…Yµe U-á°Gæc³Â$c¢¹IP4"õñÇç-,=_Ç~)Éí}Ö¤ix¢°tLB€²¶H•0†7T¸»f†:y,$nýp8³[ÌÖ'kà‡K4)Ó+Îz•_<ޱ®È®9¦5OØDÍæ¾ûî»à‰7#¾Ý‘ µ´¯ 9 u]ÑbbB›Ÿà„"¶ˆêA€ ‹?;eí,ÀΗeI¦‡2¤à×T㇠à·ñÄÂ*yÜ hÏ£“Zµ{÷nû®]»¶‘«Q’(貆'3A'W¢1íœÔŠFœH ~b£59­BÆTå“%KGŽhÍ%]µ}ä]ì²ú³¾•U fmv™‹„®žI2¾ÌŸX¤ ~ªK ñJÍcŠW€äæ_óW“Û@H[°1šñ" Žá÷9¨MMà&¿<™µŒgNp,{³kL›O]Érú†‚ ½xìnJ2:CL€®é @Þ#èx®R ¹²/‘›пŒãO2çÀÖ§>;Èø 4»€0åEz`"vÕ^RO¦¼Ôj _{܃`L’1AEÞůÌ_–È7|À3 À÷¥jÅìbL¦ÒTB$O T˜3Oëžbž‘DºýÙ–æ8ñ]$ ZÈà¿ýíosJh©v,t•1á3àƒ2™•>Gͦñc•§|ê“aiÝ»wW%cþ샇C²)öš29?ù/PÕm¬Ò5’Q!çfþr?ª©SFcòH¬^]“¡8Ks-õ„+Í>x;oÉ Ü+F"è](uK@£qùMö¥¼Ì½ò FKÍ‚êêÃ`W‰ðL /Ê7NF@ýˆxE¶vìØÑ^Ã^¨ (è ŒÖ¾}{@·sçNæ,^™>“Èßüæ7èÀ‘¨ßÈÖ¼wË–-(31Q·Þxã yì‚ ¬±ƒ®+g@wR—f÷™üÒ¥K“W襦1µ¤¬¾n ‹ª)ƒó!&ÛýÙgŸy²oÄ;`º³9ï0`hðÝ ¥6bù;kAïÚµ C[öÎh N~ì±ÇþýßÿK‹7p’UhÎ[2š5a'èÌ€ãñ|ÐŒQk€p 6,Úæ¦M›’vR‹(C DÇP¿þõ¯1±Á´ýlËY¸p¡8Æ[€ÆÀyˆ ìÃ¥À´Ã±¢‘ l“ T"€<„¹±GS¦LñW¨ eI G§Ú±c8æó^îÉY³e›Œàêái¡ÈNÉ~y ”–Òa°Ð @ŸŸ5k–Dg‡SèÎrÁzØÞ~ûmCL¡¯¤Ûã’=b4ÿU4 OÛÿ½õÖ[Š Âg~å~L øC=¼¦®Èêâ´A—¸öÚkó¯2Qîí[E­&ÅÆ÷Ó*þÓ?ý“)r–´ ±,Ú’8û㑳pÏB©Ðu†Rù,ã<á9A‹›]ºt™>}:| üân¿ýöqãÆñjE¡>0"²&Ü€ï-'h„ü±Q\í"T·nÝj¸²Y‡£GÆxU¿ÆŒë˜:u*À ì\†½ì²Ë¤åøR`Å+V¬€mÂu™ÌÃ? ®2±Áõ‹üË—àïݸq#´ Û‡`möVí˜ÜÆëÀ[ãÁÿuëÖaB²Àùóç#¬ùŒ20—,Y¬ø L˜Ó‹«6&!ŒHnf=·Õ«W{R,þ{æž®ao¾ùf²xØ;~‚oƒ ¿ ktÁ»ÐÊSôÀëx$-e™vJIƒZ, *ƒÄ 5=}¡p!†‚$Yî$Ù¶ƒ×±.è·W¯^|Îsë´ TùðêåPfsÑl‘t€$ÁÒ1€Fú½ ›‚·råJæÃbÙèW_}5ÝX,l.3— ™ª¡Ì—‚'ŒÆ«áÀl7ƒœìï¢E‹ÀIvô[¾|9›‹ª:!8bÍ¥%12”˜ ²Ë–-c¬”_ýuàÀ7|˜¼ôŸÿùŸü®»î²†’gÑô˜Ï–‡¿l7Ó{à|ËÈ‘#“äKøáš5kXØÀ…R‰-²²áÇCSÌpñvðÍÙä#07–+fq‹3ÃHçÍ›g—XðY›‚y¢§yƶä ]ˆ}dk1™ÛüúÅ„=ò›W¿˜C•Œ,éq* óa'NdÖ…e;e¬‹Ç'OžÌë,\ „y»…tX‚£eG@B¨2Å^xŠ‘w@€ÍEsD/; }“|¶ƒ-¯ŽìaX,ŒY\ÖŸl*EºŒ!÷˜²±weü- åñhšÎóPc/”·Ù¥éa‡äâA`‡Ñ͇£ Ö:ãhDƒ$YÑ ÔŒ÷5OxP椬;8ÀcPèê4̵Ò×¾tà'ÈÓáobcé•-So`é—ñCêÔň;v,8Ö˜ÒdƒV:–IaŒc OÕ›ô'Š-áÿ ë»lWŠPÛI ‚ô%ô¼>Én)vQæع ÌgËÔM4ø:3«@& A ¿LquÅŸ¯†º#ÄËŒæ\ÿ¡~UÊX¸Xï«U…ßÿ}È?f»†Iv3E9ÊýeÀb±JÑ€iC˜â‰3‘ÞÁ¢²ºvMµ,á˜H*nH4¯mª£eg\Œ»`±(Ïr X´1¥e6\¹5ÙFëß¿¿Ö¨ñl|ƒß`ÀÓN;MP§ ÜÿÛp¥º`öJ`bF¡&¡?£î"w2þ£úU.U¸ ü´iÓÔçáÃÀõî žèjCˆÀ¥£¬2[„ P ³_ºÂR4› ‰hÐÏ߯_?Å(r þœªÅ~ø!BZþè£À+Ô~\¿thpÁÉážÉ‡[‰ZÊ&ìóåsÿ!CJùË>ð´ýÝc\“\I+. "•¬ ¾ñJ³oxÙ4ÐÏl¨h'ÉÜ ’¢-ï£q”Ènq Ð¥¤€HÅÖ3mѵÌôHÔì¬3$,º.ZÙ—_~)[RT‘dÓ=‚À‰æK4¬<8ÃB €¹%–2±²„eµpb¹¡âÃÙ¬X(Ni `1ahU: ,XÏ’&y/ãj0ߨÄ+…üÁ"lá² d^­Fm¢™ˆµ†Ž®¥ƒ hË[y æOuGÜïd¢è£ÈÇL&çÂ|TVQìQ3X8 Ó䥬—ÆÊ3ŽaÅBè*»æšk˜ ô:thc #‹Ì]Ò¢ZeP™U"=¦„ñ²ÑFX*3$™e9²¨ º Á"5Øòu×]‡Æk£Ç Ç+É$´¬c} Ëšx0 }ž0+–Üâ4Àúö×;¿T*‹ze¹Âo^p¯k×®¤àbE@¯Ô޼´1‘ž1mÀÀ²6 ¹Ã »ö²­8Èh¶ !`1|.½ôR»V…©Zžš¿¨_|¿}ûö/¾øät@R·¤žaÀËÞ!‚¹Í*L9\K‡YiÔ‚–mzŽ¡}É%—Œ1`û0<æÊŸSßpôª_a­*?éÖ SàHêê¬.d#-UD»Š¤QÆ×(®œÞ}ôц”{È_ôޱŸZe1ÒÔsöœ=7³)БŒÎ^¢b”qàñŽ ¤&ã[CCWX2”ùrf±W]u•u“P´D‰ðC;§$Õ~¾É6¾¥Œõ #ËÌaãÑ3(ÖÛaG¶lÙbŽqài›(&ó¯†áO~òiÁzóÍ7Ã{ÑÙâm°y_ÙNË ˜ .%?Ô3.´ýO?ýô³Ï>{å•W,ê_z$ñ.F1¬ƒ÷ùçŸó7Ôžˆíƒ Òå«„Md…D½Íi[m M]sâ`;x%Ø>=üˆ¤UÚÖxq³'zŽÂ>ú…É1ÆAÙÞ¸q#¯›4i’ÎFÄ0äY;¿[UITœ5kDYâµÇˆS8õœdˆ ÌöAw¨è ,`V,ª, ]Ñê¡S>ä\BGPú€ܯ°bk/Xm†iÛ/1\%ìͶ˜Ãb1mÝÔÂ$x¸ÿ.¦b]µûî»/%G4²Êv$ûV%ÕªJ%Ïzé(Ä5lØ0´½]t JÚéëׯuÌ</^,% O“ÿ´¦²°¬Õ¦„àˆŠ 7)O‡NÑœ ‚ö±ü‚T#3ÁºyfÖ/æ¹víÚO>ù$têÈo¿ývb‡jçÎIÚQ¿äŸ`+zõÕW#©×¬Yã´ÍÔã'3Œ×ÔõZC#×]»v-\¸Ðæ2~‰µ‚©¨QÐ;'žx¢éŠvãJ½tÀˆœ²n<%d(P´ììi/B“‘í¨Â^˜]hÆÖÊ•+ß}÷]…šuY±@ùÞò¦1bG˜ Œ´E×2̇ÆSÐIýŠ¥• ¯ãÙÔ>?˱ AXCû -$ ‡XfÌ"ùjù,”ž7{°F²ð"ah©â$ÓöÞ"âÉÞ|óÍT#a×0^éÉ ÿš˜ ;rýõ×KáÕ›6mVR:ƒ  ëÈU”+å °Z·n¯¶¢%¹¢3FûÀ+@dYZ¾Ádc+±0ù!1è‚¡Ú·o?yòd»•¹¿iô«07´Ðí¹j¥;Ø Jrå¶mÛx¯²{WýJáY›Öi\¨Eó}ü–,ŽmóhDÅ5é3 lId.{ÙǪ,ûxî&ò»é ½½Ÿ߀¸XÛ-Í7…'–Kjw ìYA±VocÔ»wo5=,& í¦Í=”Q؉ÙØ5lÁZ=œå«A}Ãêý/ŒG›§ÇÑi¯R4ؾ Ä?Œî‘ÊºÊæ[œ;)É_æ¯Æ”,O'Ú …"ìÆ‰0eà<ßðþM¹ û~Λ7yÀ9ûè> ^F2ïšx9‚áuË—/ÇŽ3Ô0»@ÉÔ‰}‹Ç.壢ԧb½D9šŒF=}útؠžŒl÷{èT˜Ø¿Œ-=¨p_Ç»lf³ ¾)[Hk/”E~V¯^8pøOé*Ý’}éW´Ä±ªü‡™È­{fG¹äDçEL^¼ l¡ÓÓ ·xÅ“)“ÏÚȼH¸Y3Ù¤$Ð> ¢K0 `’ÊEÖLŽe_ºmc9òÁfpå4RQ‡w1,’3h†*+fç¶[j#3Iv9 æCâÄò¢´}ÔMá–ùˆÌh§rE jć,()áñoƒ0@£høʽs%û[íËZ ¬ã‚#‚®eû›Gèí¯‘c¶LÛ¸—¸’’S–b¼µ¢¿LŠî:ˆ®§ò <ª yò} v!©˜Ðif2‹ïÍ^38ã° ÑŒ}øÝÀ:Z¦®À8šÊC+´^QºÝØ2 פ†Lyü³Ë ÓˆÓ›ñ-—Ê•hÿxÅInmÌ2צÖо4ðUZ*u5E‰òÀ:Œ:ƒ«ÃˆðÆ,¡ ÆÒiÂ:ˆ¹=z”AªØuîÜ®åë4öÍ‹Âà\pAé*D¦£Ø¶ à#¸Û¶m{Æg W – µ2™81âhÕ aw-Ñ8%eIRt1?PŸÕ_“D€ºÎmÊ‚LFf.m-ÊÝ»w›œ0é²³Xrø É«ÑI 6¤3yÁþËΖ÷êUÐ! eAÑš“¢·ÂB÷{cYì`/ëâãR™´›ÏIF–™—ݘÏå—_nv6ŠoT‡$R[3ï¿Q Ôµ{Qêèr§j†/µSöc=f°±ß(^-Â&™ü—ú#¤,ÁÇO–]õ´5r.¥Òˆ#Ð ÷e¿4Š}JÙí[ʾ¥IS—3ó˜cŽÙ±c‡ìÅ2h#©Té_ä—¥¥2û !Üÿý(´@¾r€ÎªU1",òé¬\/ã;+ñY¯4ŽŠËShøVþy”ønNfÃ*陑8 RÇŽ¡V8Êš>´ZCÓ"·›ï¡AH‚Q§+néág™€¬ÆXƒˆ A^mÇ„xìüÈ ‚J~±m1ã³-[kÙLÙŸÂBEyoÊ͉Ø:¨K ÉØR*X`òê6VÉË·2Ž«ÔXK:ßé—‹èô,MÉ76Õ’W¸|cDU‹°P´•ö`NB£z™Yì̶ÎIYZýfJJIÈß>ýªI {¤®îkNºuKVªé–a6ª|N¾Ô²ÜyÖ%Íì i è« ¨ GUâ«<”ƒ ÙfŽ•ƒ-Þ.l¡èœ¥¨ÐÜfûÇGÇú.U>ÛÕU¾ç›z ^4ofE:3SÚ]ÀÙêsù%J{ü‘Šßæ›kÛÙ"•[ú?˜¢F •ø 6jì”tƒØå¿Æb¥_³[“ —ê–ºGnã3:¡oqÇ]Bö=ú°áOå m'aíVóþ¬c`JDðy³5íz¼Ïáp{¼X£•pŒ$ä-ˆˆ°V­Z-Z´¨$Š}àÏ+W®DâL˜0AŒ;v,ƒ[Š6Š]öÆoÀ«:ê(#ù1a,iô Ê¥eØÖVn±¯Q§Mm«ÕÛë0ÿäo2l¯^½,éÀàºï¿ÿ>~ùå—ì–¬ÞŒøß€9ÜÆÌ…®]»¶lÙ2ÕÑÙgŸÝ³gO —Õêí? ŸþyS×1 ˜6KÀâ1&+µîÁ‡XÃqÛ·o3xð`O^¼xqB€ú•ê=ÔÔ©S×­[Çø¡Ü%K–phïZÐpx5ã¸ü[o½5ùƒ¼W¿·Ø•±ÒP„Ý©â6gbVŸ3ȪҴ”-X°@žênذA/¢ d2ªZ܉Ç1Þµ.ù‹ÀÚ¶m[(yýôÓO3aû;ÔÊZb0&¶¹ÞHV¥h€ÛÀàd;ž‡Ù‚*@à ÝÐ U$œd³êÑ«¯¾j£v9¶ªÀÙ¹s'ÏjŒpZ(¸ä)+²Ý]®ørôèÑ—]vÙ©§ž:nÜ8l¾ô´š°Ë<™28‡Ÿ€‰é LE(£µzAc#´ûÍ7ßܼys@ʆÚïÞ¢Óv߃"jeb¨v@É¢Ö*p= Ñgúè£:™ùÆ’ÔòR˜íƒ%ÿì# óíÊ«¹_ž°Gp-kŸÊ£à-z>A!^m¹ÎoA,Q½€ÀË/¿l8œ ûük[g&о÷Þ{ök–Š—-[¦Vo_<è…×éÍ`ΈÉп0¸¥aÌÇ\cÈÍ®£_Ö/£³ø’ge¼,–¥!Ñà ñzYÊ8¿­[·Ëí®1èü|cãŒYÙX9–ˆÍéJ¿"ØæŒÚ0(þeÅ`‚·i@¥I=ô¥Xò€ Ä^ðÓ/ë—¬’Áaððćc›³dWt2²¶ž¦Ðçl¡?î—쮨‘bï9fÅÛY/xhõ€f‰Zhð‡Ï -–ܸ†`—UGŽe)œD‰–YEj3[î¤Æ¥@Ì-ª;ó™;w®û¥w\uuª:ëׯg|]Ž"-SµÅÔweuJdÐ.' Ë 3OÞK€NŸ½ÖXcUÖÏ3öÉA©w-[µt/0 ÞÎ ¶&´%ÓäÉ“-©-®bΗz]·nÝÔ”¸”3QŽgÙÞX˜›<“W?ùä“ “ñu {å•W>ðÀÜÉ2‘ÂHÌ>}úL™2eâĉsæÌ™4iÒËŠøÛºukn¸÷Þ{¡h‘2 Kqß®]»4ø»¿û;1ßjÓíñJ¸&|ØÆÇê®`‚Í |Z‚îÃÅ.\qÅ0yTe”@­ .¸@ªLfž€€aJŒl±FÛ¤ç9šõèøÞ{øl.¨ÅgiÇnÈz¹†ʳɋa$r€Î¬þ÷ú•S /D h¨ƒ!bÊÓò„Ž›í²>?ûì³Vcȱ`¨L'Œ O25Î?ÿ|^äµ\$ ûÕµx ôe83I쟱"zéÍñyŽ5 h›)¯r›¾±Ip&eMZ&ÏêJG“<Ê‹øv$puàÒäG áqS†UN¢é-±¦ºé°ŸÅ9ú裯¹æ)iÙ :tH {O ®û¿êìÅV**±pcpÏ`Õ->Tyýõ×cž 3Zj_ÃMs†HÕúŒÛ‘]8ßÃ%ÐQO;í´ÈwùC,%—0+P’û÷ïŸH6Fã¥À¹ì §DôÃ^,9¨æ †°­wÞy§ Î6²WD“S%¾ÝPTÁT*cLël¥óa4Ä™L2áýºG<ÒK“ ÒàŒÒ0!ÙýDQæŠSKLÈ ‚'ì]ðÊ~÷¬nĈhø¦aÏV¼nh¶zõjLNĬoß¾à-"¸¬£•ZIp!Q‘-¹É¯gu–%¡Øe‡µÛ£Äã¹-ZèyJî8S²tž¡×숥Œ•†ž£íï`iVª¯‘[º‘¶`ˆ JöQkÆZó“uõêÕ«{÷îýë×È‘#Õ{K‘åkÀ"L›Ôm|±)•áò”S&¬{øÔaûEГb³Õ“ù ¡ZNFã.=8B€q5hŠÆ¦ÃAw. OS¼rb¥/Ñ€@ï·Š¦7t¤tzK¼ø¾è3M@]ùÂß27*~éM5žÄðÔJaÃð¢dêç—ì—9?Jk9§¤?Áuå 6 t„°äiî6†QàÄL±lìd6x¦t¶Þc_ZF³Éxe!eu28ÇP4>$±B[>mG XÀU°õH¥„ªÓNú|šš™º•j$zì˃3&ÏÛЋ…"|d}îxée-Oß 2±÷¥Ç£µ†B£ö(¼Øñø:ìSÝ@¤ò,8Žz£ÈŒKq2ê|Ž +‹-xô\ÉÔ³»“#ƒ$C» K)û’.<~µ )2= žb&'wÉ(G׎RmP.jðÀ;uê„B8fÌ,;È¡K—.%ß¶º¸ ð¬U•Plº1lØ0/¶*ø‰i€RÔ¶m[‹ðëM7ÝÔ³gOŒ Œ¦Ý»wïáÇ# óg(32š9ˆ‹È(ÃÌÜŒsä±d›û èF#èï¿ÿþüàèKh¹êüU’"5»€­!eØ /ݼy³8_E{´ÊnžÇEu¹ï¾ûlKd…Ë/¿¼B¿ìi;Š_Î|ÙdŠ/â›0ÉU«V¡å¦î(¶;EùY KOêZ½áŽi­XC +v–|œ‡±€½h†<‹:Äœy/7€0=ö#—¶èˆ n»ë®»PV.\«yàvìØÁ¢`ÂÜŒ’6±~¡»òL€Ÿ~øa0`䌦gMÅtûB}µ7B'1§žz*X§1Ř?²•¦W\ÚhÞ Bª¨ së­™|íž–…M4.دŸþô§ð«{ï½×ìÅ&ì!Î*¬aþÅ_XK3žÙGØ2B >©1¾º´x(þ]yŸ%­Õ‘Û´iƒ2aÂ8"Fgª834°ß »ôËÓê77¹`iÚd ÜQÒ4ßÀ:6È ciA ÝÉXLH„Í&Ü‹ïY¸ÇñÌG³ÜЋþƒ‡1cí»a¯(é-ÝsX¥˜yš‚?0Þ(, äÛåÒ ¥)!FïܹÓcÄBX挪€d‰;—ùhjÁX<È`(ît,Ñì=õL޳ë‡gÒ¬Æ/ê",No6w‚!¨©Œ¯FÍ*’mÁÎZTva/?vSg) g ¬H'+BñÖ_š624«Ìþ¾ôÒKú+„ FÁ…^8þ|‹8:õkVs™~¨ÃÄ0]í ¦mÿDünݺ5è­n9jÔ((•21$)«ã=èNééª>( z¸X;Ù¥vO±)Ø8èÃaªŒ€ÑtóÍ7cÁµoßþÜsÏ=ãŒ3Âmtø³Ÿý *ƒ·c³XÞX Ø>‹BÄ„´»î#Ïñ£vFsÈ‘A©ÛÛP »Ó 'j‰ .-FYý ôÌ4ù%Ãa™¼—…Ç%h5OcFK¡ ÐB ÊŒ1?ݺuãu°J("<-ˆ„ýÂN!ã»`&|.ë¯F«±×ŒÚHã¨Zó÷õTdž…Ty0²Þ‘2“Dá–5Kï±»o4…ùzä*Gå(î—ýÕìMZSƒö0ïƒÞígb¼5¥ÞÚÿV¿¼Ÿ/¨e›Â¨ æKÚì{ À”ôäfLZ©ÓKeûÔá+!è# 8¡Nªgê@Ì^ðÁ †59%ÞQ†Jµ> Iê·Wú m%G0œ/áÜü["«05I1]VLBâ°B F$É Þ”½Ò.åDÏu©bn xÍP.­u²下ͯß^‡v…gV²œƒ2Î*R›z¾À7@Û|aëöY»Ï²ç™pBµ3lÌ.Ä.6,ÊêìÙ³ãÆƒ''ëªì?¹úê«õšþ{¹x*ãØ&¦|ü¸ã޳’¼ÅÃÓÐGùÒ¹sgØ2Æ…Ÿ1cW¯^&ƒhÓ{¹_ÓLÊì'ã &ˆ5!»^´h‘Þu‘_ ÝIo¡ÚW™ ûí/ Ê(ñУقìˆ À±kÒš'm;ØŽ¸ Ñ‚øëÏbŒ<åyŠöx¨5~ß%Ÿ¤ƒ ­S:gÀ^Sze¶†éÆ·©5$J‹Ï’’;Ü£C‡·Ür <''ãEÅÈRw­Õ[o°Ày󿥬V9_òjƒ¢õ§½óÎ;ê`ì£õ«cÇŽ¦‘BD‰ˆ³.´FœãÀë*éB~o,"ò®¬Aáå‘_É%˜¿±|Ì*f ,âÐú5bÄ^jâaªð%¹I|ƒ¬0èR{J©Q ¬"ú¹œöÿ®_ùlñÛœ”aVC;zšQ^BÃ6(<‚¢à6HÀ=âu(Ãp U\p5-ÚÁ±JôÿšeæQzMVòÅ̇…e¡Iš+ S»ÉÝÉ™¬;««åÖ[oMþQÄqc´2a-î/™•õNYàë׉'ž5å~$܈ Þ›˜´á^»v-x/½ôÒtˆKOôäwëŒ!Ieol"Þþ‹_ü\µnR.î¹ýöÛŸþy4̱iÓ¦õéÓp]qÅ(Ø£GN´Ò_ÂÌvrÅÿæeè,Ðà Ì7oÞ¬ ZÆKð£>ZA¯ÛPó€»ÉÝæ&ÉšVƒpDnbýøÇ?N‡$ÛºfÍš×_½_¿~˜]PG§NfÍš5wî܉'ZÃGBóìÛIê©+ —œSm9*téÂÒ^˯*’šS FîU§VþõuÐEâðv©6î oºt‚ÁRËÈÇChzàK¶_)OjÑ~®ð‡=Ö³µ°l¼ñ¯y¶œ¤ieùÉ(…@ƒSÊ/ú[ž+u9ï÷K£ò' ÕÆå ÊXRøV„BeÊrÇ™žL;¿¦ºZ)RK{- ¹!åfÂæÓæä,žE½\Úk:£T³ŽË‹ü^„41`äNôä”gzQ _a&VÄåK°ëµ×^ƒ£5 6LI ¶iÓ¦l¨OãŒ3Î@'{\wÝu(W'tïðáÃÇŒƒ† ëÃyx/—3ARðºqõËÆ7|X¼x1ʆ¹$ õÐCMŸ>ý‰'ž@LìÞ½›E%³‰µ£3 [ò.ËÔïï"¢å¦3 ½æP¯ sÙÃA‘˜X%j_ÆÀL:U'˜ÖJ“þyF¯ê+ù_~ùå‡v˜.Y„-C€ÞtÓMi†2Œ?~Æ +V¬°pGZˆÚ,^m>Â<€,f×<¹[Z¿’ÔÆþbD››ÌV®[·®}ûöÆs *惽6 "öÜÀ€ÒãÇOè~ž}ŸÆÙÈ/ô¶)Ê¿¢   9 XQ=Æß³Ï>Û]°Ú:‰lÿúÅÂ1$ùט®|0 {aïàK¨ô¥h>ö7DÙD¦qrL²‰–h SE‘Æ^ˆL„On¨_æ¶çsÄ.ZZú†-åP.C×pƒ^x]Nmx@<ôÀ¸páB`Ž}ðÁhÂñ¢[r m™‘À‹Ø çž{®ÌÖ?ï¼óÇÁJŒƒ%ÈîôíÛ7Ù"–™XÐ{`ƒ eâ3°‚/¥Ä@cd¡m‹(@-Ó†Ç~òÉ'À6²-”e² À“ e!à¿ÅQùb‡‘2Iþ&tD½:5è˜zÇw”/½ºE‹áNö:´ü£ú@EoQž²5¬®R4L­"¸§"¦uù²eúïS—V*éå°—D÷îÝ¡ ÈÙꎀ!ôêÕËþnð‡PýÞ|eßæÂÞÄB´–2sC½7x^™‹˜Fg†X€ó¼þúë­"h¯:M0TkkÕš8Ù¥K»iòäÉ|Ð{i7T O“kap=óÌ3~í7×/qOç SŠ*…¾™ª¤þ3dÈ1üª~ù‹”±W:4ÅÛª31íõk²‰Û¡y²J4ÃW˜ª}.ø­#{­Þ¤ .á95 $xù×Ò†ö}T¿ü— K³Ñp³Ñn­fVùÃ&Zë´úe{/>`“Êâš0i=æ…È(}Âáè1=‚Q…à{”™9sæ`q[2×jCˆ«èÛ]»v-K¾—nQ}}tº²mºágÉ”õòOŸÊé^JÆ•5êà 1÷MŸIJûò:”%ƒ“ÕŠ©Ÿæ o˜vìØ¡'Ä÷¥ (K¹“„ øÒóoêÿ/õ+rí±„‰‰-&-&éÒ<ý$åH 0"ðŠ;Õ#¤'Ö «l— }Ì*”Èž¦Æ&Cñ£,€KÝ*x•=¼Ê’ÅžëYÀ‚{ …TUÅO<†­ú¬` gÀ¬(ùj’ƒi¡'QÿV¿’=̓zðrV¸7w%/B1öŒÞc‚ʯ•"LƒíÐÃÀOvdȯXæ# ×лlS… È=ü-{…£´mÛS5L—”}ÇЙ‡ 6a”tïT ˆ/=­µö¨€•qVª¾_CéRVãSž¯ «¤©‚):PhBök86¯3m»¾qö·¼Ð4dź¤Nlý˜ÌÊ8 É¨îdò8ˆqÐAé÷X¤Ôaöxžeð*dv±–^xÁ#uÌÌfÍš!MÊvëׯ—¥h×ëW¬cÞ ªÕXŸG"»¢j”©­ÁK!|ÐÏb}¶Ÿ%¸ßވ'Nœ¨!¯dI åd…¡mŒJ2¡ôu¨rDE¬œ˜œeÕ¨Ï6RÑ!Y óÑSêªa¤•’› Ã!˜˜,×¼r,ãÉÓW(Qo´¢‚“OŸq€|饗L°£ËQ5;s«V­‚±—iþ̹’5 |x"H–µˆ#dËÏ©˜a(—AÝ1Àu­§»wx¦v= ‰á¦W]u•‡ã1IZb*ÌP—°Tw2IKÛÇÓÎY ô±ÇËßiÓ¦e]X|•Êyªûî¢ù¹ºËûëW©Xö0¶<ÿ–¶ÖD4y¡‘ÄTðæ_朰dá~~M!5ãåÜ,¿TLÔº÷Æ|ÖÆF—Kw–‘ofåè“g¨¨µ*f•â$åkŠ¿‚:T³§ŒœS*K*wŒ/#ÀY©ÇsaÔn ØVe¬#7— ¹%‰¢nž‰Y\1“Ô9_úØD¦ÊÎ2ÿÇëjóŒ3víÚeú³D5„GÇm@Õ-¨ eË–'Ÿ|r›6mî¾ûn ¾YøH¥%0±~—õÿKõU”ã{fMž…k=yèc¼wYÚ}¯g, m!ßt`G0Ùþ›_ã¿okéD‹6Aé»a¡\p@¶h­Qïoy¡Ì`±ÅsæÌa¬£Fâ]“'Ož9s&BvÊ”)¨C‹/æ×ý!Ç@ÕeÉ&c”ÏT£¾mÑ×=š|iŠÎ@n~ýõ×Y—áš Ønï¼ó-ZôÆo€À¥dGµûä“ORÍ6p±ñ¿úê+˜IJÇìQ—¶†˜=ÇQjÑ¢…½;ÜŸã¹Z½2¡¦·œjûöíÐ)K–ÌíeÌŠ4 ¡PÊL®ÑÕµh‚$×’%K óÝ’ìq~rmÙ²EQ"†Ãí åU´™ç.À÷¦K3mÍp”:#7U¬²9‡Œ eE…ÆæOØ©ñ3¦ã1¬!úªOLà­·Þb‡Ú¶m›© :œO>3 uiöîˆ#Ž4hÓtñ$ŒÍ™<öØcÀÓB"iW„frã7Z°4a ÀÐCC±˜j¸®|J‘Í2aSz=€Ó85ÎÙq>øàƒ”“ Š@^ùÈÈ ,˜@’åÜ|óÍýû÷‡*3Ãäë± ìõe—]–Ì>OdøÛ½{wÑiãÆf[ƒó›7o6ÃÀ’´Ã¨h‰¥˜ã߲ܙ¬²ŒT,%×ÿ¹—KÇ»Y«&Ë0`¥8Æ_×õgÑ¥=7×É–>¹²/ËH5üD¯"ÎÌòkÚøC㥺´¡ÏÞà&8W¼s&ßɂԑø;qâD¤ÖÁ•W^9kÖ,”4 ìAkÚ¼øâ‹Qr4öåü‹¨Ò¬SÍCw²e³µ àxêZ<Η0"Ë1qYkˆ/ý‰¿Æä_¤ðLõc„‹Ú£}ÏðÌÑn/XñFM¨˜ûa5&šýú׿fbj–wÖägªÜÿqý²ˆ½ª5£é°µŽ+ÿò¥\H¨òjU,¸Ö† ”ªVb·Îƒ¨‚½Ì2="ä'cÿÒ¹éõ«ìŽÇ¢X‘l&¡Ï»¬È–[Ž¿iÓ&ë;™»ÛÑÁk6åÚµkÍ3ò$ú¥—^rÙ&v„iókšL¡iÈs®æÍ›{Úrä‘GŽ?ÖÆÈFí¹úê«aïà¼å”sv©æãyDÚKÅ2JiýÆÞ`¹‹Bz§=DnBv¤±– ®•–[ IÈ\Qž“Žô†ûîù¶GÆ ±hœGÃZJ[LÆR²\Ñö·È`|+i{¸¬¼–Üô:îòå‘™½Û"8b?Ú."zíµ× ˆ:ÍhК@x4ŸZCåLKáŠ,–~í¿îàV‰ñ(/x{|²”(ìZCG ¤C‡Xú“Šÿ–R/§ÇHÚ#»f·¨ìÕW_EWg9‡rzdË_–l4x ”“8õ½2ÇÍ%ïÂF}ï-Æ#î©Ê³ém‰^3(8è ƒN9å>$wÛ‰ÙÀ®¬S½®]»vìòNU¡ì9›Ïú‘yGuÔÙgŸ ͹U™µ·†Ciýìg?óLÜÆ ÿÌvJ|¯!%qÔ˜Rš*¬ ›®Âk¯½¶Y³f­ZµŠƒKUVwA:)°•+V¬@×åft†hÅl«¡AÖ„±ÄtJ aÈ—Øh,5$²¬cΕ\ªZ£Î_!+\Ù4Ó87ÌÆ7ùc}i‰Ëü …—ÌÜ€ Í:áÆâ¶8Ì—j "’—ƒÔÒy<›¶f¸6£EYE$‰å{]ÚÀ€orØ×˜#YÀ¹RCãÛ\2ÂyPØx£{*1ŠE¦7~ÖÈUK£ÈŽT;+§ÅO¾_ºt)ÈÓ@†² Õ)S¦`q[ÜÃ(…ZC74úR_½r9¾¨«c!Þì=žvi€¹­_4ö¸¡w_#¤rÁm€a®ðQî@°ý Ó—ÊýR¢y®šKF¡ìHþxj —ëe!ž÷iË4®ží—! ­”jI<­.O"õaê|ˆ›:Õb-4mû0OcÓ=[‘æÄÇ£¦š´hŒ%¯CŒÆ+…4yî¹çV¯^‰a´ùO<!Ñ–¾?úÑø –ÂÉÐ .ô¸6Þ½{wÔlLN;ËYM ’.µà§ÐhVa}l…ŽAªúµ®“V³wi­eÛzO o;l ´î1÷P·§¡n +ã+ýB0ZCJ~­^‚¿ ÕqLJ®{Ï=÷0+ïäÙ­[·2ÃtúøÍo~ãQ TÙ±cGXV¿~ý{úAý2&!Ÿ?ÿüs´ÖþýûŸqÆëׯw LÏŠ|ÎM료ˆÖêgØnݺFw¨üýßÿ½Ç¯Fyj¼iÓ&7ݦ!67ÉI1ãO›6M]Z2†›¾dÉ’qãÆYõ"ûÖ­[{=Å#?üáÁF~íÕ«×ôéÓwîÜ)'˜Ò9v³xÙ”9áÜi&ÒÈ_|ñ…&g¥ø•å£CP¥ßS¼tòt®\ñ_Eh–̶r”fÊdysÙù¥ßY–÷_….Í^«nùR¶Ì‚ðƪ@øÂâðÇ é·-Þä‰lØCÜ4aí¬Ji7Ñ<Õ'-¬€MýЬËZ`{Òôdƒ?ü0´™°tÒI'), ÀNY~Ç·ê:äϯ€H*€±´iÓÆÄ(¾\_¿<¡–Õ\qŵ†º"ùWâúä“Oî¼óN×î—'N´ÈF­ÞO°oß¾ž@Y‡ç–[nùòË/L†™ ãÔ^Ø–?uêTÞ›Ž$7ß|³\|à_µGTvÔ/OÊø’‘awÑôàKVøQJ>õÔS C6¤E•X~ݼys|ª8°è«¯¾r½|à_KƒzL[ö.çA²¤ ïzñÅ Ô„‡µ–­ýÌv‰õ×Õ_]«×d#xÖ2ãh§¬MUDe„Gê—[o©XÄ–j@ ˜ipÏ®]»<Ðûí·*iŒƒqÈÞÏ&¢+@­²ÈFØ“ýöÛo?ýôÓá½&%¡$ !Ë–“WrÚi§ÝqǼhÒ¤I­ZµÒó FÝpà |@RÐ5†¤ M×Ðó´=HUÑT-lh¥©ZCê¥ôîÁ´N²ýÐÕÏ=€¶Ëv8³ÒMJ´Æ¯=Á+^Á¹{Ë=´§Û¿üË¿°§LÏ£ÿ’‹ðÚÅÉòtÀXÐÿT¿RtBg©Ìá;óQ#pa –%©í©Ö>_lˆù'^ºY³f  ÌÊã ®U«VÀ2 «I,ªdå—;wæuè!ÞŠ·¹)Ù)ù-4et¥e=Ôñ¬ð Û Øßþö·PZè\pðÁ?} õU-ÈÜm#JMÀŽòŒ£VÔij¿1Ï:‘âC€œ  ES’|¢A‰¦L–§Þ2IQ4§Ÿe¨¼\1Ñæ‰©Ö[î)¼áµ•>P r‹…hTü0!oÈýkâå§TÛ«5ÔðT5ÂÜ£ÁÖðÙŠ…Ï?ÿ¼‡­%'qª:dJê–—¾ñÆlC•O•)Æ&bà yW ÏM+ TÏô&UP6¨ÒRÒš+-Ûóå°Fy—œ ùóçŸp Æ1s>þøã-L”ÂqwÝu×èÑ£µSâÕQ›M0—&¾Uâ«“[ÔZÊéïÆ|Ó,]OV‰LÑZÄzJìÖ2°JO‘¾Ž½Ñ¯Bùÿ+®ƒu4÷¥D Ï)¾^;Õd [û÷{]:¡Dé²páÂ²Š‘1lÆù€fð“²èî~½¦L™‚šKYßAØZ½·òðáÃgÍš@L÷ÝwK†<¸¬çS¹rŽfIŸZ£²rå¿r99^i*ô-”“>S<,h‹R¡£§·| Œ¥òÞ„æÕ¥Äa+íÁZÚËYc2ø$Å„7&7+ScEQRضRƒ½7ÞED§±.åBì5Yk¨è^ ¯ˆo!Æ*&`qÁS+®øÛ¤Uת5t—PDš”aÓsë“„Q$ÔÜ(Í|æ©3$¯@!tÂü„^}d,¨fûôéƒ2°uëÖŸÕ¯«¯¾ºW¯^&LX¼x1æAÙÛîûë¯å-að«yóæéÎmÂÁAé O‘?üðävëÖM6’žÑMx¥Ú¹ÎOñì~›r‘ž%}pÆÞ_¹re×®]±&“~ýúÝÿý/¼ð‚v´ÑwÎ3gÎLÄKÀxG ¨ŽÂô”Z•kÉ’%V\°`ÁæÍ›?úè#õyC¬Q³súÇÀúÞ½{·`‘í¨«ÍBø‰¶å>«DŇvKÖä CcZ™¶Ã4øFc€¿÷Þ{>kˆ üÍx•|kjsØù·ÔüœÖH-x2³ÂTñ]||Ï;ï»"ø|õÕWk×®5P&ÌŠÒ•›wíÚ5}úôHUÞË=²z É ¼Ñªž_|±ë¬zÑ¢Ev±*9Yß_Õ—º4¬R1] ±Øê´Ú‚¡Øhsçεÿ;T¦½lÙ²ï ]æ§‚è.{íµ×FŽ™$i‰mÚ´ 6áNÃȬY³F>ƒ:„²¤?_Šæ_u$wðú•áÛ0·yscð“x¿Êf¬Û·o7|ŽÇÿáþIjì• ÷ðDÉ g8^¢æYÞMžf;Z¾Iò ]à6ÜÀL˜_2#Çn©·Ù¶nzÔÞ·mÛ¶cÇ»²ê€Zµj•þF0QÎ3V«7³ü$$þ‡úe¬8På3š6¬Ï#HdCÕâåË´iÓŒ%Ð# 'D€Úw8¬X±Âln §8&`jø§›×œ9sÌ0ü)P–{zä‘GÜ\|ž}öÙäõ‹žê,„Ý·ï*óa»áÿ†Ú±‰?nܸþâ–›.ôkÚýÙuitO.ç<}ØÃtþE”Q˜ˆÄ—eÓ[{Œz¾`Ÿ&x8|ÌÉóÅ¿:Rà?¦iëÇfLþUV¯æ_¾L5 îñ¨Î2)ÆßÆ)бÆÒÿ¨£ŽBç4¢Æ¾3pWDÀÂÌñaª˜3VøA<±)HIcQìRž˜ 4 Æ‚ÇÔxKAÏO¼ËÖ½^putéÒ`Œ¥Ÿ'uZ$¹þúë>ø`h¤yóæµzÖ¶mÛ¶lÙrèС>øàúõë-UŠØBùI Û÷×ß’. ¿b‹-ä¿ßþ(=W^pËÈ£LB§'žxâe—]†º!è[C%øÛÖ¥Ë EwbùpÂ¥K—véÒåØc=ðÀÏ<óÌaÆ¡2¥oô¨.J”9$Û"a¦u¼Q¿òo¹õeð’r Zß°D]¯*u°2åš·(u3øsboLöƒGf0ÉDb(GJÔÒPr¥Bʤ”)„eµ«š Y+ 6>gç)½ßijæÒŒ„Ï™]æ_ÆÇ2fÙ*E=¶d€ÆÒ§|œîb&ã»,X`ý[³-f̘aüêt|Ë@fjFN3S\%Á]>ÔÖ8 ϱcÇÞsÏ=W]u†Ê3rÖ¨cî,{¯4V’çòýõ½.]êÒŒ goáÌ–Ÿ'wîÜùöÛovØaÇwœç/ºX›\ƒÍÑëB}ýséÒ*ù¢†Ëa´Îš5«gÏžè~Ö#å{ÔNyHNÀ­ÈQ‰ŒÊå¿9ð’™~Þyç¡X¢^Ο?_o€o1”HŽpTJÁäóVø¦‘‚i¥ (ÿ•ž _eg-%‹Ë^Q©h8#ð.^'‰í´Œ@®5´ârË6d¬)`ò‹ßÀ Ë‚lÓ§OOpˆ(í¿ ÆpQÙwí˜\®}ûö£Gö¶‰õY6Â*C–.±©+Š'ŽK¿MN­\˜C–ùRž5Ä17øež·ÛËÏ£³³±nN9å”0ó2mê{öõ·­KsÁ'5 UœÀ«&ìÓÝX@nÞ;fÌc–.¼ðÂ#Ž8"¬F÷¬É“º´tôI \fa7ˆ}×®]ï¿ÿ¾ÎåË—{Εxl3_VñÛú•ÁåEyEBÓå“fö…ÆÍêªð«è{27Cל[™û©£Ã–¥Úi\«ù†y‘ܸ,Åþ©2éé¤yˆº „IRÝk -§md¸!pø¨ h³2Æ´²ýøãMµN„˜Í>JÍÙq<Â3âB#ëu×,Š’Y¥JR@W¦;1o.@ýI×SYW?z‘® ž˜‹1~üø¤l{üñÖ5:묳zôèQF»Õ…W8¿š¼äÌDøž~¯K—×ìÙ³õú/V[‹-ÒÊ£j»]4m|x9TØEÿþýÿŒ1¥Z ²V¼ á³Ï>»à‚ ®»î:c›½`×¶Á2dÛvܸqº42ùRnðË_þrÔ¨QpªgŸ}6A5¨.™/^\¹]|ñÅüµ[·nò’<"{ÇŽêŠÞ0qâDC‘eÎü¶ c1C`Μ9²)À»iÓ&þMÃq¸ÙÂ… ³FæƒýnãWÔ¹L»3pøðጠ߳ûª…äÌ|¹aÃÞÎÂíáÕ®]; 4 ÊKaJú"3‰#½V¯öéT䤓Nb!ˆKDƒËùÁd›¾µnÝš@¹õ|ÖšT3gÎÔE£ ظqã‹/¾hü ƒX»ÖP •9£Šî˦1+oË–-µz Øò±Ç{òÉ'·jÕêÆo4à›Ô9‰j®˜6)daË¡ïÙÚߌ.ýÁ$-¾öÇñ¤-Ó6·Ž ËîÔSO7óÿÈ#„íü­êÒ–•+„ÚK„±¿øÅ/l Û¡C‡Ä«®]»j˜ •-¬_ž‚’‡Á.<íìÉ¿Q´`\+V¬°±‚ :Äþꫯ¢›ÅÝ w‚K˜˜©¸þúëåº0ÑsÏ=gЈp›4i’6¸%Oûôéc÷fná8Ĭ”¥¥²Ð¯~õ+Ï#^ÑÊ»çŸCÛL‹€Ó­›3‡éY`Š4’D­U8³d“ÜulÞ¼Ù C+B¬]»6þ³àýUËnõêÕžÉz}ôÑGË–-ӃͰHFå» ƒ,Ѓ£JPw§Nj,:ð_¹r%¿ ´èuëÖYÑN4@`½þúëøÃÞ}÷Ý À¢Ù5Ø8¢(6ؘ% »I‘±{÷nû[‚U«Gø‘* š¿ñø^—ÞÛÕ·oßèÒ0>·lÙR› >á„@BÌ7 Û&´ÅþÒtiM{m|‹«ö¨Ùúj5»m æ£[ÃzbÜœüÝ¿«ùìOÐ/LÆ´24=cÔ¨íÂã…FMÍÜÔrÑW-ÚïOø’‘ºe‚Ly%Ù¼±.&ƒ¥±_úì ëîÀöu†)mÔ´[ÌñÌS©Þ0 83/…™kšuîÜyÛ¶mÑ9]އy‘lY®žÞ(êŸld&ÿ¦Äh­žŽÝÆãβ™ÅfÖ|Jo1N‰jøèض wÌÃ?€lºýöÛ{õê5räHômãad³Ó¦MSd?òÈ##Ï‘õcØàÏóJ üî-7êûë¯Q—FùÎý*§<Ò2<f’ÁpQ =;YÿMêÒæú5–ƒ¦Î¥ª›Ñ€¨mÛ¶[@œéµ“ˆÍï0L×âÉP«½ê ™È¿ÖüÿÙ{ï(©ªmíû YrP$'Á@TŽ(¢((ŠQQ%K’%#‰’“D‰"9#95QrÃw®çó=ß¹÷½õýF=£çØVS}šÚÕÍšô¨®Úµkížù̹æš,U,±fHÒ¿Ü5Â(K¤ãݳ*¨ªØ¨¯(¿…¾(TÀTÊ—ä9‘BQJE¯mžNQÐÚ%Ô§"®Œ÷ÖõS¸¸R'éþ¶¯ªä0`h¢‚(¬v­•büª=üº4‘~T9ÃÍQU¥Ô9ǯuÜ>¤l_UªG71+F”'v„}dþç{‚h[fÕ&ü*diÛøò[ÚøPnF%¸Ö t踴WfΜ©Œ.kÖ¬A)@e¡vƒ>zô(TM•§¾úê+U½IðëÑ㡬žöCòrè<µ7GË–-•FOeì€eßµR¶s§œ¥ö¯ºÎPÛ»å„-ÃMÌ`Ép”Y¬P6!›•i=³Å x° uWˆkW° ÑE'6hÐÀHäPbçÌ™3wîÜÜD@§öÓ{Š-ç/ãEwñ\½|ù²~EyWŒ 6 LfPпEŠáoÖ¬YË–-+/·Šò„ÔEåVVtòñÇÄÕWeíºJ­(…¾sn$%. ‘Ž'º2aE;P˜œúé×_Ù¸páB^CžlLö¤I“’*—UŽG‰¸ mÛ¶…eeË–íý÷ß÷Ôû÷ï×eÊÉ¿feó+ª™b5Nž<¹sçN:œûƒ¢ ª¼ÖÊ î1tª‘w˜«V­’Òäž ñÊ•+-?¥KRbvB}×Ü:‰rªÂ‘2! ó•aLÎo:Ùõ´S¹€h¹ ÞEƒ€ÉÞl®á2~bãÆ›7oÖsÉñ¢Z¨ˆâ@ÐeFæ2G«h’,èªóCwòf Æé )5) >™±Ò’Š“ä¹ôø‡2„‰Ê¦IÜvþüù=zô@#ÀŠá-Ê”Èü/]ºôǼaÃ#¦UÕç2jø[§N-9 •0ßšèK1'‰”K3Õ+W®Ìtbú-Z´HY阖cÇŽ}å•WY4{öl­ÇçÑsöÐëô()¥¼h§¥?bÙŽ5JéÎ À~ø¡0MÅxêêrÊ}¡ DËI•KC·öîÝ«ñ+»sö¾òä³4š6mª=D ˆe›)S¦ôéÓÃ%2gά‚³×"Ï¥•ÌA.…+‹&)¥R.¨ª=&âtüøñ–-[jç(cÆŒ£G†ëBYÝÞŒšüË›²vÌõAQöÞäwìØ!ŽždTÒ~ù·§OŸÎLPZK&¬(²<Þ ­žié"åÇ۹ܓúYÔü\Óø– mp+G®Þúøº€@îxGÌò$£>±¹â·mÛ†V²|Å`,´@ŒïB†ù!;ÉÂ=y(y›y"Ú€ ‡™t jÓ«Íü¨·„‹§M›fòÈ#Ú•£í\!±h§RG;5»7n ÷`ÖeÏž½GôäêÕ«¥#7‹yVùrË+®q\·n¿^ @dÉ’)C»úÁüÒ–ÝÅápÒãÒ˜Ÿ0éÙsAIˆ9¸júÝV:ì¸îÕ«“vâĉ%K–T{þþ÷¿Ï;÷Îô¶¿Ÿ~ú)º‰¿r«F[yJÛ› ór”/_>W®\íÚµ‹[.ÁzŒþ´ÂUÞ *<-T]µP[ŒTÜÞVÑj/Ð2v‚0Üù`P˜Ç›üA–r>{óñ€Þ dðMžm9ó•pFÑq|W)”¿Ç þUУԴã Þi-sL;ŒŠ¾F³@}­Ô)Ô]u¡¹Ìæ­bZÄóù‹¢¡U|ªXhúМ?b,Š—"›9sæ{ï½ìgÊ”©fÍšôä­ÅVIÑWM›6­[·®pû“O>Ù±c‡ZîMŸùN¢ŸKëŒs¾uëÖ:t°Š«!Wg.n ï–Á&¡¸´£EM?ýôÓ‰…Kb˲Þ;wî\¸pá2eÊtìØQ^)d Ä9‡bZXgX”ó_çMìÅÚâ¨Q–TA“ó2ÅáÕ^6‘¦?¡ØP¾s,{×/ý[ÑTÑ<ïêþ¢Á:Û"¤õ¦iòv‹Îè© íã†J­i`U uñðáà ( ï‚ÕíÚµS9UæåA’6Q,…L+4ñ¥—^RDô°aÃÐh(ï³{_ÇC¥4vj94¦Q£FÚA6·v•Ãá6ñÊNd+VaØo¿ývÚ´i¿øâ ã!ê^GíD#à —Ó´ñGg€^·*¯uô>K–,p6T¤Ö¦3•~ÌQ*Å-bƒFÔÕ4î,†é[ÖÆ £áÐa@‘U±z5@Iùøn8.­èbÁ©’µ*³9ŠÕó¢Ù¢Áò ß49U™å¦\Z-¤=ú]^X*ie@Õ¡xö–ñÈÝ” J0è­¨"çÁ;Ÿê)4=h°ö^UóE1'êUM~u4^1y¼n|]k,na¾Y¼ÔÐøñãuÒÜ”ž°Õ4œ$%.­¤mš?Ù²e˘1£`9þäB6¯t@;ë ^”"X˜Ì¯Ô®];±pieZ“kHñWÛ¶mûüóÏï¹çžâÅ‹—,YRýZþÏn;v ~eÉyËägV’=þŠ¢+ɆbÌ„<òi¨Bëºuë„ÕJשdG✼à_¯Õ[ÿ]¨=bÏ/񻏡 - ç—f·lÙ¢(;}Ñê)ë°‰²j˜ W¡ã ¡"Bu±Ž6´ÔôЖ¨òçb³ü‚Ñιr岌‚iÒ¤2dÈwß}§íu)£½{÷ªÓ€ôîÝ»ÛÅcÆŒËjÐæ‹êX©lAüÇä²u µ#ÔÕxõèуŸ(T¨žÝ呾¸ôÉ“'µg¤ù`¥–oÇ/ˆ-X¯×,g,ÁÌ™30À"²,kPÈÞ}Ä$±pie6_„€ 4ÐP¢€nzKtlº•\‡CÆ=n!Ú ÂL†Ѷqõ²¨²¼ÓvCx² Ò (s›ÏÇ4i<1:Ìh·õ¶GJÄ›F‰f+ÙŠÚÑK«,ˆ-Ëîµé,€\ö¦ÎÖïµP1®éÚµkªT©4.k×®…{ƒêò™[íƒÀK"þUsUÍæ3eÊį,[¶ÌÅ«s”oÐaãÒq9€^C¤“%Ký0ë[QOæ…¶+µíuÊ%Ôsi+Çš9Kßzë­ÄÂ¥½®`ñd=… ¦H‘âùçŸ×cª‹Î…B¥ƒÖËe»wï–‘~ðàÁ¡C‡Z®$zc9&&ÆúžOVÞž5jb³Ü3|Íš5Ð ¢ùW“GÍ{ûí·¡v[·n•äÍ7ß´…“c^yÇeåÊ•òfˆ¶lÙòŸa„O›7o. -7ì‚ • 䉄Ã<877nœÁ $ëCímîÛ·/oªsøî¤I“¤AÔ’²eËZñÖ¿ýQø–ÎÕ ±•“jÕªUË—/öÙguÍO<1gÎñ[žÎKt+þ‰tàiî¼ÊN{”4C° ±·* N’6—Výe±hsÞÎ-qS]ÐÇRz÷ÝwsæÌÙºuksœ*±¹ªæ)¸7}I‰K èâ’"zÒ`s;yòämÛ¶•Ûó\^ba¯ 7ès.ƒtÍœ9SœóÅ_4%þs±PUh|ðÁ3fb+³<ýôÓºÕ¢E‹¸›rÙV¸³‡4þøñã‚ =KõêÕ…–`6§ñãǃo"Õ4†Ot§ÙØ©S§pg™?'Nœ@§¨6 /ø—7Ï;§|€¨-~TÛyÚ%K–(¿ëáÇ:Ä#ó&Wªîí„ x,ÕX.–W‡ßE ÁŠõuÞaþðBçÍ¥M¸úbúôéuêÔyøá‡Ó§O_«V-n¥ÞPª”‹R|ÜZÍÑšÐt­W¯ “Ê‘©®=y›gœ$=.íuz°º•OÆríÚ³ýkþÂmŸï==‘°\ZûG–á }‘X¸´\©JXá­©æ âAt¹C‡ P<†Ù&^“„¥ª=;ïÍ /DXð¤wl¿,ó\ojÓY¥º­ˆ }.+Fù6/^OE vûŒ'U–Λ M•-&¸3m ¶ª‹JË[Š»ÆNš·ëu±•8‰û\{÷îA‰+Å(zA.t³t¸óĉ‹+–={v4ã´iÓÔÉ<”*Â(îÑz8äÙÉY!\š{ò‹¼Ù°aCš$»ÆÕ ¿¸44¦¡m;EÑÿ™³«ÿY³æµãž:Ùš'OžºuëBÀzöìÙ¾}ûnݺ 6lðàÁ]»vý裰—™~àçìÙ³!]ŽKœz—¶|°^2c˜?¶víÚ/¿üò²eË,lÐâÁt‚¼uTC¢Ó ½…Hv¥ª[3TÊÖ‚~ÃåÄ@)W6b1{{öì — @® ¹)t±6énšÏô‚탨ªK\b¯•Û{0ðÿÆŠUÒ‘xM¾¨mSQtU¶õƒotéÒ…y~ß}÷½ôÒKÊ}í)o²hEqßÂ|`ì,`UwÀ,ºçž{0‚t0G££ÔÛ9äè$©riæ¿RßTªTI‰pxàlÙ²eÍš5sæÌÌÞtéÒ¥N`L™2¥·òóÃ3Ág” WáRúõþûï'.ö4ïÙŠìõR>:"»6@ÐaÓ§Oëéd¹¬^½Úë&U™W0PdLpj%´€P¨£-¤]ŽCo£”rU1èÒò*øâe³R–^ƒûLš4ÉšÊõGŽùŒ¥°TñPÌí£(;[;™â%ÌFeuLÏBæt$Ç8‰>U]` tß¾}2dÈ‘#GòäÉ!Ò¼ö6ÉRñ³^˜ÏÐéU«VÙ§^³EJAÒ¤pb驽š^Y°`#ž?~óD9IÚ\šiÏlWpl‚pi-ïDåÎü±²ÄäÌ™Sµ„R¤HÁäg `-Z H/[¶ì /¼™~hÕªíéÛ·¯‘Ä>²yóæ¥Q‘#FŒðRA@iûöí¢¯àçÒ¥Ke°èäÅøñã¡dPVƒ¥ƒ[._¾¼hÑ"@^˜Ï;°D”C¬`#¸!àâP xrg,#¾nÉBQ=ëÖ­SÙq´9 ƒF0m­æÌ™ÃÅjLuýúõ:ž=÷&£… œé/G®l#«'N´°FöÛo¿•¾`Bnݺ•ïÒNùL¸ŒÑŪŠ8jÔ(Y[<)?4yòdÔ šKÇy¬\¼{÷î!C†`nܸL†ŸÀ¾øâ ®¹CiEyu¾ §þüóÏUâYîhu~”'=pâ‹í¯ì𙝽öšÂMóäÉso1d.W®ÜðáÃU–TŽkÅNëåQ¿e•ˆ ^âž;wNŒy<¼bGYŒË—/ûí·Õ™ð½5kÖ‚ÁîvíÚe ¶xñbqWAÔ%K–`¿ˆýîß¿åÊ•`¦*r1÷Y¸p¡ÂB¬3È"Þªˆ Æß6mÚ¤‹¹È)µH xP‹Uw€ûÓà¹sçZö‰C‡­]»VÎòôÔÜŠÂöQ+|—/B$h6-a~êV< 0¨ 6ÐÌ"Œ ᨷZÂÉ £³V¬X¡A?qâ÷4w<ÀÏ<óŒÜÑ:™’;wî &(î‚VA$4hˆ­ÛE‡DfŸÂ|\uëÖ…] †4±½Ui4¦nß0ÉpiHì² ˜Uøg"…þ£_ÚöµÅˆxýÎ;ï¨B}ÇŽØ¿´?/ºwï>räÈtéÒ¥}ûö]»v6lìË&;.ýW%&&Æ ß¨ˆr~BùTÛZ#Àà… ÌÏ@‡[ÄE 6„Ï´_ómÿkß¾}Ê'Çæ¤TEc_íÇYM.®õ§,1º³™ÿ ®Ð‘v˜3ͰýAàH¬Und>å§½‚Rsð<ú…;«$îþëÀ‹@*®|Œú9(¨Žêyéʲð;vìà:û£<'6Ÿ¡“&M2ß3 ñèСƒŒ½ì[šAú!aÏq+ÐE àé“3f0Ü­[·ÖxY<|j9I\\Úà"»û‰'žÀŽžF˜Z`r¿~ýxÁÄÖ°}å.°„`·<ß’—ö h€´k×®råÊE‹­W¯ž€.ÜVÓ Š©Ò:‘á-hhAÞü^)Ðg‰8@-îiU]x‡²èdÓ ªÄ¡¢Å&ü¨LôV~äîª( 3ðÇí6ÛšÔ î¯Ð;n®<{bõ 8ñzEtHP-TÆEy³½“Ÿ[Yú\Š‚Uêׯ_«V-¦ 4*1b$V9jÞxã#GŽØ¡ÅˬY³ÐÅU«V•5¡ ;ƒîQv’¨¹4°¼$(Æ¥C"¾nÍif%DåÁ`eÕ¬Y3Y²dÍ›7׎˜ö’”OÚÚ SLi$û!éqiºY¢D å÷^L)­‡wØ#[ÈÁMG_F–¥b3fhçÐå¤ —ÙX BØÐal¸ÉiZÃÛpµ$dgMæÀkÅáÀ- “ª‡è}YFÔÕ9b×áæùæÍ›Ÿ{î9™-Å‹gZ¿% ëC¡ãú—1ݵkW®\¹ *¤d}`Æ€@‚Ƶ:I\ÚÓFžRËÜÿ¯{—¶Î5há'È9Ĥǥ•GÂþ¥åп˜˜˜7ß|SˆQ°`A…0Yó…K+V¬€>:ÃwyGFèyhçÒ¥K Q¯{öì1'/¶mÛfPÆÝ0‚`È¢mÀÂüùóÑqñâEþµ¸^åe:Äżæ[:/§…¨+òßݸq£¼%Úß„+*ÒXGŸä6¬Þ½{·v1˜$4hÚ»w¯æ __´h‘¼òxK§y“'O>xð ¹/6mÚdqàüĘ1c8À=u^Q¿A§Ë•+‡Ö+V¬XæÌ™[·n­„«6 ‘ÁCo x‡kÔ­•mÂ@Øö«á’d¸44ráÂ…Š_ ÄÆ£Þf̰ìY˽ÀìeA½ð 9rä8p wEI†¤Ç¥5ŠRÈ“'Oúôé±Ü½LÔ2B ¸«È0)Üš¿ Ÿ*c³ªõVéìÛo¿eà€D…>|ª æk¿viòÈ‘#(Ë'78xŒˆŠóC\ÉåëX·n’©ÝÐZ~HŠèVù]`\`Ëø•cÇŽñ¯¶u0Š›ó`ìêÕ«¹9·UA.T¤‘Ü–¯ð/×ÈÃ5âœÚTå‡Ö®]+ï½|A,;wò¾Duh?j±^½zùóç‡À¢ ¤jì<øM“ô&¬hgÖô‚Â)itú¡‡Ú¾}»RºDLŽK‡Ù‰ùòåKž<9ÄU„í¦"[X'ª¼Ì0açyÒãÒHe™ìœ8P³fÍtéÒµmÛV]’K9[ò<±3/†Þ"„B` Ó] ’’[)¤ë¸Fçk°U3”trÜ[š'öfÉQCˆ„qT0_÷ÑwÕ*þZî}yËuÈ”7ù–Ù æu±2!s[?!Vo\ea‰Ètb]á£ÕªUóVÍÐ ~ËÎÞQA§G¡èÄA›6m,•Ÿ}štN"Ã¥‘9sæ`¨z—Ìm£ÒGh(ÏÜcyÞ,W®œªä >ܪÞ+¬õŒvgþ >¯l׫kT­àþûïçYèäÛ_ËN’—V×'žxB¤N€n*L$&?Ö(äÄx” í?“’ú®åÒÚ<?•{?äS ¥@ºuë¦Ì:Kâõ£nذaÍš50gF[=ú»ï¾³…]»v­X±‚o>|xÙ²esçÎ]¼x1à¬AY¾|ù¦M›btàîÝ»UpJßö·mÛÆàªÏwîÜ Ó³;ÃñV¯^-Tg¬8ÀïJwëæü%¶Ì=ù!Õ×û÷ïO«äsøæ›o¸˜ føË/¿ä×™Q111ëׯ߱c/¸R±÷<²rk€]¼ÉSˆ] Bg̘ÁÃªÔ ï 6ÌH;]W¼xñlÙ²}þù禡DÝù:1Es§…Á5]ÃwìØQñ´ƒöªª9›æ$z¸4“söìÙ^.}›wV± MoE€íÛ·¿ï¾û@ȸ{”Ç`¥í—¾e£$TJOUiWòy iÙ²åÖ­[½C‡EecÜ)¯ü0ýúõÛ¾};HhwÖ!qà™3gÒT•ù¦I/faàÀ“'Oæ°š§æ_lEG(Woò£4lüøñC‡å‰ÄX˜Ã'NܳgÍæ» w¯^½ÐÓ§Oç×ùn“&M&L˜À;R|üU±-/µð¦ÚNpNkn"¯0vZÔÊ7‹*¼ýåì$‰qi;šÊßW^y¥pá¨øxC&’ŒVÍpå‚3ËÑqéíæÍ™Æ¿@ŠEÉ‚Z°Ê¦’>}úÒ¥Kó¢|ùòª¢3T9r°ÓÅ5kÖd8 £/½ôÿæÈ‘#wîÜ–.EŠZûY²dáœ9sÊ/š9sf4]öìÙÇŽK†*|œ7oÞüùóë»=ôÄÖ½dÉ}åÑG-T¨%Ož¦Z§Nèã#% å4’ ²fÍÚ¼ysk•söÈG™2eâ2þåµf‘2ñ>-Ï!ñN™2e Ü =Ѥ"EŠð»|…>áéŠ- °ÃŸóäÉóÈ#d ÊÃ?¬ú, 6”2 Ù(AËŠ¬–6‰Ìüá‡tòT ‘RjëZµja;˜ãůÊNî—†lÀ´Øµu›wö†Ýš)Êúmݺ5vqIö}.%ÉÖ²mœ)!À“Ó°Ä,w cÄ/[¶, :b¨W.£À+¾ C{ðÁù{ì19/€èR¥J-X°ž¬Ú‹¼ èåÊ•KwæzFÚ´iS¾U°`AîtëS ý©§ž‚fCn¹Z¨Þÿý¼àw›5k àþrC´­â_ ç´Ÿ|òIÞgùiXçMž~úéY³fíÛ·|–޹Œ×`2Zà믿Vuoin®jìà6WBÈ¡ßuëÖE…øÜ™Æóhî߸qc¯›Ú @é/%¬»ý@©ÿ¸xC²¿Ú²êС­åY¾øâ ÌtŽKÇÛ¢Â`ìÞ½»÷ØŸœ~ÿ¯Ú^ k™ùïMy—sém#Å]°l¡vrZ*å…*<ŒJ™¢ƒÞzßX4Ìz ¿´·oß..-ÖªˆM0Š—/_fDÀpñaƒ}ð¯3yhƒ2ÿxì0›4iÂ|ˆ‰‰1r.žÏ_Ú–Í.úm¢º$´GÁ~:Óª_?ÁsÝAÅdÑ‹#0dƒðÊ-#¤†ñ÷üùóÜœîB‰è+|ªzX€öÈ‘#yjsGoÚ´)¤ÿP±œ· /´¨˜U«V¡ª0U°^±STy-Â5œÜi.ýå—_N™2Å*uÞþøjºJ×Ûá‚… Ú®¢Ízqmß(?LH˜–ãÒ·ïQ~!†^úÆox3Û¼UªT‘ E”Ã0P®û@†A0K%è†îß¿ÿ—_~©ZµªxÎ_вzõ꺹ŽI ¢[쀡¢bâžµ a¹*û÷x;§ª“ûZhÊFKoËFø«ÉÉ]Â¥8 ýAU©Ö ñp58dÚ¬æ-±ý,Ý`zŸ>}úèÑ£:òิüH:*hïÐQ¯ z9~üøE‹¡ˆA3˾}û´¢¹»~Ĉ(PˆâÌ™3¤a!pô•xõ† b!ª‚ŸƒÅHYÜ»Nù 6LIMÕ²q¬ÂÄq•²àW{vGŽÔ{#ýÀFMô¾ "X슡Ÿ8qcŸi£àp;µ’'Då ô\Šš³É tÕ=u¨\_Añ©æpÄvºµ$•iVïhV}¢$ÒMm:%ÆZ(µ<¶ J+j8.Íc0À%Hw’¸²s¾)Â.´á¢Úâ¶YéMä²3®¢ ·Ÿ©ØIB‰òœkûÃÊs(¸täÈ‘cÇŽ5꘰‰pý•‹/îÙ³ç•W^áOœ8!gf2cy¡˜“Ï?ÿ¼`Á‚¦›X«W¯>yò¤¦®NºNÅlœaËÚÖÜ·o_Æ BÙ«W/«9þóÏ?ÇÝîüßXqÝè»Ü4lÃ4i—.]Š/>mÚ´hn¿$d:YŒtºgÏžU«V]¼x±æÞM¹tªT©Z¶liÇ\Æ'‰Bhn9C3˜ö:"ôá‡Ê ­$„f¸™æ¹Åº(ìV5©]ßFƒ(I:TQpû÷ï·I“&é2F3ñ3Ñdþª*úÁƒ+Uª”&Mš¶mÛj3TÑVˆxµ¸4 ýì³ÏN˜0aĈÝ»w÷ÝwéC~f5üÄÅx8IV+:Q l˜l¢˜@0þVe¼Ô:±‡x%ñFà3ˆ˜û¬E‹Vû¸V±xI¢6‚h¼77õêÕ««T©rï½÷öêÕ+$$Iùç¡ôIš4iš5kÚC'Ο?¿oß>£\Æ„Wù*7‹œD³„ËÊn;,Ú” Ç\Fþ•WJ¾\%R@ÉB›Qį½öZŠ)zöìÉe¼…5ˆAQ‹'ô"³"ŸùtãÆ+VDõ †.ÆÃIÒl(»¨S—7­Ä¡2áxç3ÿ²´5ù•—‰¿à6Ä#nÍ×ÃQâñ0P‚"*EäÒ¥K—/_î¬Ä{܃Æ{gééÓ§[µj•>}zÙB˜t*–k¸’YÝ¡C‡ 2tíÚU³4±•Á#jù8qbR·n݂ʋۿׯ_?xð üùÈ‘#–y@Α#Gü1îì¡“Ä+pifþÎ;X¾|yÖlÛ¶mÏŸ?ÏGcÆŒQr¼”)SêÌÚßÿþ÷Q£F©ìoÓ¦M…Õ@4tÚ‹²¬]ßú+¨Hó6ÛéQå^µjÕêÕ«C#‰ñûôéÓ©S§6mÚÌœ9SûË/¿`)¤M›¶]»v*"ð¯ý ¸–_Zßâzåkõ•Þ¬:~è=MàÄItZÊ‹/®P¡B–,Y˜Õf8«Ü9Ò¤Iql@~áÂ…¼S±bŹsç‚Ø\Æ$w›‰Ñ ÿþ÷¿CRˆK”¡èã?¾ÿþûG­7£6¿ª6/_¾h­\¹rÞ¼y±àlN~ôÑGL¿æÍ›â—v9ñœ$:Áàõ&CÃ"fµÖ¨QXîÖ­›6¸¿ÿþû äÊ•+UªTõë×ß¶m›.ž:u*¬¬H‘"8sæÌ?üàÝâá…Û÷]°q`ƒ9oeiصk×®[·.ıXž Œ… ¨8µŠ”)Sp÷îÝ`fƒ9sæð~Ïž=åßàÁm6&`í'N¢A~þùç²e˦L™òÍ7ßT2%á¶VúüùóíÊ^½zñN‰%”pI´¥èº1:%á­:}úô‚ Zµj¥¢ØÈçŸnÑÝXòÔé_H²w›êéׯ_Ò¨!îä.æ³Âí,è®ZµjÀòSO=¥a&[¶lÑ Ü#F‚‘x vçÎÓ¤IóØc9ÿs"«Õ‚½d|…Ì–4/:Å{P9¾ÎŸ?aà}ˆf ïÞ½{aѵ ŽK;I2‚ÁX¡Bõã?n±L7nÔJWRb&?3ÿ…^P)[ÚŽK'¬(Þ[2ëø6 Í ¹ !ÏÌœ9s³fÍ Ò;¢â¼nÓ¦ãÒN¯ÈeÇ|fÎÿðà íý÷ß_¶lYY‹XŽ{öìɘ1#tzäÈ‘ö­·ß~›iÿÌ3Ï$Ò3kw9—îÓ§È&§Œ”ÑòzÙÿŒÑé¸»ÒæWïÚµ«Aƒ0j«ç¨Ü§ŽK;I’tK¹.y佃 ¹yóæäA™1c†±W^y…Ë^ýõ .¨ž‹;Õâ¸tâ³v™T†ÆÊõ‡¹üÎ;v1aÂE–*h?»'Ánܸ±ãÒN¯hÚ‹¥üøã­[·öÂ2ŒzûöíiÓ¦åM`Y¼‹÷ëׯ¯#áQgëä¦\ºmÛ¶:t#WmQ3i9W5Q-0ÏBŒøÈÂ<€å9sæÄÄÄØe «v1N’˜ˆfôêÕ+}úô÷ÝwŸ&üÁƒ×®]›!(VÞ”5^¶lY.cÚ_ºté‡~`É߸qÃxq\:ADy9T1kΊÌ"L6Ú|íÚµõë×+9¶ª' ±yÁw!"ŽK;I\\>}:ó9GŽrTbc®Y³Æâ¥-K|¡B…x§sçή#—†HwéÒŲ+V‰¢ö™Bì„Ãj°©˰¤Ë®^½êÝÈV@ˆò¥;.í$‰q­Í›7+ñÔ©S/^¼xîÜ9ÞQ¼ô_|Á5§N‚Æ0ç_yå%ðÑb¹råŠsM;.€úEÁ^Äöz<¼>y°ÁQÞ¿|ùò[o½å¸´“DͯD¨d$ÆÄÄ<ñÄLé‰'ž={‚ ,[è&',eÕªUª¿¼gÏ׉‘K÷îÝ{èСzSfTb±ûhí?þñ¦«`æÀ¼Ÿ8qâúõë\7/´ù@—v’ôäÒ¥K3gÎL•*U… Àí@Ð5­•>zôèk׮͛7¯OŸ>ü;hÐ oT\Ú%ñp\:¡ÀYµÞS(Gµ àÌÞ­C®—ý¾páB:u—v’xÅ⥵B™ä_ýµN…¼?þøã‘#GR§NÍZþöÛo!-£FªT©€ÞÞ ï$qéaÆióWüïß”ãÒN’Þ¢Öúe-¯ZµêùçŸÿ[¬ÜsÏ=)R¤È!ˆ=mÚ4Ãj… ?¬Š“‡W‘$Þájµ8.í$) ŒzÊ”)Ï=÷\ÆŒË àïý÷ß_£F &Ä-;«™Ï-S™“¨åÒ}úô²ì}¹vnrâ$q‰öǽ züÓO?­X±¢hÑ¢©R¥²xioÒK®ùñÇu½…í9qx帴' ˸AO5Sž1c†ÊMœ8è„­’Q P}áÂ…@°ØÇÕ«W£<„YÇ¥—v’dD©i¼a0k×®M™2%K–,ªÈ¬”ì:3®SÆEŠ©\¹²¨¸óK;¼r\Ú‰“;!¿üò äJGÒ.^¼8vìØGy„IÞ±cÇßÿ…|ãÆ ÞS›æÎ»iÓ¦?îò]û׉ãÒN79qr§É‰÷ß¹sç¦K—Ž•>jÔ(}zêÔ)U¦CíªU«ï 9þ¼ë@‡WŽK;q’à\Úûï‚ Ä¥çÍ›ˆÍ¬.Z-Z´zõê*0wåÊ•'N™Ïž=ëzÒqi§›œ8¹sð^¼x°µücÿú׿Î;פI“T©R©2Ë¡C‡¼_¹zõêÃ?l•mÛ´ic¯8¼r\Ú‰“„;lV‘ëÖ­[¾|ù˜ä 4¸víš—KsåÏÁøçáÇ—,YRìK‡óäÉÓªU+/Ù.W®\íÚµ!ÏóçÏ/]ºôÆ]t‡ãÒN79q1–xç0hlnjãÛö:Íä¯Q£FïÞ½+V¬xðàAׯ—vâ$ÁET™kY"-é}úôiK½þã?B¶ ,8}úôjÕª?~ܾë\ÓŽK;ÝäÄIļ^ñri>nÅKó/D:oÞ¼÷Ýwß‹/¾èzÏá•ãÒNœÜ ùõ×_™çð+KãÏk­ß7n·ÏŸ?Ï;—/_.[¶lÅŠY­Zµ ÉÎäzÒqi§›œ8‰Ñ2/S¦LöìÙ[¶lùàƒŽ7Îu‹Ã+Ç¥8‰˜hJ+}´yB”tzÔ¨Qùóç_²dI ¶Æ\b)¥ç¸´ãÒŽK;¹«ä¡‡ªT©ÒåË—7n\¾|y×!¯—vâ$’óßV·¨³=UªTÕªUÛ´iS÷îÝkÖ¬øclžÇ¥nrâ$JDÛ…yòäyæ™gx±gϞ… 0ÀõŒÃ+Ç¥8‰¤ˆ*+š•^¬X±’%K²(Μ9DwìØñÇ ɪçÄqi§›œ8ñ]~ÿý÷ß~û­`Á‚Õ«W—o¤ÿþ2dp=ãðÊqi'N"Ï¥E½@æ ¨V Ò¢E‹Çœ™ýúu—ÍÃqi§›œ8‰f9yòdÀÕpx帴'gÑ,go ¦ùóçbÝÔ<~üxÀŽkÇÛÏôXtri¯ÆÈš.öѱ©ÈغF•ØQ_ZË¿(k‹[IÙÑÉëèdÑ&´Ó»üŠZtSNõËM;y_5þøôz5±si¦½ŒDz#&&æÈ‘#¬PQèDÁ¥½JÄ(„6o8abXÔi¾WÊÓ¼Å$7Ó’¿gΜa2Èr÷¾%‚ñËúæäÀòxDƒH—±(˜rD^Ÿ={Vf¦*¡G—ö.UÀç6}8Oúhfx’¬{ÈÀ1¦@nÊ¡t¤ÂìýÄ¢›N:eÔËw¶ø£ëî:þ<ÀN0µðôéÓÑÐãÌÚ"Ñ;ôÍ3Ÿ ­’Õ‡ Vƒ/_¾µÜŒ¿/^¼víZô´ŠNc…3Œòþýû÷íÛ§1ò€3èAs(Ý=\šy…qý%..mºƒQ^¼x1O…9¯ÔW_}õÕ’%K¢Aehò£”•n—EÁø®\¹rÁ‚,8¶,HŒ†=qï„ fÏžíã&æ¤óæÍ‹’µ²¢Á;w>üðáâÐY…oùÛNx”lN:8p€¦ÞÂúåq¸kʬ?î“$¹4CöÃ?@Ì ÄzüX¶¨0㥉E7=zëÖ­Þ”Ñà÷ îçŸ7nÜ!C¼l?JD>@Ô÷¤I“L›ø¨VlÍãÁ ܽ{÷_|ݲÁõ}ªm¶5mÚ´C‡EçJ§…cÆŒ™2eŠÂ·P‚¾ÏC2”Oê±cÇŽ1»‹M#â[Ð,I ÆÃFòúõë^‚ý\š¢V4pgΜyõÕW§OŸ=îA/™a>ûì³Õ«WÇÌRâ†.øe›Ó6ÚÃL„Y³fÕ®]ûâÅ‹ê«W¯úhƒ„ ëL®R¥Êš5kSójê2mO–ê… Ξ=K«òæÍK#C‚Rþüór+¦±×–,Y²$Æ¥i¹"Q4!OjãÙm§5é¦ *0FGå‰h¿ï{%²æX2ü=}ú4Í+Q¢³4 çº&S£F 5ÃÇøFµÁkÏ‚ÞË–-{òÉ'¡ÓŠ'ô=ÀCž!-¡…U«VíÛ·oîe K–,ùÔSOÑN…%{cY}¤‹Â:­^½z/¼ð‚—´‰Fÿlº¤wö@7—†½Hùb]æÌ™sÀ€¾£q\цHêÔ©3eÊôÃ?øKP½­Ò~–mÆ Ñ¨fµ–Œ\4þri­M¸´ÜŒ:uŠN.=|øðܹsŸ:uÊPÚG.â¾ÀLîСC† ¦L™Â@[<ªÆ×__ÇÏ?ÿL“˜ŠªQxk†ðÝÀ¥¬«‡NcâéZˆïˆ÷‹nJž<ù;ï¼³uëVZ¨c;þÒ-ñ”Qüý÷ß§L™’Yä;‡¹©œ8q¢Q£FiÓ¦Õ¸qã+ÝÇù© f³ôøñã“&M¢÷ÚµkwæÌ)l™É5>b£b…Ò´æÕ¬Y3ÔñM±QZïìÙ³°S %Ç×륱³®… J—.Îo pn9.4ÉpiFŠI€0jvÌ6QÄxˆ‚ñ*©R¥5jT†ÔjJ Ü³gÏnî{«˜ö ©ÕL®V­ŠƒË›B›öQ üÌ=š×¥K—è\AS§NÅP²Ø6ß\3åÌÙ7oÞœìÛ·/\…q׉*-mÏ+yZP‚öíÛßšƒènˆñð*)žnÿþýÓ¦Mãé°.G½eËvЧ– #úuc—>xð x,¬Õ_b£sÄrÈ 5‹¢sJмúõëÓ< +pmÚЖÅâµ StðàÁ4¯sçΚèZÈLöqï˜^8Ói(;šW±bŨeeš~¦£}çüj‰Öê¾k„é7cÆ %tßž={¬mŒï­í,Y²„É\½zõaÆùÍÍ1fª[*“N:¡qzõê%j:sæ °«ùîûï¿ß}÷Ú ¬P¡BåÊ•ßyç¾þÉ'Ÿ|ö¥U«V| ›åÞ A[½ýöÛƒ4hP¿~ýzöì‰öoß¾}ëÖ­¹òó0òî»ïÖ¨Qã‘GÉ’%KŠ)hЇ9Ð=Œ >œe3¦eË–¼3aÂ~E —;wîÌÊ⣦M›Ò¶¾}ûÆ}‹£zéÑ£G»ví6lX7(¼à_Þ¬X±"<­‘+W.õ-oÓ¦ ÏØ±cGzƒßâ&ÒK/½„™Ü?ŒÔ®]ûÙgŸ-S¦L‰%Ê•+÷òË/Ó94ž;-ZÔâSTj£Fè7†&Ü}ø¨k×®êdžˆûpOnB7>øàƒ>úè3Ï<Ããз4æ¹çžëFh<_çIk…üË›©ÂàÀ21bÄСCi6=O1î4»|ùòEй?(¼à_ޤŋgL5'_€…g‡öcÒ`þÍž=;€“>}ú´iÓ& #áÚ“ÌI’–äÉ“3±)d2€ÏXŽQîë€ÓH¯J[HÂme†ŠÜsÏ=+V¬00÷n¶ÂjD¹Áü±cDz¨õi¶lÙè{¢LÔ¶¬Y³ /ôŽ_íFœ <ôÐC÷Þ{¯ÚD[¿ÑοŠjT9}ì7yPsäÈ“md%éÒ¥®ßÌ™3û;¾(: ÎÀ[óx'ÚÆWú¦øbÉêð«=ð« 2Ьxäo.àM>e|µYöWï/®¾I;pà@tâ³N™…XßÊáS:¼v:ˆ™ ‹ÆÖ°<6³g϶’:uj½€Ãð7E ×o`ÓC舄–0^,I>òŽT8]Éšå+†xÞ‘·ã €ûð,ð+ïe4ÌPË;±‘äa„Æk"y¯äMúÓû˜ô^¾|ù{ì1Ú¦ã~÷oBBîOGPŠÍðþ·…dòáîÃCq ‹‚k@¿6ëÎ<;Ý•4>\rW†|‘7ÃÍz’æqgzÛ¦ ŒoÙ8ò‚yuöÀxÇ—öðÂÜŠ›Äm|\ מ¿9IÒ‚]¹hÑ"óvZ2Àh”šSˆVqCU—tÁ¢1~=ªkøHÏ«4§OŸÖÑ9dëÖ­à¬JFK5Ú8CÉ’%1YÔrÔ˜âö‘‚N¢4 ÒPÃd¢ÐAoz-ZU‚–ñ‘ûïôš|6ª†BÑÐNàÚ ¹~µ3CPX ´0gΜP8H5<0 ÇÍK×Ñ<ÚIƒE!|lCÌŠÈ­V£ú4U½zËã+ Ä}ªT©2zôèS§NEg-‰7nèlŽ×c/gµJØØ–úæÍ›y¢Ê•+ƒÆæôÐn5ƒÒûƒ¢í›EA™>}úú02)ŒÌ™3gîܹóæÍ[°`Á×_ÍM–…_߸qãºuëV¯^Íýy‡O.\¸3Œ@øwìØÁ­†Ú³gÏÏ>ûlÈ!cÆŒù6ŒüôÓO£FBñh'NÜ´iÏE?ŒJRBºëÚµk?üðƒ,úŠ^¢~þùg”Z<ûS(>U&=^˜‹IuT¹ ?²5 _Q‹ø÷G°k¸F(nÙÃÆ£Ñ0Ûìæÿ¢ˆé”Ñi˜r#üFtj[!pÊ©\îñlÁ{'!7ç)âß·âz®¡ç¥,©¥Ñ¡C|Ï–ì$Ú$IÔ³‚¥Ä*p”“Íž…U 8¦ýüùóûôéƒ"{íµ×tA†\¿~‹õNš¬n•Ãc¾…Òá:œ«únª•…5 BpUÁK>Úf¸¨„ãë{ö9 IeÖÑ%¸A•§Z-V—ÇÇxZ:ôž-õÆ<(ìáÿõÈ­Á(„é}Å(F•(Ϩ °¼mÛ6Ø,œÓ< Ù±cÇ`­yóæ-S¦ tWgrõ©éÅå9xë þaDYÇYñ( 2"ÿF¼`¢Š– ‚'Æãâ•èn¸ç27‘ÎþüÇh*˜Ëe"¢ñÃÑŸUîÉÜŽgÝ¡^µãBJÃÍðpÙî³~ãa/¶í¸«"¤Þвk4ʲtBúÙÌÅ~+ Øÿ†‘x易$,Þn0•ˆÎ³h‰]¹råÌ™3µjÕzõÕWË–-{îÜ9oDåSO=‹nݺõÎ;½F½÷&Ö w‰*aÙb#‹KKxíc^SÙæ†—/_ŽB¢eôU®0iIÕëñqï[ÍÂ{I éC¬Î”ùk+™¶¢IJÕ…µx ÒÊÆ G½\W\ÅÑt\šýW9ª¦ùǼnÞh“«W¯®]»¶W¯^•*UÒ¾ù‚ Ž?Ψ½ôÒKò±¿ð Ê0ðœ.dúÉ©ƒB|÷hÌMåßaDÄ>nÏkeU ù?o*º€öŠÂÈÿ #OeŠ›®èGëM?Gt¹itz鵺ö!A8áž—êbuR®rk˜—vre¸ûð£qk‡¼£»Iâу!ö‚ìˆpýcrŒȳx99ÿþÕ3¤¢å7•píù¿N’´x'˜9üMWxË~é|ùò ´çÌ™sàÀï¾û®qãÆiÓ¦-X°à¤I“ |ÆYÝ`‚r†”çÖIí¨’À1¥à{{¼þ"Û;CÀYÀ ýæVS%¦ý¥Å|‘p|/ÚÆ7œÅmãÎ=u;÷qƒD•\ºt t•I(§šEçåOœ8ñÈ#Ñ… Z¹r¥\𯋬˜X ·„'`²(ŠÔøýÆq÷õŒFŠV‰Øyó²n]pS1£Bì88˜Š…/›¢êЏÎÉ›r°†Å£»å/ÕÅ!! 6OÌÅýWý¥Ùþ²5þñ˜í Î4ÿ¶~ýϸjE¤Íþå…<½ÚßüïðrS“9œÔoéÙEõm¦…@‡ ‡p6×_í·xpÕIh@ ðvi‘FažŸåãENaµ¡cbbä”fa¶oß>cÆŒO<ñÄðáÕëÆüæÒ‘ßCwÓ¢ö‘ă2Äë¾ð‘30Iè@¹qdÔ«k´qiþ^ Š©’[à0 (¦ïÄ…h•B;ÐPÊ}mîUñÚs%(4ÉK$¢p|ˆ‹Š_âSѯöÐoŒ‡ØšéPý« nùWïo!ÇæZŒÎxi5Ò¦±<¢ 6lDºD‰rkèÓƒêJÛÞb*’V³N|[q¶ñÇiÜT̃* 5à4B¨2I7•ï¿ÿþÂ… VÔÀ$÷“f±*iü4z*î†pi½öRÐxžK×Û3›Âž:œ‰a×ß‚Eæ5üm£íÖR‹{0ÖÊ¿Ÿ\Õ^âúÛã±­øT{‘¬8%@öž´ŠkœÚÐx¯ÑZöôŸÿU[ÏIÒ(¨f…à%jãB°ÚkfJŸ*‹—·Múôé«W¯¾e˯ƒ"ž$–ÑPq)\ B\ ⯕>2O¯Pâï7&†,””s³šLË[¨Å#Æbt]IòåCˆN1¿«È½ñÕW_éÜe×®]§OŸÞ·oß=zŒ3F'ÁmcTp§íQíãK1±ãÁ½_È·=ÊøÄp°ãnýÉ¿¤^娗™îë!ú–Å":øa7”ßC±d´‡¶1]/_¾ŽûÉ,§1ΊÑeŠ0¹©qƒÂωÓÒE>Ë´dXÿLÒƒAùÉ#zçÏì\+RHX¡ðòxDï¨O.]ºDS•éKQUö»Ø£¯;öè$d±‡¼Ã”ŽÎzÐÿQl1ž9s¦OŸ>%K– IZR¶lYeÉD‚eGXÝ:+­#*ÞB$0Gx¥õk¸ *þÆåüùóÚêòQ‡jã<\[:Yc5Ú Œç·ƒEò-Èb¢»ä”0?°²UD˺ˆ}Z 'Gk}Ô¿Þ€œ¸ƒˆÍl`%‘ ƒWB•¸Ns$šûHq8‘¤ñ¼>vìX”þŽ€ FÍW \÷v#¤KiÉ믿þºvíÚ9sæ¬W¯í.ó]X°°Z•5kÖ²eË6lØpùòåq=!‘ãÉöbÕªU~øáîÝ»5{µE«"ã!çn¼rîܹ>}ú4hÐÝÇô°Mé„7ÿÿÎ;iX³f͆>räÈ3f°ºY×&ðöEÁÆ6—)÷Ê3nܸmÛ¶y³þnß¾<,_¾|óæÍ7nܱ yýQ¨¹yŠPp{÷îUø¥rÄ>|ö•9sæÂ… 7mÚ%¨¹§xÎÃã„ zôèA›ižmx©«Ç_¡Bo~λD,±¶e9¾éá¸I“&½øâ‹*ôµmÛV>%zÏß UH©X Ã÷·¿ý-oÞ¼ŠTA [ JżéL„\šF}>ú(ËáóÏ?÷wÜC–ÞÖ­[7n\¦L™dÉ’¥H‘¢wïÞÑ ÔÌ­ÁP¾òÊ+*›Ë$d|Q¬V‹ÛÄV‹‹L׃¾üòËLŘ˜Ö/:hÐ ùÕ-?¿[`6l¨\¹²&á'Ÿ|âo@‘:D¯™ÿÅŠ£m‡ (ðØc¡éè7ù|l§T×_~‰Â…ªÓ@BL’åË—«¼²m¼F²©àX÷îÝË•+'Ož<[ 䨱co¾ùf•*UÐt`‡ø],¸Ó¶c– zdæÌ™/½ô’LË>}úè}ÿ.\xÓ¦M´äÛo¿Í•+áaECMž<™UðÐC¥L™`A {+M ;Pgj¼Å¨ø¾æ¯x§7H"m–šâ%X¨9Œ”/kÜ!éÉçŸÞÇZ¬S†X °4iÒS æý;v@ha¯^½h¡¿yàÒ: Ú`îÁð5'MšdTß’;EÀ{ y iÁ$)_¾<„pÞ¼yt&€ƒ­£8Qè( JÓoXôP‹Ñ£G§Nò±Ê}!:þsúôiúJçvk×®­£ ?øà€hÖ¬YŒ)zó„É ó‰pîß¿¿uëÖ˜–4oÀ€Z­çÏŸúé§ã4oõêÕ‚M,ëöÈô*¨òÑG©1ˆ‚É­¦*«¸L™2ú¨qãÆw>[Ñjå~4"mõšyݳgO:‡U M×¥J•êÞ{ïUÞ™3g|¬k©é‡!Y±bÅÍ›7ëO?ý”·jÕJ±úÚ#ÓÖ’í„bišeÍš•UðAE^Àçƒ*¶­mÛ¶´êÅ_|à-è FVÁ½XëÑPÄsÆŒ÷ß­Zµ4QjȪœuÖ‘ôÉÐ9cÆŒ$cÄÉ/­÷œ9sæ Ø1×dÉ’EÔ:þBŸ ëÃ\¹r%d6nÜ8õ«[©ÿþßÿ=C ÃGeÐþHŽ&=€žEm±NY÷Üsχ~hþ2!ÒpFgz]7w3—Žg—~ó¦ë„¯B`X#PS©9ÞAA*TÈGÌ¡‘–þdÆÌ|ýõ×çÎ+jª ÌdßûYY|ÁF +¶ÏMŸ>=K]c¬t ý!)ïÐË,Þ;w‚<•+WÖö+,‘¬zÍ%?WkQ%Å‹7lÙµk׃>ˆu/s þüíô œ†"®^½: ëÔ©“>âÍ´iÓ¢e­Ãüßxã .4hPdbQ8©6¨>f¯\»;w–V=üðÃLB™r¬ wß}ÜîÖ­›V™ødX}‹-øuš—!C-m3ñÑÇŒ ‚ÆÉ‘#Á݆ÏV*Å›Q9Äu1ÐÄ3¸ÆTgîabOnúÕ~©×5kÖ|õÕWÚžr劌ô‘#GêUo D$¶-œ°@`ûÏ<ó ä¶uéÒÅ÷Täê Tm»ví´üöÛoó¢yóæZ˜\€Êó·HÜÖ­[åâ¼ |A˜Ò¥K'K–lÑ¢EØdzæ,Š€^“ëOÿ.Y²D–¸Ež÷èÑbã-á ,ý™0.€ò¨OxʃðW¨PaÏž=´SìôÒ¥K:x§ƒóriZEóbbbXS§N…‹Ž5Jmß¾ñUà%c .õìÙ3UªT­ZµŠÀø^¾|™…`[À 7$9K–,¢ú¶™ns|íµ× .‘=bŽHBºtéš4i¢wŽ;±Ö¢hOöìÙaø`1Ÿ“&M‚Hß{ï½Þ£wÔvóºO±ûùóçÇZ—‰qàÀ5jÐh7®×ˆŸúè#s8´oß^Çþ¶Ö{®f£MvìØQ§Nh!Ô…±VŠ{ý¬Y:pÛ¶mtf&ž€M7nÜ8/³²³ŸàöRÍ6ÿ\¸JæÌ™i!Æý„ɬ\¹ÒÇ‘EÏZµ>ù –.] ­Ò —¼yóBøµAvkõÈЂI“#.Z´(cÆŒâÒJõ €ÓŸ‘ úå1Š•Ì\I¹çÌ™Cwõë×Ï’àièå!)0sïÞ½ú:::بC*&˰j7Vx¾bÅŠ2eÊ´iÓ& Ú„x?BʹÞU>Ű: ¹aŸÒi¼CwEIk¥”1ÌsåÊ…ÅôÆoØRUò·'NDƨzO^¸víZ€Ʋ`Áæ°¬eë#ž@Õ!ôϰaà÷åÊ•S~ø'Ÿ|’ÖB´4 üõK+ØÜ¹sÅ¢§M›vèС’%K}^{$bÑtš’3Û(Ëôž]ÀbIž<¹áJøLš4i`ÔæUˆî©3°Y³fô\ 6ûè·uëV™œ¬—3fønf"AZ«s‘Ó‡z¨hÑ¢[¶l‰òJ…þJ¸½lº±[·nVŽ æ ‚\>ºk±§#õTÚ@«ôZµjYž2/ùëj@‰äÈ‘c̘1¼ž2eJ²dÉ>þøãeË–éŨŒTd¬Åaš=>aÂúíñÇWþÒÑ£G+V »ÞG{Ó©J‡Lœ8Q1ð³fÍZ½zµ0Ýg‡ ýºˆeʱ:4Ù ‚´ ¨Æ3²“'O[·n—/4@5nT´…B×¥L™R)ŒžØ¶îÝ»—(Q:Ñ¥K¬NouÔÈŒ»-aÙGö¾ÎÓ)ø\‡Â ´}ûvóp*O{tÖŒ»”¦á‚ ¾óÎ;ØÃ°,[º–¨äc*ÐŒ&]¿~}áÂ…XC àM å|èÑæÈW~ÅzCêã±|ùò4 eÑ´iÓÂ… koëïø¢P`4¯P¡BÐ?½Ïf-4lØP®¡hpÒ$Ͳ‹ˆ€tÚ’`µ†œ™½s"Òˆiï†ûôéCcX,B]´-pç53«U«†";v¬½±¸_ø|ÇŽS¤H¡³‡ò*`Zbc.U©RåÛo¿•KÄ_.*U*–*­e0Ðt ÄÊù¡‘a¬bsD­„;c¥3#Z¿/^|ñÅygÕªU~µ”V\„â|E‹Ñ*q‹-¼¹|Œ§Ó¦MKw)R$C† J”Á’A¹Xk 6Y0‡R}½E™?>M‚\ ÷è=šZ¡BccÔ#‹õ¡—/_þÅ_Ð¥h“²eËÒNÖËóÏ?¿bŠǙ㜛æþJ:5«Xg‡™¨PÁ2 Åý*Ô‡æ}óÍ7¯¾ú*MZ¸p¡íe£M|w^]¾|‹¸`Á‚Ì=V.-¤'EÞ~ûm¸d#•$Y'Ô´Û-Ù´i“0PÎÉqãÆ‰ úØo¢p'™ x衇š7oÎlTÍk€ˆI(¥ããv?ý ÈÐ]õêÕ“²¦ÍUªT¡m6ijÆŒ#–¬ Ä65&&ã—æåË—Okáüùó¬_cø2î"6õ»ü¨%ö_ºt©ö¿˜K7.R¤f¯¿ÉO¼³zË–-4 $ùä“O 1(ŽôéÓkÃK™£ á„10aBŽ90ßæÏŸî1Ü… êÕ«3P.bщÈÔMð¾`¦õèÑ#W®\F³!JôÞ{ï¡àªU«Æk諾¥A·$owÔGD{àQ­Zµb@é1Õ3e-?öØciÓ¦µ|JJÓç×à®^½Z 6exBcCnxñMÕÚ‰p‘¯D$ájRÔªUKÉ© °,ø‹/¾è-Cy¿¥ÕÌ:xð ²w§˜…ƒR¶8MË…ˆ-âÜ»wo ‘m(ø”¹ ÂGÀdJÖÜV€¶9Ô%sæÌ_}õÕáÇkÔ¨Q¸páÈ8Qɬ6ø§‚—,Y—f|Aé}ûömÞ¼™×Ø&!'_tßgŸ}°X¼“<Õ™2ezî¹ç6lØPµjUšúä“OFÌÏ@ox÷b&Ož,Ç ¹³kí’¨Ú¸RFüÕáÀV|X†$«žXÆ{Áµ|n:LììÞ½Û›§Lqw-JC¢Îœ9b1µŠ/®¬|ðÁ‰'ÌÉàãÙCFgÕªU>úè=÷܃AÄË,bQôíÛ×òCªRUdl"9 ”LUï@ÿ¤é˜{­[·.V¬˜–‰±1Ú£¤ Z˜à’!CÌó¢E‹b.Y]x©4’>ÊöíÛ_}õUš—3gN…f}úé§ëׯ·Ò¾ø:øQXߘ1c (O-lÔ\‹- Ø%J”À¾ƒÆlÛ¶M\¢Ã#ПŒšj’:ô™gžAw0 ¡ÓÝ»wÇ–¿ÝA—¢Ž•Ýȯ‘X˜ot‹’Œy?M—.í¼øk{F³„«•ÌG/¼ðBÆŒ ,ȈשSÇŠuúè×’>…þ5oÞ$´êZŠÞïׯ”ŒÇ‰äÝ9wîœí"±ÀáÆ £y_ýuˆrŒŒ*pcLU¡Û®"ç9mK“& 8±PÆ› ëT!ŽÆ&L˜ ³-´èF;·k×Î,>¿Ú‰™ùå—_¾òÊ+K—.õ²Ù^½zU«V ¶h×­[ý‚Å™v²(tS* »Ð0`Ë­qàÀEž#¥J•Ò‹ Ðà˜˜'2Äå7¦…ØãØéÏ?ÿ„k­]»Ör¿£ši³4F#È2¤y4lÈ!ýû÷åvíÚežHFW]QZŒ7nÐe_äµ4Òl s:sôèѧOŸ‹`ÕX²ßÈèß@0“°e¥Ù‚å±cÇBõáØ¬—2­v³/²aÃó§I)ÐK4•N†P±Rd+ùŽ3ÑŒÕ^ñFd¡ì¦NÚµk×(qéëh•xתU«X¬¬QV Ô‹!ÕãcÈ4ÖM£˜K«W¯¥éU¯'jZ¯^=–Lä›ÄiãF<¡oß¾Þ†ÑÀxÇŽ!`ô$ÆvŠ‚lågˆ@8ŠBü̬[¸paÈXËŠg”Ïž=Ëû^ºE #–÷&ÚÄÊÔ¼ÐE75¢¡°ïÉ“'AËŠøc‰4U‰ŠX„›Ì4¥Ž1èSRbúe¢XßÏ×@¤•¸Ã [šd¬Æ”//|l*ÍfcŠúÐ([È1)GVÄx j”¡´ãÉŒ©ùÐd¹Ë±Í›„ ŒÚElÃçuƒÓòXÒHsø«×Ô3¯J)1ÜXô']dÀøÒÈ»¼PKˆ¬K-@¸´%Åë4`NÊcé¯^£ B9y6˜ÿtWˆýèo*Ù›Zµè¦_Ä<çt”L¤>,`a]n6ÓÔr•$–ñby#`(Åeì§N²×´ÓÂx| ³ 7µ¤AvìØ!®BŸÓ«GuÌÙIÖ,ØbÊB{IÿFtTv Ïß;ç,R™ÂÛq**y²-ùw¡ßfóœ8qâä? ÀÒÂI”ì"'–Âë.%a):ÁÏAÔ¯^½z qõ7ÍÉ k+qâĉ'ƒ¦Ö^ÃME&¼jDb{&ønL^Y°P0|}:aë»ñÈòÏ;|vâÄÉ’Ë—/{#xABEGËÉ 7ùT¶|Âþ4÷÷úO·TàœÔ±MÌ߈y,±§5#% 8q’„E~fUZ¿qãþ_a$îãf•Lp¹®îÅm ô§Ÿ~º)G¼õ\ì´'NaàÒÞâ ‚5/ƒÛW¯^MX|VŸš9sæÂäh§2`û?ÅM$'NœÜiûý/1UH©òuë[âÒ ŠüÛo¿q·ÍÊ[Û»Tâ;­éô"&&Fùü8qâ$aÙàÁƒ•+ ^Ê Ô§0ÞS§Níß¿?a]¾:5Ú+‰Ü¤I“†z >󾣨éÈtŠ#oPÜñC'NœÜQñfPâÀäøkë=zTéÈ © HKX. #¥ üÊBY^Ir º`ûöí›7oVÛtŽ&aQZsÁx’>ø ~ýú ëâĉ'ãÆ+[¶¬*%åÈ‘#]ºt¼¸÷Þ{ù›'Ož¬Y³fÉ’%C† >úèĉOž<™P¿«H?iØoÍš5Ë—/ tý·ß~*‚Ã1bDíÚµ‹-z§ûMhOËÓE§&]Œ‡'Nî¬ZµJyz×®][£F”)S>ðÀ g0A=xð ’KëLÂréñãÇõÕWëׯ‡´ÃQuŠü0üûï¿9rä€bbb¸ÃÙ³g9’€gÞiÒ•+WÑÿdÉ’¡æ|¬)ìĉ“¤''Nœ¨W¯ž¸töìÙÓ¦Mk{3eÊd¯~øáM›6%àïþóŸÿÛ•IΕ+¿rk\Úó»ï¾kݺ5ú…[Ýé~û?A‰ÿ'Nœ8I(1 ©®P¡‚sΜ9“'O®×Ù²eK:uþüùAÈögŸ}¦¢'ÿõ_ÿÌjûìêÕ«ŠˆS|îɧÜßê’È•}ñâÅÿŸ½ó¯ªXÛþA¡¡÷@)R¤)U±"*‚4©Ò{ïM¤—Ð¥ƒôÞD:J•„„@è5"¶Ãñxô}Ï»¿ßµï‹¹Ö·ÃÎ!1$$ÎýǾÖ^kÖ¬Y³fî¹gæ™g¢áäâÅ‹,XpĈ2”wÂß½{Wƒ$†Íø¹ÌB\v±ÑvÃSâ5:¡Ä ´Ý¸qC[­q‰®„Ëíÿĉœ4ñ;Ë›gq£ÇbCçžq c¨&Ÿ~øásÏ=×µkWmÍ,΢5~ÍæDßÿ½,¨µe•s{/Çááá®GÛ£ ¬nöÈ64¨3„j')d¶ÓrcÍš5ΣÀÕh9 ä|áÂmø5fÌ8™ôë¡Î=LõDmŒb6ÿ2Wµ–<ê>ÔÑønU#±‹±cáÐÏÂÂÂâ aØ ª\¼xqŸ>}б .œ;wnÆ QÑõë×ÿüóÏçÌ™³|ùò)S¦Ì˜1ãìÙ³.÷âhÜcÇCèN;÷‰ÛÍz b™ùE3޽mÛ¶­[·F³)*Ï•T¾råŠè÷âÅ‹:ê6!–6#¦AѶÔ&Ͱ·µsƒÄ›}é¨í e‰jþÇï–-[Ž?n‹“……EƒÜuëÖ­ 6@õ“'Oæ˜3Ú3QÄõÉ"BcK–,Y»v­Ëm¼ír/‘¿yóæùóçW¬X±~ýzcË—n6lØöíÛyD¯^½4ÀîÜÙ<,,l„ S§N¥ÑáØÉá´&_ý5©¢MáE”$èYG~”/_¾^½z®X-`·°°°xBÀ6†dàRgç~á…`Zsæ—_~1FÂô¨‘“'O9jxÛ°¥¡Á'Ù{Ź£1\-× _¾|9"""88øÂ… NVu ßîÞ½;44T^,XÞ6š™H¤üµ‡¬nñr̲‚øõ, é@øù©S§`x34mFl¤´yZ¢5j|òÉ'v…‹……E 9›amép³”ž‘vèÃÂÂ"´ô Aƒ8RBWC’õ…ÜêÕ«‡Ž…î SN~ûí·ÚŠK«Üž"E £f³fÍÊí®G¾‰ˆœ¨íÊsLÃУþ"q!dä1OI“& 1wêÔIVÜ»páBè”`ðpîܹ!ZþrÑ¢E'Y¶l™¢"%$˜Ö…Oœ¼#Wy:4ŽJ'@úôé¯_¿Î]'OžDçK—®E‹2|,4BæäÈ‘ƒ|PY3 ‹§y=Ò&)>„Á4Âܶm[H z„ÖP›Ü€HaËï¿ÿ‚‚-ÔŽ;îhÞ¼yxx¸ÓÆ#Í4¹råc[XXXÔzFsÞ,l1Z:… Å®S¦LÑ¢‚á¥xý,êFÍšØÐöeË–U‹àrÛ`W¨P¡J•*ÆôBvt-Z´ ÌÔ©S5 6oÞœ"EŠ€€€ÀáP=BÚåvö¦¥5„ŽöæF»â‰C?NDý¯ý ΄¡ '‘~öÙgùòå›8q¢ÇyMŸ•(QÙ,Nƒ ‰äã?†›5k¦`3gÎÔ„£Ó¨Ž-S¦ 4ë-=C† A“ËÀøøøÈœšÕ°pXX·£·9p¹˜!a Y$=)Ñ/ÂÛ××a|ÿþ}úèaHuΜ9Z2C“ÁíZTž={vótzÙ²e+]º4úœ¸JÛtôèQã˜y¯áh³@†š’L™2.\Ø' ‹øÑÒ:)‹;Ô… tã:u mܸ1 ŒøÔ0/´†«Rq¢9œÿûßÍ\›DµÙKV„KuÌãŠ)B>¬`XñæÍ›šP˜¹sçÂÒ)TüË/¿ ï¹ áÝ AM_Þºu Næå Áò\áT¾|yÎ#³ùkÚ:uêhÚ‘”plÞÝ›––9¿þþþ4 ï±ÀÜÂÂÂ"®`†[5ÊAÏ]+Á]îñ^èëÓO?uªh.mÛ¶ ²Z´h‘‚qÄBòðg‡4&0yòätéÒÁc²²–­Edd$=mÚ´ÞÒ3cÆ ˆtðàÁf<„4 6ÌõȦ1 ËPC+4E‹U‹cÚ‚U«V!’á^—{Üòçm°âz´:’—-P @Ê”)ù«!‹ÐÐЊ+ʨˆô;½¶Ò¾·'ò¿ª×¿}û6·dÈÁ' ‹xÐÒ¢Dcˆ´Etôý½9rä(Q¢„xäo`` ÖJ·k×.UªT«W¯6ñËùê:þü¢P³§­†&îÞ½›:uj¢:þ¼Ë=¼¬ ;ѯ¢…W5X­8µBõïBk"ªD`¿÷Þ{ÆXš3¹rå‚rI›N¶oß^·:tˆ_þ¡g–/_Ž,'[xëhl<”T??¿R¥J·ÅÉÂÂ"žÑ¦M¸«oß¾Z~¢±ksŠ›0a¨Q£`i-0á‘ܳgO—Û8mæÌ™þþþÓ§O7´BÔ}úô!Øœ9sNœ8ᔩ:èÚµ+ÔÚ£GýÕoIkHûæÍ›gΜÑb™#F8õ¶Zý’ÚÙ³gs¾páÂÿøÇ?x´¯¯/«U«6~üøÞ½{“¶1cÆhC1hœ8 Ç7ß|S£F Å)>7ÞJµDÝøñ03†´ 4Xf…‹………E\A†Ä€j† ûÉV ¾2+ Á믿ŽèÍ”)t„6^±bµâ‡Ù"##³eËÆíýû÷‡Š{—T¨P`Š Â43qbfé[©nó—Té*¡Ü¼yóòt3”÷"bej¢“ãÆ+V¬˜$·¬õhD¾øâ‹I“&¡´i8 §ðÕW_‰o%ìikôP{ƒ ®\¹¢œ‰FKs•„eÍšîzdRn‹“……E<AK§~òäÉò̯Qh €œ>}:þüZÜ3§J•ªN:px²dɦL™¢ÛÀ@KkI¸‰¶[·nðÛºu뜛¡ê†lѽFK‹? €Œ—}ÍAš4i m z0%Ãøëp=Z¯­à$Ñ›3gNîúðÃásÏ=—>}z9ÍãqÆýÈ7`iš`›w3CÅÞ\•'øøø/^Ü– ‹8²n„å¤Za¿îÝ»kýˆˆîþýûR›Èl ÆÞµkg´ êÕ«×­_¿^Á´š»C‡N'ÿGÍ‘#G¹råDn²[Ö4¥˜Y?‚ƒƒ5€áK ¹ÓÆcÓ¦MZ$~øðaIb—ÛÀ¯cÇŽ^æ/iàfÞ°aƒ3ªZÙ³g+Ápò¼yóä6¤råʲÊF{»9²ö¦¥¹Êë¿afë³ÔÂÂ"ž‘öíÛÁfÄ[¼M§`èСŠyïÞ½r»úÑG9sfÊ”)ô [E½Ô;wn;Êaaa‘P€3;uꄬEÜ¡k†2j×® ¹:uJ,*¡«5#o¾ù&´yñâÅnݺ!­ ©ù8ñ/¿ü²¦ MA‹ðÝwßé/¼ ûÉ3?@6C¶’ÖP7ÂÑ+㽞={JÊjí!Ò]1üðètydi“žR¥Jùøø˜ñgáĉåÊ•ãvRË †‡‡Ó;à‰¾¾¾ðöK/½Äíï¾ûîܹseìMüZDãz´äPœ¤+]º´Yªcaaañç•iBéËkM4ì gÊ·’.Ab(d‘z{ðàÁÏ?ÿ¼„+€ÉQÂc˜Jg *¹µjÕªN:õݵk—¢ÒF-оTúÍ›7u˹sçDƒú«=³4 xãÆ ÎÀ±¯ Eؾ}û|€Z®^½z¯^½Ú·o¯‰BÇ&((¨]»v"sä.”KbŒÃRÙfß»wO ˆp {ΓlíC?"z?¤-mÚ´éÓ§3[~¶°°ˆg@§@Ì–(òe µÖ¯_¿`Á‚«V­º}û6ÚuÛ¶mR×uª±‹¥K—Ê‚¢Aƒš’C?C˜ÎUä®Gfl÷ïß×Ô,´?`À]•8ÖõÈn™Hô ’'Ó‘3f(Øøñ㉠Âç’Æ–eãA˜Î;ËÊzøðábÔC‡Aõkذ¡Z¢eË–½ð ëÚµ+gΜ9£ÞAÕªU÷íÛg,º !{iùñ°öÒq 瘃Ë=ø ƒ)RÊÕ´š¹9š=µB¥Z«V-AÜÂ̲ñÐòjdj™2e¥:å)Ž…Õáˆ]#Ïü-ç†R@Ù¢~áLH[Z¬P¡ÂÛo¿Í-Æ¢ïàÁƒZD“-[¶¬Y³¦w#wîÜЬzÈi _kÝŠL»µâ›§€€€½ˆÓ$"""UªTeË–Õléc¡6ˆþþþÙ³gW’켡……EücÔ¨Q2ä0ZZ?XT‹MˆÐXËó’`éÖ­[Š)øÙÊ‘¬Ño19'‰gРAŠôôíÛWÏâÚýP#-ð¿6^9|ø0dnŒ¥y„¬ûàym’{ËÏ8\r¹7aÑ|è®]»L³ez²Hx–Ù§ÀÂÂÂ"Nðã?:­|ùûÕW_AwÒŠ¦_z„?ÃÃÃaETñ¸qã °eË—{löÈ‘#Ú"îòññ_yå•Nš4‰ó#GŽœ2eŠ$±HXãÏHY9‘ƒxgΜI0¸T¥×­[·iÓ&—{®Ð Œ/^¼xíÚµd0ôþùçŸó|þüùûöíƒ3%×à?ÿùÏ7ß|“`Ò@H^͹ò1,,Œv„Ö!88Øø3á5ùûÝwßE³öP;ÈW9rä¨^½ºn´ZÚÂÂ"þqðàA˜ùË/¿ÔN.E´¥Ëí¥šjݺ5r4Y²dùóçGmB‰.\€™‘¯7¾{÷îÒ¥K“'O^¸paÔx… 8†ÃQªóæÍs¹Ížò¤±wk—{}ʧŸ~züøq]ª[·nóæÍ·oßëšu<š8n«!ÿ!C† Òµfô¦gÏžœÕ“f<]{fIT÷êÕë믿Ö`ûÊ•+»wïÞ²eKÞW-7Òˆ†väÔ©Sf )‘ÿRy7å­÷ìÙ£q³1¢………ÅŸ‡¥†-‘¸Z"…œÍ8ƒqg U:‡¬¡,€µä cذaKÂGDDܼyÓl®­Y¼;wîÆ3û¹pæÌ™3fK\çÆU?¸¡áø_Ân'Ì÷n8—«ÈD­ÅÔ6[,,,,ž×rX¤cmq«c¤õÏ?ÿ¬ÙIÀjÚù v„ÇÂÂâY†X–6[™èØæŒ………ųãICÓÿùÏ`ï_ÜÐùß~ûÍø\Jƒºt xA£üñúõëršg‹……Å3xŠ–·%Èþ÷¿ÿm)ËÂÂÂ♂qÂüé§Ÿþõ¯ÉœØèg˜<©R·Z¥$¹ ÒÂÂ" @þ¢g j3ihaa:Q$iät™nþ:¹>Ôvx6Ç,,,,â ÆðÕ,UÐÜ=Çf_<»0ÖÂÂÂ"aQk‚þçŸæ]M!mW.XXXX$ nß¾m›ÃÏN9ègxûáÇhi»TÖÂÂÂ"ÁxFEÿôÓOpµÑÒ‚]¿`aaa‘à€™åæÝ¬„EBë$¢ÚéÆÁÂÂÂÂ"þñŸÿüÍì¤b­_€¢µ:ø×_5{ÞYXXXXÄ4øüRÑwîܹ|ù²®BÚ:ùÏG°9faaaÿ]t4L]ÿþûï¢kãÍÂÂÂÂâiøjG3CÅ¿þú«–˜ñ×ÌJNCÎIc$ ‹ÄÈÕÆEƒËíáöíÛááá¡¡¡W¯^ýᇬ%ž………E‚@&vÁÁÁ£GîÚµkÇŽ§OŸ~ïÞ½ÈÈHm$3<Í!Ç•ñ‰üã—þý÷߯\¹òå—_BÚ0v›6m†ºråʳgÏ¿gñ†ï¾û¾*S¦Ìßþö7ÿ}ú4###!p›E ‹ .O¿þúkÚ´i{õêuóæÍ;wî ¢!íòåËŸ;wÎå^3þý÷ßÿøã:>vìØÙ³g½Í*"εžñ “aÂË0Öº]û=™uîtîÞ½KšiƒHü½{÷¼ÝøÐ þ× ~ûí7%•':S˳~úé'yüç?ÿIJþí—HmŸ‚q£Ó´&jnx{®·ø½¥ßÛ#¢y/Ñ-Î\¿~=¦B´ø)ÃÚ„D³Ó÷Ã"ï«­{Sí|©˜ÆWé‰Q÷tx6׬©Ö|÷Ýw*êÑÔ—'ù:?üðƒŽÿøãóçÏ'~¦,½þúëeÊ”¹råŠË½½]`` ´Ü¨Q#¸ã†2gñâÅ+V¬˜6mÚ°aÃÈïgŸ}6f̘qãÆñ‚¾^Wá»téBJÚ¶m;bĈ3f|ñÅS§N]¹rå˜"¦Ïõ†9räÏŸ¿xñâ¥Ýà€¿œ$*RHÞNœ8±gÏž:u>|øØ±cßÿýW_}µlÙ²Ï?ÿMš4È’%‹¿¿† R§Níããó·GHéɼ e ‘'Oó,RK †dÏHÙ’5kV2ÊäLºté0=ŸOi+Z´¨Îðu@òž{î9ýóçz úð™3g¦¤ùùù™ðEg1Ó+p2yòä©R¥"Í™2e¢ ;ÃdË–Mðõõ%B Ø®S3¤ý”£–¾témëµk×Ôl½ûî»FRsyYj±Ù €_5Äëׯ¯\¹29œ1cF““BŠGø»޾ݓ„çSR–,õ#¤q#í#D Ï×ôøÊ”7øÄi¼ …üÝ (†OtÆ^ÇæI’)®Ü˜õ (àñ 8½!jüÞÒÿœxû.Ô_ʹLR©ürü\ á­æÆ4ž¿=Ia ß¼HCÄ4|@^©Ñcñ]â*=ÞàQeH° ÿs „è?köìÙUqô¶‰EüP:Ý‚ŠÓR¾D4–{ÿþý3gÎlß¾=""Bgg¼Ô¢E‹\|™‘¶d¶>+tGååãFŸÉ1ý.1 O2 (X…2ã™Êø·ÂÇ þ+P[Ó¹aZœ¨MUáÂ…d(P»ÑÈà'ç%ŠŸ$ŸƒØ¢á('h[E¼ˆUÝÂíºDz(ÏÎ<§/@Õà$µ›qoLóÍ'† 䉪Iá¾c|‚üäk:›!—Pé!ëøjð€oÇW.Y²¤.ÑqSN’`¾5å'ó3“x _¤HºœpNõêÕùÐ:IùÏ•+´¥rƒþrrÖ¬YôåéTöéÓ§I“&U«VE@’ùÕªUƒ²>øàÎÐKíСgP×¼»FöЖ22‰ègédÙšeã_}õUƒ È·:]å£iôèѪËѨeg#ø„ <…GJìIh**'xhi˜œÅWöQ‘*† ø!ÑáF#EœO¤hqžÌ1üÄTè¯ñØ#xãp•^ŸÁƒÔަ-ˆé÷…f#»h4áå˜šã˜ÆWéy’ïN½(^¼8Å2µt4m=Ÿ/X° …0v:õM4ò ð[·n¹ÜŽš ?ß¼yÊÕmsÀÁƒi€¾ÿþ{gàþýû+V¬[·nà”ö¯¿þúóÏ?k21NæAb~öìÙ›6mºvíZppðû￯‘ϹsçÆ4~ñ‚˜ÆCRi¿Ì„©fâ”þÈÈH§íÝ»÷ÆšûÓ´F“#O2aÊ÷úã?4eý4Öÿx‡e-e’­°°°>ú¡ENê$ Ü½{×Ûl]<ì a&éôñ•‹-Š@=yòä³VH' ‡´‘   d„4'Tzîܹã1G9¤‚×®][µỌ̃ɋZÎá>ÞÂSÈ%p½¼ð ½zõ2ó˜”ÏßÜ0¾àä­âñàÁ"Ù·oßÚµk!ê©S§òœlß¾ýúõëf$êk/ø§DzŒ4 XM½ .]ºnJ,W)¸N-8 Ùºuëäɓ钷H…Õ«W¯[·ŽL&p8/{ôèQ²ÅÛs½Åï-ý1µñàŸà½÷Þ#yÏ?ÿ|`` "~Å©/^äSòŽ;Æ{‘É|»¸*·êÇÑÏ]±b…äêÕ«Ñû1øg »T‘§N¢ÔÑ'…uêÔ‰iüq›ž¨ A¡šÔ«W]5–-[ žx¹W¢D ’G™¡,‘HÈ!¦_ 4Ò´iSTèØ±c)!Ú…ÄÈÕPÇ'Ÿ|¢nŰaèõN-Í{uìØ‘JÑ£Gó‚äXôæd1m[c^Z˨T©RçÎ0µM¤1óðõª~ŠSáÄN©Ìñ¿Üe tª“Ñä[TsDªÀ‡~HòL+ãr»0ÎÆßH¶ŽÑ›>±{YZ" ü¿g Îä9Ü*=Q»äaóæÍIJFÒúI¾×Ó†é"rèÊ‘¼-Zxôל%‡ A*SÚ£'5аo‡dÒH, ¿k×.N’'zœ‡bb³Ä‹¨Õ8p`÷îÝëÖ­Kƒ‹¬B©ó«ïK 2$[¶l6JÒ YkÏÄ'ì Ç(<_НàOø¯]ܹsçL ÿ«qæcñ/0„É+ÐÃ¥ŸK[OAòÈL^¹+b$ýÐ q’¤÷ß¿L™2Ð ™“k¨3=Ñ?7jüÞÒ»V`èСEŠ¡K…6<ù'‡Ô‡«r+s…Þ½{“íÎrÓïWùf> å–@0”,Y’.aLãÃïèM«£ÁzöìIo®[·nÆràYáwß}—fEŽVÄz(¦Êš5+ZZgÌ8I¢½3r51ôI“'OîççG/ÕY0 ‚öíÛÓ6õïßß Ds‹Úħ­™£ oz‚¤Öh­ÿ$¨ž4%”%Ñ©¶!㤠ʀ6Ñd¬Q¿fðDCjO˜?¦/£§(*g0o&*Uƒ¾ïúõë5Š9Ë#¢iwÌp7ox3ñ–þÿ!4—-Áã4ÓŠZøÏ3Iþëû:§i*=fXÌÔkú¿h­dÉ’‰ÔM¦¼QØHy\=7¦õ׈.¤Ë[o½E6nÜØ9ñØIŠhf—ÌqXX˜Ø`d%\£v‰tO@ÓàÕxÓ«W¯¡ÍÕËr’¢hìÃ:tà|›6m¨5¼8,$®ˆºlЛ6ð^T`¸‹`7 hQÆÐuRžQ7Ì•¶$ …ª-ã1Ú *â*ÅÅû//ðÆÞ›Ԓž«‰T§n—zÔ FhIºðjdà=7H7’ÃZ`%zŒþ¹Qã÷–þ?¼ÀÛø§:†  ¯4zôhã~üÂ%R;Ôóub·ò#ó€Áƒ;»Wjø‹˜¶1M§³+ÍíˆUÄ4Óøã*=Ñ|w>½¤}úð·B… Q¥]=þþ÷¿?ÞÜë칫3E¾Éã±ð^[zQ´4N«!hº¯þ‹¦±ô«>‘ð¹—¥¥â㫤fÅ[ÿ+¦sëÞ ÞÔ5“EŠñ˜gªƒYÚY©R%8ÇI­z#3½½_ÔøãÊ6@µ˜¾§¯¯ï¼yób]®¨G| ¹ï36ŠqØ—É@Ò©û_c~Ú6npr,l6ž¶‡0xð`jG÷îÝŸY§ñ$¯V­Z¦Q¦RÇ®ÖlÚ!C’%KFiQ/ò í¾ž;v¬dÉ’Zh,§.U«V•ŸRj–F„D/ôàÈ·Aƒi‚X»"õWš*á8 ‚­f”“ÐB,4[œh?M[«¡hô^v”1cÿ£‡ª·¢FJÂ&úçÒxñvÎN±ž;Ù£xx®<"ºÜ>lMçÚ9Œ W‹77¤•J޳鄦Ÿü¹yóæ3²VÂ)_)rêµAVÖïÈ~u¸0©¦PÑ”“{ª κ`ʹƎÌZ]´Äc ¤š3ª^êԩ齎5jĈΑ¨óŒÃŠ0}úô·ß~;W®\Y³f­R¥J¿~ý¶oßîlÅÔõ8p Üίú&v ‹§ 3Ðu¶Ú„‘龿.Íœ²‡ÿsÓÓ˜p‚4¾ñ‰¤ÊW²ŒU§Û Ÿ6 -ýé§ŸêŒi’ìÆµq¥— > yšn»1•7“eª5ƒº:©™'½ËêUÆblÔ(b<¼²$éŒ8Í€RTýXmÌy™öÙgP–³—‘H÷o »}û¶ù(rgúõ×_ûí·¡¡¡Δh¬­–¶°Hq £Í”7fsR±s¾C‹DVI^E[-mµ´…Eܬ!õ£x¨ÂRÍÔ¼S¯J*{Œ÷zÌ}KŠ{ØäÇÕÈo¤YN 4ýä¡™«ù“ž–¦l<¡59)«¥-,âšéÓ¢]ÙDÉ ¿txé_¹råêÕ«wïÞåªì-=¬µUÍ2aÙqnµ´ÕÒÑÃÛ~ÇÞÖ亹höˆÇ˜ÐËI¸ÙaÙFÃÑNñ)ï ò9Ÿ$&C2-Å~&ª7 oöÞIOK;k5Óê4ñõµc¸œ¶ߘVK[XÄ?¢O–0Vcò?pïÞ=9ùôl|‚IsWdddTg¶VK[-maaáçO§»€hìüoݺ%+YãsØåvnc¦s±˜‡n7áÍøÉ÷nȧY¼Õk­¬—œŽ~¿åLT•¿‚–vú[s.t¾²–ÿkËji ‹12XN‡à^-á \mÜ€£«ÃÂÂ4i¨[¢z/w=ÚñM¾ ×Z<«¥­–¶°H¨zçtbœFs‹±Êƒ·;Sb¿qãÆÕ«Wu *6\-“ZýÕ~N¿f¿ÎxÃ1¾¿ää!?Hʧbôæ2éiiÛ›/+“Ιù$T£,GÊVK[XÄ3ÄiÑW4§`ŽJGÜþl.±·ZÚji ‹Ä§31Y><fgÒëׯ‡††ÞºuËl>e& ¹ýìÙ³òàqüøq3:-‡3 +,###eR"ULb¢ß_Øåð5íáƒ:Éki3Œ/sÊÛ·o“ô’´~S —¬–¶°H(ê~¬Ï+ê),}çΧMšØLcÎòði.AÚaaa×®]ƒä©O«¥­–¶°x´´‘L÷‚?üðäÉ“+V¬È“'uS»f§OŸžß¬Y³öîÝûôéÓ7n|饗´ÌÒ¥Kƒ‚‚4Ð-ÿá¦sòþýû×Üà ~å…‡‡Ó¾ §MûâÜXÜ›–FEÿ膜vþu´´>Ù]7h|õ"Q7¶ÖvVK[X$”| Y°`AË–-‹/."‚µ{T›6m‚ƒƒCCC¹Ê™:uê-ZôoP¹rå‰'8p`êÔ©sçÎ]»víþýûáIG=VK[-maañ$E¤AZÄÒß¼àÝwß%À¡C‡2dÈàq EݧOŸÛ·oVDh–Z³±ãǻܾ7õ8mˆ,uç\·¾hÑ¢3gÎ8OjJQeÑͱ\‘h7m'þ×9Ç‘#Gò¾íÚµK2NK¬–¶°Hz§š1R­´ËÏ7ß|Sºtid³“s®_¿nHÌœç/â9((èêÕ«Ú¥W ¡>ø¶P¡BÅŠÓ¾<Æ&Y¦ ãLJÏ!d¢íСƒŸŸß¤I“De ¨˜¨<ÆF45©c-N×+p/ÍÄùóç=³‘åzAcOرcÇo¿ý–ƒË—/ëv…Œú,¥DíÅìÙ³Ó¤I늂ÌNCVK[-ma‘°\„š4KS¡ÙÍ›7#S]Ž´BBBœ”®µÃæ L¸víZ‘˜‡š•ÞîÝ»+UªôñÇwîܹE‹¯¾újÕªUO:å\c®yF9D5mš\ÛŠ9pôèQíîñ:ÆŽŽ–HëhºvíºdÉb€áùE±;­VŒ,Ôˆ o¤ôpžfeܸqVK[-mañ´!©CÍ’#;ª!D´ÿ~m#‹¼”4,jnA‹"¶‘Ъ­Ι3gzD‰–N:5ñh«V§žp\¤H‘-ZÀx®G{d#tÅ®òn¡´Ï‹†¯7†a'Q%jê¸BNš4)gΜ»I†fI@çι¥k׮͚5CŠC’pl¦L™ ÓòåËëÒ† 8xñŇž5kVt22Ûßß¿víÚ"Fлwonä dÉ’H;ùß+Z´è²eËÒ\ª[·nãÆÓ¤I3zôh]¸páråÊqcŽ9PÎ'Nœ Rœ| q!}Þ|óMþ^ºt‰ÛS¦LùÎ;ïp]k ¼AƒHh49ÇyóæEð'K–,{öìð?qΟ?ÿ?þ€ê 0kÖ¬ÀDËKU¯^cÅ WÃíC‡WÓ;à iµ´ÕÒO’y0':Yš1|üøñlÙ²,X°G2iÓÐÄ©S§¾ûî;XárŽˆˆ¸}û6\£B¶r…'ë5èzòäɨÓ÷ß?22R1ȳ5}РAùòå!+:†®}}}¹ëæÍ›L—.8þüFÉó,qã”)S8¨X±"i˜;w.ɘ8q"gzöì Í"ƒ‰ÁåÞS†Ñ:@é\=räLBaáÂ…(öÌ™3àÞ½{ZŒçs€Go7iÒ„Hˆæ' MZzŸ3g¯ÿ×Ù÷Ðji ‹D¤¥³dÉeÉVM²PZ½„N6ZQÃÑ?Ax‡‡‡ëvnìß¿? ù™‹HWs ‰ Ê.\$#’J•*É,„`:u "È‘µDŽZæï_|Áo¹råNž<¹jÕ*„1áÞS§Nå@´ïr]O›6ÀÐ5á'L˜@ 9¨W¯$ téÒóR… J•*O‘V,Y²$—x.Q}óÍ7hï¥K—Z-mµ´…ÅÓ†ìåàUã¥AÖÎ'NœˆºYèMKsF6rÆ’ Qºoß>xµ Ùj±z÷î]yá£î˺_»v­ÂC¹èy zõêð<)L:u«V­xНæ)¨\øE Eûûû/Z´ˆÛa{¤H‘â…^à*Ö¨ËèÑ£_|ñEôž^Ÿ3É’%«Y³&´ÌqñâŵBGËp”’#FpŒ¢†´Iðc×HZ-mµ´…E‚h'BÏ›7eïÁÞÐ, $spõêÕ³gÏ‚u¹'!7ÃT›6m;vìâÅ‹Ô4NP¡n(¡ë|4ÏE•i”Xœ»jY::Y<Ü·o_þ’†W_}¦Í‘#¾lÙ2.ùùùuíÚ•ƒ"EŠ´oß^qæË—`œñññ™={¶$7ÑNž<9Mš4>mÁðáÃÑêcÆŒÑP<ÔÍ%žKHx{õêÕâ"ˆHñ[-mµ´…ÅS…¤/¿tÿÍ2=#€å%ïÖ­[ÆÃ›r]JýÕÚ9pÖ\FjºÜƒÞÈïÐÐÐT©Rõïߟc-¤øàƒnܸ‘%K$±ö€¨þ0êk¯½¦Hø»|ùrÎ;ÇS8†9kԨѡC‡üùó=ztÉ’%)S¦Ô GëÖ­áä¹sç9Ñò—v„`àúõë#Ë'œÜ¬Y³ž={æÌ™süøñ.·%aÙ²e÷ìÙc´t·nݸڱcGmOcí¥­–¶°xF Õ.FñB¼23†„!Xø‡šh–·¸Ü‹YÌNˆ®G0 SYÙAΚ[„ºïܹc,=BBBrçÎâ…Eeõ^®\¹™3gæÍ›÷•W^Q0ÈÓßß¿@Ö˜ð AƒájS¶mÛ7fË– é [öéÓçáÇ4Mš4!…œÌ”)ª[·_¿~Ü•.]:(^åÌÂ… 9CÛA»€ì‡íQË"™*UªìÝ»·Zµj7VSExøßji«¥-,ž6ä(¾5u ^‚$‡ ûÉj.,,¬V­Zp¬„ñc×Þ¿Ÿ–ÀÜ€6á:c®&Î]"g”348eÊŽa³€€Ž¿ûî»>ú¨xñâÓÜ€o³fÍÚ´iÓwÞyGMC¡B…j×® ©)R$((ˆä¥M›¶oß¾;vìHŸ>ýðáÛ7oŽlænÞ¼‰º†=ˆ§E‹< R…aÄÞ#FŒðóóCZzòäÉÐ>»jÕª<ˆ8³gÏÎ+ðtd|Ë–-e/ÍÑlÎhµ´ÕÒñ¸N‹-‚ÊPÅ|.R­„uW­Z%·nÝ‚K—/_NM5BõÆßŘ1c4^Áy5 Зì@zöì©!hb;qâÜÈß/¿ü’‡rpõêÕuëÖ‰uË—/!O˜0» _Î646È?üðúë¯kdåÊ•‘¾„)\¸pëÖ­éLš4Iný†ŠäÖ+pfüøñœAfË^…DB×¼!i ˆjãÆ(öýû÷7jÔˆÖŠ»hJ¸‘ÆÅji«¥-,â_K»ÜnBóäÉÓ¥Kmèrûð”ˆ7ŸxNÁ,5j”xÕŒl¸ÜF׿ýl|Sʳ\¶lY¬[·. ؼy3¬¨gåλÿþ»wïFåj¹J¥J•PïPh®\¹ÐÀõë×ç$!áŠ#GŽ ¡K–, äÈ‘ãÝwß%ò5j;vìäÉ“=zôP2ç“rÒ†PO‘"E“&MhMx­Ž‘§)·uëÖ¨Û”X-mµ´…EB›øÇ8ÙІ¤.·Ÿ:ü7Ò‘‘‘\ãFj+ØÇÇçû￈ˆ0 C´V©Ü½{w㿺yóæàêÅ‹ß{ï=|þùç?ŽÀ†Æq*È—/4ˆ¨–ù¿ƒ^¶lÙǬu.ÅŠCKCÚ¤P^²ÑØ3fÌààúõëo¿ývƒ HC¡B…`u^‡VŽ…p‚ƒƒ¹—`5kÖ\²d é9xðà Aƒ²gÏ.ÛDò_¯¬–¶xrÞ译gžn˜%ÌN/”Ný£Tsg—ÛÂVñùGH?V19å6-±ãÎ;¼£ -tæÆÈ×,Y² uûöíKn˜‘Ø5kÖœ9sÆxR"çal³ÈeçÎÛ¶m3®ò©¼è[ý %µ µ“¢µ÷´lBLª8–+i2Ÿ[Lxî%~¨ž¿wïaäÛ|\t2þsÒji«¥-,p2œY¢D ¤,Çвô’˜çÇ”ÙÆ?Ý͞˜j‹x†©öîÝ+ÒVË¨Ê ·;÷{Õ²˜ùêÕ«ÎfñöíÛW®\¡YÔè·|@’ðAAA2D¹å†st…ôpÉÉá°÷y7ànÑŠõhÞØx(‘iAHÛ¾}ûhŒHá_¯¬–¶xrÈWNà%Þ(?Td-[6Ö¼ü¥Ì¨v8õŒª-uGµONÛdÏ ¥§éª0 AÆîW…PËŸœHA)g ‡Ðëß°aƒ¯¯oÅŠ9áˆÐôâ&µ×ç6&¯ @HÒé´îܹZ¾§oÝI9†$°ùõ 1¾g ÁzˆíÇv‘¢?iµ´ÕÒIUKÓ¥K—.Mš44ŽÒÉÐNXXØš5kd³!,\¸pÁ‚’¬.÷žƒ#GŽ„ÏEÝ\‚Á2gÎ,Ò†ùµ îc=i ‰Çaæl"ŽD4hã,*H¶¤,“Ó"Óhçy«pRã3Ñ+p«¥­–þ‹C»5Q~tƒêsôèÑyóæÉ'¼ñ$•KeY¿~ý¤I“víÚE¤Øpž“7nÜà—ÚMÍݾ}{‡ˆSË7¨ÎB EÍÕ^NòÕ)¢ø¯Ì(à"ÖæòàäAƒéMyw²÷ôéÓ2ó Û‘ÍZ`( ½uëV2u­ sîÜ9-ßœ7Ä-k]¡bÖç ¼†¦ÉR)Ϩ*§Î a¥çMâÿp#™Ðji«¥-,fËB­7 ½kgíhXÖlãñãÇa~???n§A Ñ¢òÿybV`ç¬.g"##y„øŸ¦–V#ZÚq 88V×Ü1ÁÔŽÓ"k(Œ6EF)De y.iÐæãJ%ìitx„zÚ:\ÊŸc¢"~­ÁtŽÆX-mµ´…tŸUG4nüí·ß¢„òçÏŸ!Cÿºuë*ä… †ž-[6jJ±bÅèqK‰É;½J¿C‡͘1£ª§¸SËQä¨qÜHHj(Z]Zš“Ic‚³“¢ÞQë8ú÷ïO>h¾OŸ>œ‡Ó.^¼HÞ“‰…öß±c‡¡&×£µ*ýúõ·Lª¹Ñ“œ)¦úÊúÐmødZ;ÃÁoð÷¿ŽHX-mµ´…EÒ€i­òæÍ›;wn£3iÚ4@ݿϞ=MÇÕ"EŠlذÁåv”ÇoµjÕtU›Õ'wÁùZÆäþZ~’Y?cø$‰óIS-T‰:B®±5o~J£á«¥­–þ+ƒ nêöã?Nž#5!HÆîÚµ‹N‡<šBÔdZdddDD5—_Q7W 3dÈíoÅy§–ÖÏ'~`rþz›×C“°¨s%áéæX-mµ´…EB ƒ\¿~]üC#…Raf5^­œÊ(ÿ¥f ¿4Ð2L~÷î]ÎSy}}}uÉhWi³üQc¿ZÉBüZd[&¤âvZIc›'ËgÂs;é!*"óà ÎÈÞOSÚ¢‘äÉfƒ»h5H¿Ì°%µbñæÍ›ÎÖAƒ`Þ¬S¬–¶ZÚÂØ?»Ü#¨Ù²e£„ ¢uF;Poܸ±N:iÓ¦¥ü@T™­[·+V¬Aƒ¢ˆ^½zMŸ>߆ /^<{ö즾÷ïßêÔ©sæÌ!À¦M›ŒÀž6mÚ¢E‹ÆŒ³~ýú3fŒ=:‰BC‰d×±cÇ2f̘+W®={ö(gÉðÒ²eËÐÒ¢ey1•I ÷Be‡ ¢³£ ;z.ùòåkÞ¼¹3£4 È'¸wnà:¢ÒL®: ÁüåÛ†„„hrй ñÕÒVK[X$”–†{iËŠ-zôèQ¤&z• xÏ ˜Y*—_Ž  q —{088XƒÏˆÛ³gÏ–/_¾~ýú&rÓR‘¡2ç¢î5$Ld¡A"Ñ*˜Y³fMš4IŒ‹žÕ‹ˆ†ÊµÎtJéi K&ÿi‘P4æÀ¹4RÊ_7F?*nµ´ÕÒq˜}CÐr]ºtŠš--ÑåR< ã[-ma‘ Ðh5NÒH­'å Éõhà×´¡.‡I³t—±Ä£!Ð…†1nܸ!&ïÕ«W… ºwï~ìØ1"‡“ 4vìXQ:â±Ïœ9sÈ!½{÷†±Ïž=+W‹/îСÄxúôiBÒ(Ϙ1cøðá°e×®]!#êÌBȧ 5|jÐ[¶l)WjVÙ®>yeøY^[Õ(<¥¥= ¥¥MœzºÓäF‰1®¢6ˆd׿Ý0Ö¶t‚äiͬPóèRiP.#4cúMÜÉù:P3¤VƱŒ·>)Ò‹t–É Í‰†ÿºæ+±àøñãôvMM×7BA.\UL#ž!C†Ý»wk…á ãÇžðR;úW®\ñõõE'föìÙ\:tè4~üxþjŠÊ¬<þš/kÌL§@r—¿}ûv²¥K—.®G‹GЮ¦ |Bä’œ9sÑkD2÷"q)±ôS´Å‰)¥šÅS/ýW^yeÑ¢E%K–ôóó£Ã:/ä¤ìÞá^-`äéüj-:>)S¦lÖ¬™v˜?~Ó¦MùôuêÔ©R¥ gÄí-ílï.^¼¨/¢ïe¨@õí¬–¶°Hz0•=00P œƒ$X¶l™ ŒvuºƒF¾:=V­Z¥ƒ©S§š}¬ qê/­¤A£@ó ]7®M›6PqçÎsåÊEÌ\ݱcGæÌ™kÖ¬ùòË/çÎ&¬Zµ*y”Eíڵˑ#Ç Ò¦M˃¦L™B¾ñ÷ý÷ß·p/—’'O.ñ õrk)SÞD§«¥5ÂïáCCÃÎN“uU‡»wïöã@ýJ¾E4ZšK<âÈ‘#3gÎ @‰ö:Ü´ijYùèñAé+qiÈ!2ÂéÝ»·âÌ™3'ߎ¯öÖ[oQ(-Z˜ýb’¶–F!ÃK†UÔ W˜ƒx3,·ZÚÂ"þ¡¡9Ø"-\¸°è÷ÚµkfŸ…ÇÊ-EÑ’»P¡B~~~ІAo‹Ûúé'È ²]²dÉôéÓ Ó¿ÿ°°°jÕª!ªéËgÊ”©D‰Ä|øðádÉ’ùøø”/_þ½÷Þ;vì­€öõ&Io¿ý6ô.ªÔæh´æ tN¨yf?%È2døðá¤ä“O>ù“£ÄÒ„1ÐÞ¡$ Fû9µr‚¦Š_3{žØµ´´¨ ž„«ÓÅ ™ƒâÒ&wŸ§èjÕ•GïÉÙéÓ‚Ù=‚vóT{glŠôFh3 Œ¨"wŽúަ™«RþÔ)Õ ":tèĉãgÆ$~@ç}K|Ö¬YçÎã`õêÕN« L¯^½FŒÁ¶^R.ñ—4YÊúMçÉ™úõëÓ‰†ä¹B… ýúõ5jŠˆÞ·æÎd#­q?(…ºoÆ¥ÕÙÑÆRü&F êÇji^×lÓ¦.‰ZQ¶tÍÄr¼¸F-@ÓXÎ:ßF¯¥‰œYöç¦Ó¤I“"EŠP÷)ÆÔ2ÎŒ=:[¶lÐýR¥J­_¿^q¶lÙR·p^ŸÆXéü´4Y /©úky»ë‘ŸpÆàR<ø ´ZÚÂ"þ!]„è¥ÞA€—/_¦¢ÉÓÂp¤,p…¿ íP/ ¯¸8£Åà°±VɈ"?þ¼³mÕîš5k|}}ù›1cFQ·®jê¼ùæ›/¼ðBÍš5ß}÷]Á h5¦p#J›À(m­ÔͰ˜l¿ã§%…IOoÛ¶­YéSȉD|h#žéË„‡‡×«W綾^’ÏX‚ãIÞnîܹ´eo½õÖ©S§\Üåž„Ÿ9H™2eݺu¥FÉ;ï¼Ó¯_?]jÔ¨ .¤M[¬ñmΨÝ4™z™ÈÆ›™t-_Ñ ­h í×uLVÓH¡@6lX¥Jš?"/Y²dïÞ½'Nœ8nܸ±cÇŽ3†FJ.ÈŠ/.ëô$ ¥Í†bF£E&14âÊSõIÚ€ÌܳgÚ@½9e¬~¥ºåøKÂXŸÌBK‡ÈzÔ÷’ÀŽæSµ×òÁˆàIé†ë£Ý»w¯ñK“x¡A`r…|îÜ9ªê‹/¾HÛ]¿~ý÷Þ{¢K½ áÒºuëd”[®\9~[´h¡­®'Ož¬ÄæÍ›UƒˆJ«-`àI“&A’Þ´4ùIHOç Ê:šÖ~ååË—Ï•+WÍš5é¶séí·ßæSvêÔ ™]¬X1 v5Š-Ê%:M0ö¼yó䋦ĸuIòZúðáÃtýêÕ«'‹&µtM›6åéHYZH›\ur«¥-,’L“–v=ÚÇJâ®Gn¥!͆Nj¢Žôññ1\ÃsËwß}ÿ£U *¥¸Üj×®MX¶lYZ@N¢ÃS¸ñÊ+¯ÀÞDÒ®]»¡C‡Ò .X°€† råÊ­Zµ‚É9hÛ¶mË–-õD5m·ReÄRüX¦Ñi̇Wx’me¼i0£ÌO:5bÄò$Y²d’ šœ•#sræÌiÎÃÛôDô ’†‡<ðAi¦ ,˜6mZºmÛ6]=xð š íDàmĦM›Œá±<ŠsеkW$bLó&.ïfŠNÿ-?¸áüˆ·nÝBN8'8ä×1úO);^„ môúX}ûö¥måé2wîÜ$àÃ-*Nž<™%K–T©ReΜ™ª‚Š–˜åÆÙ³gM±á "©Dt׬Y!˜žjmÕªU¹Ï?ÿÅhúæô³&¯ÔEŠU$/Qæ«W¯&rÓ&“µeI¢ÖÒTùR¥J© RÙgÏžm²ˆÒE&› :--!W¿Oý»9sæÀ'Þ´4=tUþRæé‡"A¡hú°\¥öñwéÒ¥tçµ¢æ#ª¶îرƒoÇ%Nó÷Ê•+J<`ÀD5¬EÃJxZX‘.¹e6ír.ûzÚ@Ð}èܹs¬cpÊ3ÞkóæÍô š5kV½zuz7DNKÚ¢E $"ÙÕ½{÷>}úЧàïÊ•+µÙzœwJKSTxwºuëÖ2e oŠòDW£Kywš'´:M…u*ÁF‚‘ê²Ñ±¢Y¼x1%Gk ƒ‚‚ˆYƒ¨NÝÎI䥅žÈµk×ÌUZ¢o¿ýöÀçÎSÑ5è žàÁƒfL×í‡øÏ—/±dÉ’¤™ãuëÖß ‰dµY• l¡&"4“¢^‰æ°dâë,çrê®É/ 0Ýpå³|§HïI šâÍ™'N üè†oذ󚢢“¢!YõbT÷u¯ºü‰]K—.]:kÖ¬á¨Q£¦M›¶sçNx–X±bš–Έ&þΟ?y>|ðàÁô5cî”a¨2{i•UCãÃÆ_tÞ¼y«U«Æñ'Ÿ|Bµ¢èº–ÀÆ’Ê4 * ÜHœñ6¦‘àZšL#·) 6¤ïi“i2?zô(}ú‰Zz”š‘±ZÚÂ"©Âkž’¤ÓÆ(Pºæq©–Z •=’ÃœŠ„ –æW,­02êó‘ã’Œ!=³ƒ¹œx˜Á%CÝjšÍ0¸Ü\Ë\VšZªŸ»4îtä´*Ö¼µÅ‘‚f Mûⱬ’̉óÖ*µôåË—»uëV¥J:MÊ-í¤%"=|ðA@@À±cÇ\n›"ÎÓrÉÄ…i§´ŽnHªT©¸E>d@ÿ‹¹‘^…{‘¸32™A#8yòäµk×jlŸ,%ðÛo¿ÍUä´ÓY éqúþõ&§‘ޤñÃSÈž›'OM+¤L™R¯ëYŒgªŒ€ŒEéÙé53fÌH~ÊûŸé‰8ý!›.Ç”ŸCZÎTŠ;n˜œ×:ú8Û§?E¯J^Ú\s“(šú3®už-­¥%éҥ˜9s‘"E*V¬¨ù;1mñâÅ Ô»wï H0Ëî%C† ðEfΜ)§‚Þ´tT7rÃê[·nõóóCQ,XPÝõŒ´ÞÜp_Êɺ µKKBiiœ¡YÌ”)Ùî¤e2YU±^¯œg4d$Š3ÃSTÆk×®RÅò¤$ôèÑÃLÞ™oD>P›èÑkc«,,þ<þáµòõ×_ùå—ƒƒƒ§OŸÞ¡C¨»N:#FŒ9rd×®]ù=sæ á·mÛöÅ_ÀQtÃÑ-4jýúõƒµ>ŒníK–,i¤Q4õ”Šo˜-""‚ö—§Ó.UªT“&M-ZtõêUÃqh ¨õÑÖçNNãoëÖ­á+^_ä‡é” YgCÓf9åœÂýùñp盪­DCš‘™…SÔJšÏêú“PWkýúõè¥×§ÔñÜþýû«‡ÅßsçΩ-8p ¬îµ> ±¡AQcCË»P‹+&!‹é4”M%üÅ_”U ¼-w>}Z& hòråÊõêÕ‹2oÆî.]ºô?n˜oM’š6mJ¹-\¸°¿¿¿d3:_Ê’3zôh==Y²d»wïv=r:P…YË¥:´ƒ’³iÕ§‘VzxüæëðÝÃÂÂŒ¨nÑ¢…v`yóÍ7ŸvúÌ7åqäöŠ+´\×8£Nz˜4iõ®cÇŽ°q‰%$’Tn›6mèEnܸB†?µ3Ž@þ4oÞœ,2+“$œ¥W^zä;1>µ4Œaš¸…ŸQõN…¯ÑžXŒkí‹V4#˜i=%×›Vë¯rò¦Ý»wO:õ°aÃtþºFNk-^YXüE@³¨Q£;w.Y²ZèÔ©SÅŠ©†yóæEËÕF®\¹z÷î½ÿ~ÔE¡B…´‚^@9Àð„Ä&L˜0mÚ4ÃrÑ?×TdhŽŽBÆCþß|óÓ˜« h÷¨ÅòÎÁIçØ½Œ¬Y³š½Îã0(7)Î$ióGgªb¹ü¶‰iµ'—ëÑü ïh¾š8q"åþßB[ž™äÅÕ›š$%GŽéܹ³†åQ¼J$¥Q®n]n»ÙÅ‹KKçλL™2ZïTÍ(ù&SÄ6/¨m&Ð${饗ҤI³zõj—{ÈWC몷¢‰Äó»ï¾[¹re£Ïè7M™2…N“$™~ÄW_}U°`AùÓ€aΜ9©JÄ#Cô¿»Á%ío’°0¥…6—¢¥æÕŒ!;Ë’*)Ÿ[&+¼ŽÇ<}.2J]•?þØ8ðyª@W@S|§0ø+pµ&û¨¡|º9dÔi>ñƒ†(oÞ¼™<™G ®šÒ¨-Ç›–›]¢´µzDDÈÔ­nŽ]üZÄÇ5í%ïë\`*¯ÙÕ‹úhŒ  åÁ´Ô-î¶ÈÂ"N@Å÷]„h§%æ¼VzŒjRÍÞpœ —§S…ü¯¶rÈìmƒo5›€{Ukû<'Y™ýò¤¥{OIK£L”În‹¥J• „±%c9\ʇ¾|ùr«V­BzJ½zõdDá|}¾)¢3…Õ‹? KHš Š“‹™3g¶mÛ–~œÞôèÑ£d»¯¯o÷îÝÕzrêÔ©>>>&sŒöK•*UÆŒÑÏ$›.*WÖ¨AÎŽâMž<¹^⪥…SAt2ò[ ‹ x¨ìٳ׬Y“«ÕªUs^¥'&¢1¥iË—/Ÿ.åÉ“yOžÿÚÎCÎÎ*æì<:{UN« ,оxtè€{ŒoǤ’öؚܞÇÂð[KkUsR…Ĥª?DA?K´oZYkŽÃ /:þš#xî¹çèbÃ6r?U£F^½zÅ⪒Ð#_óÈ‘#Pq¹rå2eÊT¥JÚ³@nTžßÞ½{Ó6Éá¡ДmÇý.®1zؘ"›VÞɬ°bª ¢÷W@l´¿¯l4¶ùp|š»wïŽ3†K4 66lX=HÛâÅ‹ã°c†\Ì'·7nŒÎ¯[·®Ëmã1zôh®8p€çʳ¢ò‡n…l0ˆD;}hND…œÎ;·„téÒ¥'4µÚ/O·(˜Ìke©+3uµ yµk×®… 6oÞ¼lÙ²z®6ËVC™Ç Îzº1RªX±"w(Pॗ^2+p&{¥rúÔ©S¤Ù”aõkPЂñògª¤ŽyÙP¿üò˸Ý0(Z}oîÁ“ĺQÇd©®Ï¡ñjºoZEb çÚÎ)©æv8íÚµ+Ø6kÖL¦ãño/ ‚‚‚*T¨ -xq¥¥Í˜6µ¬^½zeÊ”¡ ÿꫯjÀá•W^Ñ'¦ÀÞªC† ‘kÙ£GjR ’tÖemm`õ…Eœ@í©™*Òúki$YÏjk9/³0zFÒ" ;=Všjp[„/{3í³€t¡]€4øM•àãÚ&OBBËõj/^|ýõ×á«nݺѾ+ñq¨¥óåˇœ:uêþýû?nÌ0È«óçχ……ýI)(Ÿ±ò*Æõïß5ˆb¼}û¶y}ŽeœìDÊ”)i¼œKóþ´¹nÝ:(ôÔ©SFÞk,+É[Ô[XÄàšTšB$жWe×Ї·Š¯³Ï ²¡i³€è‹¸%Qô‹ÉC>ä úa÷îÝ+W®Ü»w/Ú©jÕªÆ1—ëÿ74ý“ q”†ÑâÆèBÞÿ4(f&ÿc7î$“i¥™¨Ö¬Y“%KùrqÎAð5GŒ! %ÃŹv"'Ÿþytr×®]鶤J•ªQ£Fzèž={”!šÖ¬U«–Î#‘ߥJ•ªY³¦Öýãg43Mš°E‹~~~È–‰~JñâŹ+þüŠ“çü·ß~‹P|ýõ×eH`z‚ú3¾/LÁà™ï¢mYî|#Zº Èk¢vœ§¡Ã>WLáô ê4hPéÒ¥e1ž:uj²ñ›o¾q¹mõ-ZT½zõ 2ït:j×®MW ¥m"{¸9N±ŒúôðÈipÔŠ¿Zž< kMCF]PMq:\úó>ñÀõë׉ACÔMóD4¶z¸rY¯±ñóÀ¡š~ýúI`«««4ÈÁ¬ò[ŸxqÍ:‡@IsÔ5¿\RGÛØòÅb¦U›Ê—‘,%Åeï!é¢%งÛ˜ýòH[ÇŽ3fÌ8vìX¥6n¹ºlÙ²ÐòܹsÉ òÑHk½L(«%#Æfä™ÈaàaÆÉwÜ”)ŞáA’Ó“'O†±yMç(äS¾/¹ŠºÛ·o_½zõHÉo¼Ñ¦Mc£ûðáCÚ‹ÁƒÓF 2„w'Ùf?qNÒj Å7nÜØ½{wã;,,lèС\"* ¢ÊEÑnÙ²¥U«VÚ]ihݺu·nÝ\nc'cݤ!&J&­ÏÏ?ÿL]Ї–‡rɨù—&Œ\¬»Üv&™2e’Ô©xp¶…×1|óæÍÚAÁ\¦L™îQNw”åÊ•CBs‰.Æ×_­ó2¼ÔP›ÞÚ)i⇩4oõo7þ:fŸšì ó)cú”¦ÔbT2G£ÖâÒ$¼Odzà¡*CJèl¾öÚk[·nýÑ -ÝÕ®gúd±àL>"/¥Äó‚’ÍdÉ’¥`Á‚Íš5“‡F`P×b?xšËoâÚ±ÈÂÂâ¯8jÀ€vƒ Œ¾ŠC4oÞÜÇǧV­ZÚàÃÃAŠ““c·žZØmÛ¶iJ´S§N‡ñÊS¢QG\Ї½Zâ¡[Ä{]¸paÖ¬YfY’¬[·Nk¥±iŒb7cBs)Ck`òîOÕªU¨z:Í\‹-Z¶l)uMÚJÆÛ $Ìè4}ZdcÈѰaCYfªû@a ×¶zõjúôédŠÉI™£[X<ƒˆÿ½ZÌÔùóçåóÇ××QíA>¡¡¡±[`·xô?ÿüsTtÚ´i»víÊC@É0;mY-maa‘(€AcÀœ5ByÆ-QïÚµK[žÉEŠ)´Yž}ÐÀNg’OŽÇú? S•¤%âé4 ÆÄji ‹DÄØPÙĉ}}}áɧ¡¥áÆÀÀ@íÔœ%K–ܹs0`Ĉ•+W.P @=Ο?ïzd©ÓÈæÆ%ˆÙJ é­=üÎÑ¡›7oÅh¾`,üV‘'ºK޹8Ð.çÉ’%3IÐü…‡‡“ó4|È¿«iéâvßÌhÒ)wÙJê”)S.\ˆÂŸ7ož¶‰W¡2½‰¨¥Ú±XXX-íd’‡ž9sfÈ!rpÍ/ýSþΞ=O:5µ,v«›QË2Q»xñ¢Ëí…Oc)‰©Œò«•VK[XX$ h…Ú¤I“üüüú÷ïçZúêÕ«:uzî¹çÒ§O¿xñâ7ß|ÓÇÇgÙ²e°hݺuµªeÖ¬Y"ÒX°¥Ü5ó3ªô'aŸx®GûM#=Z4Îß½{W'å]*Õì.¥ŠF%ÓZ¶lub÷òå˧OŸFN3žøJ^›ª„††’ÂÿÇÞ{GWudë¾Ç&ç @`’ɱ &l“1“1“sI ƒ"ˆœsÎ&ƒˆ" 0ŒM2m°Ýv¿>ϹçûÞíñÞÝ÷7ö74GõÉX!K«þØcïµW¨UUó›ß¬š5gpp0ÌçOÉOì5óö¤nŠ1îš]J8è!€W<.mEÞYˆ†]³fM0dĈAAAüµk×.íïÝ»÷ën)…ñãǧM›–OMk'ãã^ñŠW’~ ðvp ǧN <öë×OùÐöÑò…S‚ò ¼õÖ[“&M‚Æ@t«V­ Çæ=4~ûY^XÕÍrèàŸÿüçäÇãuÎÿ÷‡|Ò€X";v¤Ñäÿcc‰ƒ©*í$å‹ìšÄ±*ß¾}[yX4~”Prâĉ֭·)°V¸ÐBXÛpòŠW’%—Fê5K|ñâE=zúôéŸÈ—‚à!áááü»ö¸´W¼â•”V”±÷…½V.}üøñ4iÒdÏž][ȺU«VŠÀÀÁÉœ9sj>Ä<.ý¦ÊÓ§OÕ,ê ìiUË/¯T '¢yþK—.Ùåè;7ÌÈë+æ•ý÷¿ÿ]™†*T¨ ï#F¤J•ªgÏžTñ›0‡?›¼ üô”¸W’7—†Hkçòþýûyn®\¹¾ýö[Ÿ› ß©ƒû®]»‘¶«—öŠW¼’’Úâ¿V.}öìÙÌ™3ƒ½b>@"3fŒþ É–-d[üÍbPx\ú…È e *T°`ÁmÛ¶±´€r .L:5ƒÇ½ð¿ÿû¿|iãù¢¤ð>€ñJ•*Ñ­ááá<—~?pà€²i‡/½>üù知¾y³âÿø‡70¼’\¹´í ”ÓT† dPGFFà3fÌ—Þ½{7ÿ"ø—öŠW¼’’ ”C¡Ï´&ž>”Å‹ó}Ê”)EŠÙ±c‡xZÍš5Áɼyójò0qÒãÒñ.ÿüç?üñGkœGaã\¹rÅT¹EÆ;qâDªT©jÔ¨!‡ÍßþòË/JÒýºÇ°¦ýõWÍ’)ߥÏ?£^®\¹jÕªi)„·oÆø ׺¼%ÞÙ$½â•¤Ï¥åË$Ξ=;†?Ch—,YÂ÷Ñ£Gc&?yò¤gÏžüÌš5«Ç¥½â¯¤´"ËX +iE"pébÅŠqsóäÉ“›6m wíÚõÂ… :tà8d Š«™ÃxÄð¸t‚ú §ý}vDA¤¥Ñ¾ýö[©û½{÷Â`!Ÿ\«Ó‰@øE•£££•ÔXCH!£-´×+ÍHÿQ’toxx%¹riÌRF¸_6lÈ£‹/>{öl‘ç¶mÛîÚµkذa2dà'äÖãÒ^ñŠWRZŽàB 캃¾>. Y»v­b+¹åOú“¾´oß^^yÔ*ç3=.ïb€9uêTÑ¢EÃÃÃ5 ¬pU´›ÎAù¦K—NŠõþýûháDkIa~öìÙÌ™3©@ãÆUs‹Ù¢/ Xnèùxx%ysiÿáÑXÇ!!!˜¨åË—/[¶lš4i *ôþûï¿ýöÛT),,,$ÝãÒ^ñŠW’ZùùçŸ-­F¿V.-gtA“&M²fÍš)S¦,Y²ð¥dÉ’… nذáÅ‹u&DÚÒØy\úM•~øÁ²Ò,ëׯO•*Uhh¨ 1ZLÉ\Ô­”ž={~òÉ'œ@÷q~¢e?Ù2Z®;wîìÔ©“¼†ÌSëì³Ï>ûôÓO¿üòË¿üå/F°WánÞ¼ÉåÞ¨ðJJàÒ6»bi¾«V­úoÏ•?þøéÓ§‰Ð—öŠW¼’Ô ”Žþ¯ÿú¯ÄäÒÑÀottô°aÀbHÎüùó7oÞ \‹ÿ(‘Ÿï—þóŸ çó{J,]ºôóÏ??tèêõÙ³g´§2†Ót $¾_¸paß¾} xÈÁ[·nÑ•‰U:˜‡y)§¡úœ'OžÌ™3ïÚµëÒ¥Kñп˜x H5j⣖ñFˆWþè\úÿø4ÕM®Äw˜ª€Ú6ê‚Ì|gä><(((}úô}úô‰ŠŠÓN´½sçÎ¥€nWؽâ¯x% ‚öСCÁ«¦M›‚Ÿ¯B,!ÃP©oUË£'ª, —Ï€/&ðµ¾'ˆ«Ç¥ªÐ/¿Y….{ðàÛq´<&R"TþE¹Ó¡ƒ6£ E㥠à¯?ü0~7oÖ¬Y–,YräÈ!>³gÏ_|ÃëyÅ+IŠKƒ½¶}س)@i­È<‚§s)‚ £v3«&B µ•Á¦àóÂoÿ¯W¼â•$K™ª®K—.nÆíß‹{"®ÀݶmÛZ·n=iÒ¤_üeÁ‚¡¡¡£Fš{ö ±¢Ç÷ã?þýïœ?ÿüó3fŒ3föìÙëÖ­Û½{7P@eð°°°£G&‚€#tgÏž¥°š©s"ljöŠW¼â•xCkDDÄÛo¿=räÈx{£AGåÞF O›6míÚµïÝ»U¾|y)…ôéÓë 'W®\ÚÆ’/_¾Y³f‰Ír¾Ç¥ßlA±þï˜òü£V­Z¨Ô¸/Ù°aƒúÖÊxøðaâTõ‡~¨R¥ Þ¼y3ÃåuÏO ¶ƒÆãæ ÎÂ… Ã.ªW¯Î÷ ý7¯Z¾|ùîÝ»õ®O3f¤NºN:rêøî»ïøüÛßþ¦Þä5j¤°ñó±|;¦Ø¾§Ü민).›Ç÷ß0›Á™®[ÅÁÉY³fÉK?-ÊW¼â¯$©’ >¹ÜÁ%äÿùŸÿ VÃÐÂÃÃçÌ™ó믿¢ Ûƒ† ={ÖøsÂniñ¸tüŠÚÄÜuä²ø›£BnÒ#áµ*Ö¸qc)Y¥\Ô„d€Ê0¤éÓeË–5lذ_¿~ñ«Dû7kÖŒ{êñÈEî¯$5.ÛÞCÍ„HØ>|xåÊ•7n D¶ÒôÍ7߬_¿þèÑ£ñ 2¿Fà‰4Bhh¨)olxÅ+^I‚%AöÎæMÊ k»Ï¶mÛš7ož*Uª-Z<~üX,7mÚ´<188xÑ¢Ešîã3qÒãÒ¯Rž={æs¼&~SwÿüóÏ´êÊ•+a›‰ããÁS²dÉ’&MšÓ§O=P¼>ÕV©öíÛçÚk¿«”/_¾páÂíÛ·7ko}Ù+É€KÇælò¾eË–êÕ«k×íåË—9þèý¯Žù+÷R%ƒB+ÙB°¾ÐhjL[EõtVâpxxxPPÐG}$VlÁŸ_½<|øPSÐ;v„ŸÐï¶ŒH¿+u¾|ù!=.ýŠ*ŒR®\9è±1R$t÷îÝÆ ëÙ³çØ±cwîÜyÿþ}ŸsPéÒ¥óæÍKÛÒ×-Z´@ÿN™2åüùóOŸ>½råÊ‚ BBB&L˜@ûó9~üøÐÐгgÏ2¢¢¢´ËiãÆüûÙgŸ¡4'Mš¤èˆŒCþåÚÁƒ9²{÷î\~ìØ1Œ/?UªT<±nݺ=ÌÍž€6f< <–!M5Dé¿ýöÛÈÈHÌ„qãÆiÊf‡^f] €KÓøja388X}ŠBt#¡aÑbq3Ñ£iIT*¶˜.ìСÛfK@Iº—w#IqiWYCêý«W¯Š¾jc¯¾>\ó¸tÒ,0O$‹qÀ‚ŸÂU ° xnذ$ùä“Oø gnÚ´i÷îÝ[µjÕ¤IŽDDD ¾øâ‹.]º´mÛ¶_¿~œ ÔתU«E‹óæÍCŠÁh34hЦMîÀÏŽ;¢2À‡3gÎð³zõê =aΈ?çL™2å‘¿ð…gµ÷—úõëwêÔ ÏÁ/ІÊÛ¬…2oB§½nµ¢Æó .Œ=òoÿZ4ÅdÁ‡1޼KL. VÃCÿÒt ˆWpiu«|¡Gn.MŠÚ?>¦±Á²Ç¥“‚œŠmŽ=r5wî\“iº\¹r,X°Q£F_~ù%ÄÚvçÎV÷~ýõ×€Dðð=µí¯þrëÖ-ˆœ±›‡Bq‹€™Ë–-ûꫯä¹k×®'NpüÉ“'Ð{®B«¢€\îO[¼x1º^c†ÑÅyJáðáú?—pgÂsçΩÇåÕ¯©A47¤ÎüeÙ^®_¿Î%¼)ÕˆŠŠ‚ŠÃWi–7;­ªvC[Aõ©ØÊ•+ÑeÔ“núôÓO9¨W{ÉíÃ\Z p7-îkBÉb‹‹Òÿ&Þ³g˜9Ê´ZµjÜgíÚµšÓVçêÑžÜ%5.-AF"ò厦†S=ÎàÁƒ!?…Ç¥“f¡‰„ot"bX¹re@lÀ€4p¸råŠR • 'Ô´ÿòË/èM<|ðàßUÄȵ…ªmÛ¶)Z—Ãè¸] ­{ß²eËÍ›7é\²dÉõ#èÊñ7n€ºœ,æ†úà¹ZL4Õ ’¼„³Ï%rQ²dI”rº˜’-[¶   `yò$­ja©`°`òýû÷u„“K—.Ý£G£Öß}÷ݽ{÷l’^V,h ~ '·ùÌ»wïîܹSpʰ¹té’V¯@]õƒ‡[qÃ9sæP™ððp8} ˜£/„ÆŒÞuëÖ0gÏže0º8™K¤_ÄCT%eIF}ÈCæ5‘·” M˜o¼_$#Ô™/×®]kÑ¢…Vi3fÌÈ—éÓ§Ó èJwVçå¹ôˆ#äÝÁýùbAò“¡³¶oß>yòdŒ;. ÷œ={¶V"¶nÝ:räÈìÙ³wêÔ M*Eïí Kš\Z…ä2H¥J•Òf› ËÇŽûðÃsæÌÙ°aCK'åN–+W®J•*P_±\ÛÚHFGG#ã&‰GŽq¯Ý±cí,tåª'NÀ™mÔ ÃU~úé'˜6˜iY)qYÍœbµehŒ'¢÷]m ŽÁØE¤©'l¤UPV¯ãà6jyÚÊ]‘T<+ýË'‚C?Z0I¯$ŽšÆ<¯°b|1Ù¦êæˆOïÞ½¥BCCézd‡'‚uëÖå ì ÓU”)•¬Ç¥ãW´ë/ò¯ßIøÕéÓ§#""tŽÜ¤i=óþÂOEƒ5j”+Ýà¶æ{%æš“DY3ÆÌE™kmFŠÅmÜ[½cS"\gnÚ´iš4i¦M›0ŒU¾0Ò°Êß~ûm°:$$$wîÜíÛ·—s‚4‚…Ža„(æ •ÔëìC‡Í!CÕªU5BÒ§Oo.Óoª¨Ñ„“è¬-[¶hAgéÒ¥%J” ŒW½#ß•ßÅ¥g̘a«E±,Û\Çœ˜ÏïZ#[ J&+¬K—.wîÜñÅDY4 õ$.épiº!AHž^§Nþýû¯]»våÊ•Hœæ»²fͪ5#K'ÍâZ»šC&`+ ]%ì°V×kë;1’|òäI[ªCl‘ßÛ·oÛmÁð™ÑÐ#<âÛo¿}ôè‘ ]ŽN±Óx"}*œ±û‹Ï³3fœ4iÒåË—½NŒ Œ#hÛón‡ªôûñãÇgÍšåµX¢Ä¤¯Š+&eš€9Sà'tnÛ¶mµËN•*Õ{ï½' ®T©¤üŒÌÑìqéxÏMé‹ÚÈ‘#'L˜IKQ©Ø¹ú÷éÓ§t–È©F†â~ðÁ\Bçòî ÷ƒ*Ó§çΛ9s¦¦%V®…•mܸñ›o¾QlÛ5kÖ€Ì|aìqÂöíÛtßþrïÞ=*¶ó¦Ù‚ d‚EFFrd÷îÝ?û‹*ÆHæ&ôlµjÕi 3L8W®\… VäAº^;Üå¾KUìW®\©^½:\q"»“qûÂõÇÄ,îtÍæÍ›åT,X/õë××_Tøeä(€K£þ¤L¥ãÜ•)ڮ䈜iSÞ}1ÉOÍ9¤hÑ¢ô©éM@^Îç/Ãù=.h\Z·›¢§OŸÎÓÓûK‘"ET™9rÁ«¡<.¿qmÕªU§N´Õ«WžŒ¥»wïž?žŸ .DtÏž=ãLJ•iNL^¾|¹zŸkˆØÚÖ6ÐþÒ¥K’_¾ó×Ñ£G¥|þ5å/¿ü 2åþ 4¨îóÏs0œ§€`Œ®«W¯ž9sæÂ… WqÊ‚#œ ˜kËF= Ó‚;ÏÇã…ÜFiÒˆ"¥Ð¡4>MŠÒD3jÕÕkºDæÒ  ߀TÐø ˆÕb ð“:uêß~ûíR¥JÁXn3£–Ðz\:~åúõërdýÓŸþD[¡7Ñž@E“,¶?åÚaÌmÿþý¶)‰Ó Ù $S:Qíò1„]ËÇjNД8·…ëæŠàFRÃyDêÔ©5âæAÓÄšÎÚµkW¨P¬Z‰Ìë_CsÑg J¡:tHNÂ4…ØæŠ+úõëG5Þì^9À‘l¢ªV­ªµ¤·Þz+88xïÞ½¿—ª=ÇcÓ¦MÚþ/ÁѳP¯îJâ?ý%„׿ô~ÅŠówÞygРAî’“žÈ§¯;Iqi„¡¶àcH.²6oÞ<ù{ˆWC°¡=‰“|ÐãÒñ+Úlغuk¬`fÑŸ°÷ù‹lgM_è*$ Ë\âf‹,s°¬%<9HkÖ‚Oî#lä g³80¾óÄ …/<BÇVä*É ¢Ó“&M’wL<mÅ݉I£íܹ‹Æ¶¡Ñqˆ' }÷f7˧L.=bÄp¢ÏmÖ%b²cÇPqÉ’%ëׯ·¥ÿ×Áf=.o¦/¡¡¡¢”™3gÞ·o°†`ÒeÿÃ_ž>}ª¹J¾`K·Bà *”1cÆaÆ©y-àó7ß|Ã9rè²ç»<«EÔµÏÅˈ'r0ÜöÖAí¤Ùõ“O ^#VÒõß}÷H)giEù›ŸÎy~åFmݺU÷çL1Ì7>J•d}¡Ÿ~ú©âVñÙ·o_q!Ž?zôÈ’ü..MCzW®\i³4;¯ŒU¥„8bȶñÂB?êZNƒá3xR¥JEU]›ËŒÏ+òMqid„žrûQ"iÊ7ÀlÔ £‹KpõЬ3ÞèùÁ n€TÒŸþùËŒêUMá i¾y«W¯¦¹7n¬­( øéó¯$ª…%ìêzƒA7²ôoæ˜PìDùHÓw¿é™ÉùT`Gø®èÖê÷ÿÇ_„H<{ö¬FþÇ|éÒ%[ItS¹iW×k݇›”‘I¤¡4Âĉ#""èY14Ô7ªT©rýúuލI]™R§K—©ñMôhasòñJüJÿþýºï¾û®/¾Á½QÈ2¢‘/ÓUÁ…D›åçã‹Ù{(iéUèÚØ"%þÞ‚t{\ú÷ºÑS`gºéرc´ÜxáÂ…/^TßÑ_œ3þ|k±Ù³gciŠøÖ­[ÅŠK:õâÅ‹õïܹsù.Y¸•M ?~üøÈ‘#r‡¦§ Y ¤ÿöuÙ²eæÆ &ìÝ»÷«¯¾jÙ²e¾|ù ÷“&MRÐcy%-]ºôPïs«uëÖq  ­ÈleË–5Eðï$BkùdÈT¡V Ë{÷îMŸ>ݶa¾‘¢ùv/ÂOø-½“;wn|ÕªUÿÓ_^,¤’E2ÄĆÀ»žÆÁ,;mN“ÊÚÿÙ¶m›îCõŠ)B™2M´ Ô—ŽƒKÓYÆ‚x–Í=>ocj[î3q7/$à¼Ç #8i´3Zh„=zhhyñr­{GÏ‚QòÆéÝ»7\ÚÆ ¨.à¥õ0™OR–‘ÐXþš'á ?5ÿüÂròäIT'7áþÜçðáÃÜGϒÞ–±4N@xžÈHc¶gΜá‹~òï_|Áw9éñEqc¸ðÚµk ä]-Z¤W‚x¨ÌÛÉÏ” &®áÙ·o_My™O¼þX±â©º+vÐ$š/ ˜{:e–ÁƒÓøÅ‹÷Å7è«Æ¶ETC4lZÚƒPL™2eàÀ¡¡¡üŒŽŽ>zô(bxõêUSÓñCi11«6ò¥Ðî—Ž»¿4 oaí¹†šÊ£M›6 æÏÀp±Z¸Ç™|ÑÆ¨µ–†Ô¨<‰³h-ç¨så¾emþäÉÍnIƒ»ù.9ÎÝäO«îEä¡§NbP5jÔ(GŽ…âo¸³dš*ÁL³¬[Ô6**Jûà"##ušê¦ÛÚ¼Šéèû÷ï7mÚS¦éxZ£Fo|f b²q«çÏŸKŒÆÒèÑ£‘w,G$¨S§N¡òÊ2dH‡ªU«V´hQ¶jÕj„ ˜o¯ïÅÿ¿˜¢aùÖ[oõéÓG(í­eXA ä_¼#Œƒ ’cè 蹃Džfÿòf IxA³gÏJ“ªÍNÿÿ¥Üºu˳mç*¹ÍKܾ}[sžº?´ë0våÊ·b—/_VÌ9jË! ’`Nxxø²eËlžGð¢DŠ 5T²¿ØõZ†Ð»wíÚUþW¹rå Ò ?µ–ú›«H¶ì•)òñ@_¦ñ_X¤^µ_LèP£Œ¹B… ²›y@ýn6TÅŠ,X€hÇ6;wa8!hJ$ï-Qy\:î¢Ðj3+ÖúšBÃÁ?éýµyóf3cѳêßÿôí_¥ý8ÑÕîŠ>µN=z¤ àä®]»GZ9Ž?nA•öíÛçóǦVÑ¿‚_áÐnÔïvsä®}ûöððõë׿ýöÛ $URLIƒM±°¼’ø\ZáImaaló,óÓ§OðÊ‚W¬X1-|¸É 2fÌX @Ò¥K¿Ž·¦bæwd¡à•€I£.®éÇV^Rë  œü©0¶lÙ"”@âÜÇë'êW‘Ö‡‚Ãæ9?µsá©¿ñ8ø—X øÀ ¹–Ó´ÓY‘T£££U:‘Oœ8˜Cã jO–â oÞ¼ÉAzVÑóŸßÍŒƒJháôÿ‡2×S+²S&¤5uä Ü6̧ P[Æ “òÒ/ál¢E3«Y³¦†hüÆ'B¤ adJÉ 9ˆÔŒ;¶C‡Ý»woݺu«V­ø«]»v(Y¾tìØqܸq‘‘‘JwÜÚØ• Es’ ÁãÒqÌKJ)eí¦Ùji~È!ßÿ½E—•Ó¬M*‚Ò®ÿðµk×èD xÔ¨Q'N=¦CµôoÛ½EY¯^½*çdɸ‚ì™2Å’&¥z`‚Aˆ½{÷n7à­¶íç¶mÛx(/Âqî€âÐÛ‰‡……1T0ñxðÜUÐØò;vì8xð íÃâ&bÝàÕÈ‘#ßø”–ø9gΜB… ­\¹RóQ½{÷Æ®±½'Rˆ/,Yeå/G#дóŠ+hõ²l ŽÏ›7ε /j1:âyïq­&¨1ÃÃÃûöíK­°¡°K”(áÔÒsÏ·êMqiÙ2¶Ho2òeœ~"(h™Ûr‘µ¿ä;PoªYYŒ^wS›@)K–, !cLýÑ‹+>ðä-ZÇŽ£¡´·—n êùºÓ­2~µ oJÐÖ¾ü3–¢^¸ˆ¬y»@m7j¡IfÝÁ³;ab£‚w¬U«VžÎ§ë“ùêøìqéßTÖ®¹Jãã4«ß¼yóýû÷«ã”ÍĽмw|19^0ŠbÇ‘7nÐ˧Nâ;’{òäIÛ` =<‡TÛ?€k]öˆ~à/š6¿sçöW³fÍ g>ÿ-Ch¸jgºò¹pž«Á¦gåÏŸÿwÞÉ‘#‡ò÷íÝ»æ¯mæî˜={våÊ•1ìˆ4o§0 oªPóY¥æõë×çEÖ®]‹ºÄFà;"LÛbV0æãØ#`rÊ! ²¤.ànöÅÆ†mÌw]\Ê”)Ó£G}w§Ár㤹ä6I/Ó¤-[¶Œƒá{%‘¹´è–ý„0ÛJý O Nnœ‡W/rÜMÒ³¤úm":((hìØ±^ÞùçywàÀE‹9rdëÖ­¾Nž>}zß¾}—/_–ûÜ÷ߦ)‹8‰DcØò—|ž…{Z¡Uæ§FÅ ài–¹Ï•âKA*#Á§2%B¥•±·£zOžùä“ìÙ³—,Y’šK6…û\¼xŠ÷Ót«R pç¥K—¾ýöÛo0û¡ qX%J”¨W¯žZì.*ùâÜŸÅ»¸tERC; ¤nß¾ì¸ûÕÑ4µsçNŒb­õs®…é­Æ‡éäfFöiÞÉ“'+nÖÔÍéõŸ<×ÃÞ7Å¥m­œaç¢XêÒ¥KcÏ2DnÒ¤Iß¾}y:‡ÎñÐÐÐ3f0är!A sõaBj<ºMê½±a²\«V-º©AƒÑÑÑZ.¤ -¾‡5 _FÃã£ekvô>g;&¤Ä•¯öÅR´Q2æ®#+ñŠ[=~‚šå†àƒ"jr¹ÖåŸ)Gmqâ§m —*± Nh(@;uêÔ5kÖ‚Ö´iS=1W®\YK\ÀjåÙ¤dÉ’¥J•*uêÔ‰ßKL'"k¹–àÉ,EÅÖ¨I¯^½·GauÅ ÍË:% ƒ5cÈJ%œ!CÅ»S[Íœ9sãÆ€'mEŸîÝ»wÁ‚òÂúúë¯9” ø`£®}úô)'¯ò-Tq°{÷î 1MmZaH"Ô+V¬×´7ä“#úòåËóæÍÓwî†RÞ¾};ÕK'JjIš²~ýz0“ù—OåáÎô5•á;åkÖ¬¯¬˜« ù³)“KJVx_Z[®/±ä]‰.ÆÎÒUéâÅ‹Óh ‰2eÊØ@RÚçgؼòÂò¼Ï›¬BF,\¥sçÎ(Çž={úþuÅöåË£Gl غuë xé;€7S¦L¨{`YÔš/b&J¶8iÒ$h’\ª~ïs1Þ ‘ç]æÎËm»téb´\sb2uš±cÇ=Ú¿´°˜ úWAr²[ó´®J²wä;ä¼’[»bŸª/Z·nÍMè¬wÞyçüùó¡\Þ¶m*!aþ\»vͶñ]“4éÇt¾@°¥=O\àÅêÑ5•¤æ"Ã&×÷ïßW„yX›ðº3gÎ<{öläFŸ°¹J¡pO{eK®7`ÀEݤ>`»^ÜV!‰Qéæý”Å!÷oø¿"G‰.ršë7ž8Eô^lbðôéÓ¹sç¦×x5sŠc1â……;ÈÚU‘švm+ˆôˆ#Ž?®fç`½zõ9ȯ¶+WgHäÈ‘ƒ;È¡•Q&#ÈZŒÒÚ^ö€:lذ!C† 8Pi†“Kïß¿_uΜ9é>0– VÃcCBBø¬]»vÕªU?ýôÓéÓ§¿JL<É)à0mÚ´:ÄÆ¥­`åQ Í8Ì“'ªŠVB„má‰WHƾ ¸$_V›E„¬"°˜½RúŽxöì™bGk‰MiÜéb[Õ‚ЊžÚPY?¾õMoº°‰nN¶¿B %Äù<”¿PÚÍ­^vqiKå‹ñÙ°´¶ú‹T%õï“'O  …Q ÐÓz(7Œˆˆ° tšo‘—ˆÆß©@‚§Jj…_´h‘qiÈBdœJ rK–,it2Ö¢E èbî¦Î¡µåzÇxðâK¿LÑ+CêyÆž¥ÍËû Ü – ²ÅûæÚ³f±x–ÄÄCÔ®?ÿùϰ,[Gæ*äȵâËÿ:¤ÝH‚¾0GŽ™ DYKMÉÚæ È/üDRØ $„ÐjN ´Aƒ¢:³fͲùœÛ¤hÒÛ·o[Ê$ÛKb™ å/ͧæCD;}1aaÜ…$NØd°. I{/”˜yýúuõ×îÝ»-¦„Ed È N}´¶ÈsMÉ40ѦW­e¨}¸?¤NÓ#õ‡e!P˜6òu*Ž%žØ¸ô _Ä~ÒòK7Çò† "q v§NÜ“i®É“'S*©-Hêë2eÊ`ÍŸ?_¾‘ÔPaô“ÏÓ¿Ò¥K#DÅŠkܸ±Ö)Ü™U%ÎóâäüfQ† oH×…&•ÐÐÐxß_ffª@Ñǧ­¶èYHœW™RÜíܹSàÏ[Œ;ÖãV§h–æ–®ÐÖXôŒ«üùóñÖÉ`ÑÙÅ[;rîܹ#FlذÁ2ÆZT"­‹ÑS á¬ô Û_þJù·téR&šôرc%kü+VŒ3†vVøhn¿Â掎¦ßy4L@Ó×b¶:t »#**ªuëÖšLb3&¥ŸÊ9BKiI¸´–3DÀPèJ-dóÒütç9Ïœ9ãó»bêg¦L™xº"Ì0åø!ÀÇÊËš5+ª¹nݺ4…^‹ükíÒX=CeÍš5-ÊÞåN¿Ö‚¼h¶Ó¿L•Úµkk'»ᆱ…&LðŤ3ˆ—ØÄý|èA´¤T©R|hRÌhA»uëæ*ÊáÇˋLa¸´^ïù¾Z¡[iD‰†BfÇß§OŸDæÒbS˜˜K¢ÖFºäiiÁâñ\Mnˆ°]¸p¨iÚ´il\Úbôieî ž`ðÒ2«V­’“˜26*ënòVߦ[‘n™Ï•+WvۖƱF<6{÷î•Æ§ËV®\©\Þœ>s‚ W#aÇŽ>'¥~jŽ4îܹówß}7oÞlR•YÎü ·¸=ü”G¨ñ7KnK= ªí‘TsåáæGk€VŽ»/›€‘Ï“rQÆ^­;l± j…6[¬nݺ}ôÿ:´Zµj:È'CËBÚ¦ÖKüÂã!!!Ð °TÑzãKt‡HËåË—•‰˜Oø ]SªT©âÅ‹oÞ¼Ù&E5-©•>XQèøÍïq¹©æwÞy§OŸ>qpiÔÓìÙ³Ÿ{É©—ÁÀ;wÂpÐA¼oæÌ™ù®L+¼)=TVÛ·o_²dÉ©S§IMA`õÀ«é;è­‡šsÞi¶Áxµr¿Ú‘ .—£´k×®B… ¦sæ EÀK].ÊO×çú ´ Þù‹›Èûn„ P2¾¸~õò=°Ÿ–ðKiø”ôÜ<«á$eË–å•¥_´$Ê lÒ¤‰¦Yl¥› -ùšf°ïÞ½«­yè×ZL.­‚a oݺÎCç,XpáÂ……ü…ïK—.•:‹£ü&—vÏŒ2Ѱ2½9{¤W¯^’b>ƒƒƒ!öGE]J9úüNÝÚÀ&(KŽÏ‹oæͤ¹Åp¥[“K«ƒ¶lÙ²zõêÊ•+§I“¹Ø¶mÜÆWÿð—øa&À‹.¤OÁdÅÒÜòûyÉ_øÎiÈ5ã°pá˜ð(%óBÒÁ|9ÂiOÜí]ÜÀä‰Ò !ÅÙ³•ƒj•Puæd¾3Áv0‹@ü™W†-PmmKää“'O"=Ú½{·|NæÍ›ÇÁ”æèk[cþË_4ï¡I-É‘Ün¥FùN‹'¨?ù·ÓnkÖ¬±HJžkÇï*4 ‘ù ¾)&^«V­$˜ñˆ×­>¥ï0l{÷î-×ÖÏ>ûL[ÂU=}QðR}/R¤È´iÓÌzÇ{)¹ž>¹aûöí}±ûxpÂÈ‘#Wâ“JØ‘ l1ÚßÀLëÖ­[ÆŒQRƒ êܹ34eÊå2ƒÖÒûsæÌ ;tè`wà¯ùóç+á;ˆ ŠOÚ,¸Ób4ب¼!ötKimƒM;D´D‹€±é_ÎqבmÚ ®k4O@Fôóä0`~Opï»ï¾SðR% M/^¬›(“´¶btêÔIF‡e¥÷9kjP ÎYµjU€sB"øjò^¼ÎÌ™3sæÌY²dI¤ =Bóû1K–,Y³fåç‰'âÍ¥ÁXé>;©ä§òH,lÕ«W1V`‰çÉ“Ç&ÃGŒ±råJ¥@u ^…ÊD#ƒ<W®Ã^ /6}¤™[Ú‡öÇpKL.-`8UªTÉ@;þüŠ#údA]>øàƒøÁ–)\ÈT OKS%‘”H¿~ýì ¥Kœ’=µVPÆòå˱[ßÿ}¨£$”Ö³9 éPTG4íÌ à\”;@z!N°VE Áäû÷ïs²æ hÆÇþ¢öä ¦t+t%°I7åΨÑ>et÷7 ~5&.’ð8º ôàÑ·o߆?£˜¸-ÃÕ—¶4"TI ¹4cŸ§Ü›PIjÈÓµ -Ãëp²"*óʵk×.Uªö÷WÍ“÷ …/ÆõÅf -¾¥yì¸âÆÍ+Òð.­ï¼3fÌ8p ¶’‡½ñ( <›ø¥//šJÉAÑhÚ´©þ‡‰gÉwø\²d ¬¡± RŸ*rZ8CóÂÂÂm&ý½Ïu§¶cܳyóæ&PÏï=¤¡¡¡ÛA«ùÉ ”ïh{:èPȰ6ù‚{h¢   ŒwÉË‚NE‹åßÍ›7ë|¹@Œ3Fý²sçNËôYäp å BJûËZ¡‘Á7ËgÉw8¨Ó¸ƒ†-¯Å)·û¸›–•»G«Š ª-8‚بoø›Á¯‘aí¶SÅ8ÈÉԜ˅·ÔŸaoÚv„ ¼]õêÕõâ¦Ðs ›@Ù¸q£Ü¡5mbʂʿݻw·­Xò0L„\Q µˆ Ra~Ö­[7µ¿È_Ú¢EÅ1ß—VØçÙ³g#›^­Û¯Ö~%ÕÒf"E8QûÈZq²u&›‹VmÙ²%5D3Jx™ÝùÃç&²¿4Ÿ ,˜;w.O,T¨Ppp0d~ܸq£G9r$uXºt)02yòäE‹?~<Ö¶_7]5/—6”æß2eÊÀÄøW^ &’Ún–ìç$Ïž=Û§O00G޶çö¨” >ÿâò…$ŠúrüôéÓd¨ §´ØîÝ»­•Ü ‰[·nxRøÂOm!w­ d ÈV­Zic,Êe×®] ÜaÝ­°ÕŠÌ¯îæ‰T$ç§e•Òdµmß²e —hë §Q´ê@;}x¦©¹]¹rEi\€¬M›6)^«6à$ã5/W~yS@»bÅŠà6¯o?®¥éz±JÌ…Û¢œÃµb¿|aÜŠ ™°ˆD(PÀ$"~wvA¹þâ‹/ ¯Ú!Õ¹sg¬ÑñãÇ÷íÛk£U%ù}•…)z=ša¨º&[@L< ê?ÿùÏz¢ÅŽK ²è8GÛ1}™3g†þ‰Ïpð¥Eº¨Ñ@NºI W<á+V(àóõë×Á7Í@ÒJýë_Ož<‰åeNõh^+ÐmMÚºuk/Û¾}{ÆŒ§OŸ.Ö*¿è÷ß_PéóG5¯Y³¦\G”ë§B… \«‡lÓ¦ 5~H øC´êÂ… -Z´p÷žó“ƒJò¢âŠæ¡gQŸß—O“l5’¦æ'0V¹?‡¬<ȃn+Ìá¡´*fĈü[«V-=W›°sZL¬ª#÷¸(F6;(,p»ví¨³ÔëïâÒÚÔ¡C‡ÿüs7jA2.Ú¦€í£FÒ–ù)S¦Ø¸´Ÿñ €=zÔµ8xàüÝ»wE‰iÌS§NYŠ4¬%IôÅxÜM˜0›Ø&ñ3gÎX$¨hHäË—Ïvî+šGÁ‚?úè#MÐé¹¾˜)r™f :¤µ¬ß ¹¶½£¡¾ùæ›uëÖQga _øÉA9Öy4ølºfÿþýšÆQÜéÇ+·rTTÔÌ™31îlªPÑB4¤-Jyâó‡ã4²ÖˆQyð+ú‚á¡hR((¸\:`ÊâÕ 9qâD¤àöíÛÚˆäþ‹ ÈCÞû½ì]q{dgÉuD)-RT® Xav,WœYšHmEË@Äàà`w³Þ?ü@‹ÉYB¥¸Ð6ë«^ŸÅK-þ¡¹ÀŽ´xç‹ñ² m?ýôSî¶zõj×'HÈÓ*­ö6J;ëZ—4×¢*MvŸ>}t¾ÀúÈŒR`L-q xRûY>ê©pˆ HýKM›ÁÏ_Ð{Ì|1QF Oœ8­<Ë–ÌK“R7 X”L±ªì]8!C†¼yóêg“&MÐe‘‘‘ò°ìHñ ž—kÙ²%w>|¸ºë…›Õ,'—u—)S¦páÂÚÁ ²©E}áÓuÞžñ¸9U"siºCK-2Ó IGº2 _|ÆÍPH H”EUµA’¢¸4XGS#‰ÖòBWX"¶FêÔ©CBB´X¯i(ËS£/Œ# g®ËŠÕ/ åBÖ¤•Ólyѳ~$Õ `ºé´|þð¶Y²d<±èË–-›)S&8ÊBw)tëÖ-žÈØ0-`]fOÖŠð '…Õ-¶MFÜ&‚0sÃõë×GDDH¡øbvçÙ~sÀGUU³hþM.…Ôç7+ßž:uꀷ .v“‡™É›Kûœg%ŠÕŒ´2Åhl‹ˆYÅc.Ÿ(€¿5kÖL³Í)ŠK •Œ0wU­ZU“Ò|-ZTÿr^Κ5«–hµÜ¦;&JL9mÚ4í‰Jµ¶=v옛A+Œú ”Á3Ÿ~üøâÅ‹Rcs&\—NŸ> B‚ä< ¿à¢ÊA¡â –öó¯ô, ­î>qâ„í;}W¹°mV($=ËÝ%¡œ|7nœ¶”~ÿý÷¶öÇ%h휥ðE™¼#BÛ© l<Ž{ÚþS®½yó&6]êÔ©U½û¨Q£h†‡¢5ŠNËã[Ñ@¡pša8w¦òÚÖA­^%\@ù¿cŠ6oÚy ŠŒJÒªšRFq 6Ìç¤zL—.'€±q¬ïhw¼æ„uó;wî|ôÑGÚÑ U]S+qD–9ãÆÉa ­^½Z 45¯¨ãº›¦}”­+@<<rÜx\úå ²láD–/_.cñ¯yQÆUâ;¸ Ç6/©„-’Swý+åpi‹F+× „‹W‡ ‘–¹©Ö°u«6¨ô”¦ÍFðåÒQºãWÒºlxÁ.Î!ì¬ãn›6mbH(˜¼â”‚š©!¥k¾ýö[aˆÏ 8ïÖêþýû–QsÝnšK»ÖÀÐ+ ð:s×dõs”¾V­ZÊCGýûõë§õ+ÉcO"í¬]N'yç*ò¸´y·nÝdímT*Ø Å ‘‡¨*i¼CÙ(—“Ɉlϔƥ…“š$¤5:vì˜6mÚAƒ)‹4 ¢8¯[·Ž¦Þ¼y3À%«üöíÛQz€ŽŽ¾qãÆ£G€n…nxøð!l\­DÛ‚Wœ,<äÎO pæ>bæW®\•â|ºXÙñ´SØçwºð9é°:u´9s”€`SUj¸gÏÞˆI“& CÔ àCm©¶¢ig?m®ÛL*++V¬ VZø£>*T°ûP±êÕ«çË—OÈL³ìرCÐ4qâÄ·ÞzËüd4Y¤àÕÿûßmY0c**åFQ¨µ§L™¥W>JqQªaÊhƌڞ¹~ýú8î/ wØhj¶lÙvîÜ)öB¿hOw>–8Æššj8[…„„¨Aô ý«W`lhiX3çžG’âÒ‘$ˆÞïÔ©nÛ¶-h€T2<0”4ñ›Éßÿý„z®¢à*uˆ‚Û_)pï¡bA2H´¢jÓ) d‡ø˜ {ö,d»FAÚ›l{ýä¶(ª/f»«2çÚ Û8sS© Þõ‚Sñ–aб´cÇŽ¹sçnذ!** †S·nݱcÇòèèèhð3`ñî4_=xð`Æ")wVÍÿx€™ì¹ôÖ­[à]á•ÆŒ'éÛ·¯­Gpé>úÈqÄOéȃW"†U«HÅ)ŠKËÿAß÷ìÙS¡B sð ÄèÞ½»¢ÀŠÚibФiíËC{¦J•jß¾}2Þ¹öúõëW®\áÎÚ¦¡„¾˜B¨]¨‘ ÀT8}0P¬þÚµk\¾bÅŠ 2Ô¬YóĉR±AîÆ`p}qAoÙ0ÄÆaÆ 1ÄDï`MÐÁ£éúûþ¢°¢>¿C‘«¨Œ’ÈHõòÂðÂ… W©ReêÔ©ÚE1¦¼ŽÑiªÊ…¶ R¸sçNê©Å5í¸qã"##•P ¡úÑM‰¢Ý¸Ô¦ÆÒ9räˆÕ®]»ÛT6-FmCBB7n|þüù8|3¬U‘Æ Àë bê\©9U# êNÀ},Š‹mä—W€¥¿Tö×Öãæ#GŽ <ÕÇ+oœKËŠ„i¤NdV3­\tëÖÍDPéÓ§OØG3ŒÝ“ˆ@ªo¾ùFÙà¨È5eù通3gÎpPÛ è ÿZp¼‹/ž:uŠÖ“aB‡îÝ»WF7ÀaõêÕ¶OáÂ… ÇŽ£‘B„›Ô(…víÚ,Xp×®]U>Al+„W‚ #æ‡ÆïØ±£À|Ö¬Y± öÆQ7¿®õ&ø‹ùìéîìÆñ€uk²@ãüå-…1ÈOËÆ(‡m°H&¾G0œ u\ŸádðY˜?þ|ž t[ú{Š/&ݘG!RõïÒ¥K]ç嬅jÐ iôúðÃååH˘ױl™œ²Ï/,êqz)#K6¬2Túœø$qøà‰Ñ‰ökDÑÔ !¤[ ¥HƒÚž¯í&q(e¸4æ73ž{\:‘¹´$š®ÄþUVŸû[ÅŠ-è:8@/'à¼ôoBºÚ!àà·¼H+ØÆ?*Ø”'ƒö”}òÉ'æ gºéDå !ôSÈes¥°¢\·&õà˜t]¨õD-;js7O½53¬bÅ·lÙ¸aà®’w«‰¹^sœ •ÆâÊù¦ÐåùìÎýºqÿı57b'¨ÍÏçìu[R«¢îAíª9åp.ÝÁ™@¢”/_>yœò9gÎ5—â@ a,òWT²HEÿ©Q‹ç§Ä_GaHEQà>¾4hÐ@K½Ö€J9íæ/Xm¨æ²eËú:3;‚ ôrÐÂfä§òw|ýõ×;wæ/ž«¤¨ èóóº¹4£™E`:y# † ô¡¸!Å”aÐÞE¯})´>`(§ßêÕ«‹RÚZ¡ã;.\˜:u*ˆ6¼î^ï‹/º§®*·¥9K»冡t‚žËA›C°à>'(“.ÔÛfÁÁÁÕªUSgq9G„r~°JÒþn=“Nq¡›á§ð üEeRùËøñãÅöß}÷ÝE‹¹ &Ñà)Ê%Äwƒ!5_µj•Ü4¼1:ääl±‰xwí‚ÔhQe¥Ä`šps~Z"0½©MC© ›©S§¦wäu#}¡ùv­)ˆqó P™aÆYxpÍ4𠹇N“& Z; ùûË?ÝÖ²žÅMðnß¾­áÁiyóæåyw•YÓà ®Y2:‹6T¨;S[x/úHŠÝ¶Ïµ­ÛVéÌÒ¤I*ƒLâsi¹H|´á—± …FLêÍ›7¿{÷.†¤jU¯^=K¿b‘W°9žÑø[¶lÉ!Í^¹reF#Àk2 ¯[½zµApèÐ!Ób÷ïßÇ‚6ð@Ž?n$©Y¶l™IÇ7nÜ(&¯™ÿÁƒóhóô4XåG§Ž=Ê ÂC89:ݶ«ƒü“&MªZµ*Œ:gΜ ÀòòÅxP€E€˜&5¿½yófÃUùþiš]kŽšoç ¶Ï+ÐJW¯^U‚Eµ€&lº8pÀê¹|ù2*@!F###©! ±E‹´’è4Ÿ›îm~Æåür~‹-üuÂÙJzw´|‰ŽÈ”)SîܹwíÚåÆÄV:Z;qÄæ-((¨téÒ Î¥±òj×®+W.쩈ˆˆž={ò áÇ#Î=zôÐj7Ág¨^7—€t ñºûK+Vî–m¹ÌùbÒ €¨ð®®]»:TÚ°hÑ¢QQQ4;DIä­.\h³©\ĉPñÉÝÎ;‡ ¯áqà—}/½¶×_ä ÍA þ¦éb _øi.Ê(ß%JôîÝ[žÌ¨f°TYHRª!–%-¿½wïžÅ‚“Íž=ûãǹ¼B… òÔÏV­Z‰‹ò\>6l×ôø™3g¶mÛ¦u@^‡«š6mJûàh£÷´iÓì)zeÎA Á䮬(èrÛ3¼š5kÖ¨Q£vB9àáØ,¨9m«(‚\B7¹ë,šN—?¿;ÞhÿçÙ ›ü…Kh@çÎZø¦†6l€gÊ=RwS›uëÖñ.7öÅø>ÉC^LX—U™tš5kæÆÈzù¢˜-~Ô·Ûºu«k¼°ÈØä‰Æ‚/& ©rVÚÚ««#ö×XЏɕÖ;Œ|j§¤ø Ö Ϥé9ðFrµXÛ^»v­}ûöª¼N_$5I-4x\:Þ3!n.uS»à³^9E§ =-à³vŽ3˜ÅBÉpik›7o§"Ïœu„nÁÆÍ kñâÅ.ICØÌh€mË£;tè ä¹råŠþBXÖÞŒqjîNqà Óä°·oß>Lf½‹mŠd\iM»fÄÒå*&oê™3g*GÏ¥z·ýEž„DïÈ{6á‰üä5•:™¡‹Fм:À­hx>ºFÀH­ÜÖh‡#F\¿~¬^¾|yÍš5a#ð­íò¬†Ý³€¥´p"LÓJ<Ñ "^ŠJ¢Qî’VÇdðØì›-ê èA¶lÙŠ+¦•Ù„}7Ç>…Ÿ(©Šò"nh DC¹ 8>Kë*9ˆ%B*ˆ˜5u0Ÿ@èPšéB… )¬4„ÓVýP…tİaÑgÛ‰†?þ|øáóËGB騃Îf\­5”CÖ°ÝdœÛ*tÃöíÛìT^ùìrUHd X.r*Ò‹ Cî+V«€½ØT†ŠÄºmðÓ¾+ƒ¡ôÅ‹·lÙ"ÈÕÜ5ªÄåÏ.¯+VêMŒËÉÄ箬…XýÙ³gÕ>îJœt¨[m5/%€!0¨ì´óçÏ.\¸xñ⊻âóǸnÒ¤‰ðÓœHõ #GŽ sæÌilÓTžªºàèÑ£È{•*UP7´[ûŒq®=­¢ÐòuWÈKǯ@µ±N™­`}Ø¡Ê?R½zuZÖæhm×öpß¿î'²Ù§€Pxˆ •"óVž¨­Iv^¿~}µpùòåAÎÑŒ7# ‹É_ëA¦2TSâ\Â™ãÆ“Ÿ˜Â„nܸÑïvêÔÉÅjÕÍb¸¹ôè‘T›fW¬¨Ó5UÅÛY|?½Z€8XP\×B”Þ´*1u@ ñŽãÇ×Úb®\¹Þ{ï½@¤y šN UÒV.Hƽ—$¡ŠšZë›>ÿB3«GÞ›>ÿ6wÓ¨Çf“B §› ,('¥‡è;v ßÅ@$\AAAŠñU­_7Å¥‘åýû÷Ã[`­'Nœ ¯¯hÑGû¸5ÏiøŒ¼·iÓF±cÇÎ;qà€FÉ’%ëÕ«ç:b aX{B¹”Ržó`"ÔQ}zZXXØÊ•+—,YbkFp¶¢E‹ÒòuëÖU\;Luø?•÷Ðo4 ¶@*ìîÝ»y¥Óòù7¯ÙCÝ9dåÕ|£Ø¯²œ›Þ1Q T m:`À€¼yóò¼>Ü›ãª$z!ax—д°PZÚ¡wïÞâ•*U:xð Üű/@¸Õ&¹O™2eйt´NS W³E[Õ&tMPpùüùó“Íš5ƒÕë&æT¬vÃâ­±žÖ¬Y#Õéù·… 2CCCc;ßÌÌ¿üå/¼fXXØ»ï¾;iÒ$Íó›;wÀUœé.­Ò€¼fÀÜ©èq°ã&V£Â¨ozA®PðCÐ@RœÔ09ñ¹´JÔ\42Á)A€H@µ¦nñ"<.ýòeÆŒXéÒ¥£aù²hÑ"°Eã\Ò!“Ÿf†KKBª]0wÕ œºeŠŒÞ¡û\Unþíº3xÂS t(„Y½i–Ô™3g‘sçÎ!q€!Ø‹ŠÒó õë×ó¯:‚>¬ÍÂô¢„Lùb6YsV6òŽ(T¨²2%B1o1D»ÿþ ”;ºbJ`PC Á.¸¨ïýû÷i :·oß¾tÜ Õ¿ÜÀQ4!í ÷ßõCž8öÒ¼@%·â'ü xäÈpÉâc_+*õÅœ9s´nEe†®ùU™Þ¼õ¼yó\jălÞ˜w ÿŸþ"„ å £#°eåΖ‹ÈŠ+®]»†Ž/(¨­º95¶½‡´ãVDZÎêØ ¦ƒørüøq½¾¶Ï` Ìœ9L?~|ݺuçÎËANSÄTÐ^~/šë«G¤$K—.åM¥>øùÁ¤J•Šúª+¤·Uk`F}öÙg¼Ô§Ÿ~jX´;ž; é5jÔ`dË–­bÅŠ³fÍÒ6ùß;5'fÛ̇JK*5^lë)úB=Qg;vì`ÂçÕA2Öž§I6ą́` !¿ÔÙ²e´§­Ûº9èãàc¾˜Ü1˜*T•éÑ£G·nÝ´R–ÔIŸK+]¬¥aÂ>Ö¨@êÔ©µŽÀ`Î;7¨Mcz\:Å6 !Ëòˆ6[kT[³µ4¶aÃÛ<^7ŽÑ« Sq³2}õÕWHŸMP+i¬\/À @)ŽÐ®]»àÆ B…Áðš@ňsÆ ©áìÙ³¹àuµð¨©ú‚Ê@2òFËŸ?¿ÅÃAܨ³NPM8'88XV²-ç;V–C°Îuÿ»è/¦¦/^̵7«:&(/ïŵœ,_+§ÒkÏih¼™ÿè8~j&áñãÇׯ_ç»Ùû0Õ;wÒþ¼¾uïÕ¤IÌ?Ÿ¤ÚòTúüqDµË,{öìÕ\¸-ÿ“d×7y”°°0­k0¤–KÓéˆ|½zõ´ê Ðú²§£ÍA ¥/ü£piè ¦k¥J•´$Ä‹(žÛë.¼$ª ͸qã†.Hšü4w°B‘Ä rñdÉò¦+W®"»'Ä 2¹iÓ&‘ÆÆÄÓþešôÿò¹q0Ž˜xT•ŠvÇãËvSrsF»Ô ­jZŒÄzeœ·mÛÖÍ[ѤwÀv Ž@fÐ(¦ È µˆ‹ É¥e1ù8ø¡í“eŒÑÅnŽc?•pùÁ¥­ÓÏ.]º0<@9:×õª¢ãÊ•+‡!É’ùÂxƒÉ•KkAË[fG(¶¼­ª¡fÆ Í›7Ö¦{P‘3±ôQrZS›ò®Ñ}Nû‹F/Ñ “®G0ÌÀãö«V­R¸QÝ ˆ >tòR!#è«?h‰ýðÃõ“Jrs-s+…ú”ÃÆæÍ›u¦ü"´"©|Œm m§ÅŸÔNÔ€* É»ó¦C 0(Ä®ÃÂÂP£@±.—L‰í¹ã†¼¯Öµ0 ™”·3êƒw”'Œ†‡r*¨’3gΠ¼$ƒtÙÊ•+eQyᡦbԼ๠;#Ò¤IÊ~N¹zõêìÙ³§L™»¦I5{¯7fó‰69~ü¸*söìY”¦;Cȃ´ iV*ÆU:š‰’C Eþ§¶tœfo0c©ØóQ;äNƒ„õv[׎ðÊ—KËcN-²ËŠgD Œ Eƒ ¤a“`L<‹•˜P0˜5ï7kÖ¬iÓ¦«x´õÔmiS§NÍñ××E"ÀÓy–Z’RªT©yóæÑ\@Ü®]»dcj?õ˜1c, •©4O«§@]ÕbÅŠq“¨¨(¾ßºuKsM`ìÔ©SmB@3xÈ£¤Þ]éã¡ÀÒZ$„¨„¸*ÏO‡[ ´ÃZÛ«â?\«¹ ‘ê‹/š×„¦¿ ‘rðã×rš|çøÂO5Ò^EùœÈHç „–[‰ÑM(,ÅYRz¸´äôR ¥¤œÚµk×4™¬)åäˆÒ‚ wl2ŸGôéÓö+ç@Íip²²Ÿ‹ƒ ±ˆ®Ô%ÇPžÂàá4Ä"9–¹§ˆ.úE3!]»vUŠv.¡ƒ4½¯°«TŒê)Ò…œR98­§Èíyóæ¥SäIºÒ×\ƒ!·ýŒ.OÞVŠJ-þ싉ªªàTæØì.q*ÚZæ7÷ÞïâÝ'L˜æÐø¶‹ÖÍtc¬[ºYËž=;Ã~òäÉØ´ ìÑFÂ8žèš‡ªµeÀÐÈpò‘#Gj%]ž tbbÎN¼ŽÍnÅoÖÅ+V¤žX»æÛo{ dÙý®¸UoÄÇÃ4¾Æ2+”+µº iÕÔ¢Ì3Êçd{I–\Zƒ÷ÕÜ…ÂÛž>£‚#kŠônQ}7n¬µ°FDW‡Z4ñF_Œ•ÏIæ«ÐO ËoÆŽý4ñq¨®^½Z»{#³^åò,ƒáŠïÊè•]t˜më¦èÒº'绹 ]ÿyÑBÙ°æáƒâ±ÿæ 7›G²Ü©ÏãjvñO-†ºâðSu3° d!žæ ´ŽÀ ^äY[|ÞÝ‘% èСƒp½iÓ&ÜŒ3°Y€q öZµj•/_~þüùJ¤h—??ù ®·^SÍ©šZ1U”!Ó^M-cÁ÷¯{a,\’íïöʈK¯_¿X†$>H«ÖRA ìSþÊœ9³´pÆÁH(.mÃ^ I<ÀR–,Y¿°hlO`G! ~o¡†rNÀ‚†ÚÉ- »Ã ƒã5mÚÔ0gÍš5@'¸n@™4¸âÒ dlIÝb Kû·oßmÈã4±‹æ¶Â1C†K”¢Å¦øìZ'ÒÈ‘S±’¶ÀC,ù 5©õ)µ¢ ¡v å¡)\ƒGj"îFSh£“ÞH•¯…ýT=€òôÅ8Þ‹ëBn¥dhèV<]þu|M)R´ùcp7[NUn)ÙõTÞ6ƒÃØLñ1éPÚ_sG2¾D¢Ô2îb¥a²öÙÓªßgÏžZ·nÝÒ¥K«»a˜KˆgPPPΜ9³dÉÒ»woÌ.›µÐ¨Ý ù:}ú´Eqo×®;è;nh^ ºüyß*)AÍfXÌ:å%Ôܵ B¦-yùòe­øÇ-’–/ŒïH âߥK›Ó³ŒnÒYFÊëD#hw-jáÂ…–oÑvµÇa ÛF`i=nBß™”uêÔIhØqðÔŽal!ùUÇaMØ*pëÖ­]-)'dmtJÊ\Ú^V éÒ¥ÃÞQ8n—Šh&ÂiŒ.~M^.IŠK+•ªVÓí1ሠµqZd°J•*–ÚFÓŠ¿qãFA.—?ð×_M#s­¦ ÅåøÂOó}bcüòi.»wï6‰‘V­Ze ÷ôѬY³T ÈQ&PJëAà!ï²xñbË""ƒ¿xe”ÈòåË-ò?c€Ÿš ל|dd$À"©a0ìÛ·ODWâ)o4IÿÊ“P×2º *$o|í[Q’),²ÚkÞWȬ69wî\TT”‰Ož«™±zþEºå[N—Ñ>˜9 î /µ` 9…^Э#–¡åø}ḱ^J©ÝQqéÒ%Ó¨rZ˹K4IeáÙUúöí«¶â-x#˜ƒ$îË/¿4}-gW$…Q%½#(*ίûؼï+U¨ióf5h&Êc¿,.½wï^$æ)½Æýµh®A‚Ž`x`, žÏ†öƹtÀ“£ÚÓ6N"õÿ{wú´oYx~:Ë$¦3Ѩ¨ˆKdSVQ5È*û" ²ƒ²) *JE–(‹ à}*"Šb\Ò&“‰qèJ'“îÎÔLÕLÕ¼éy3À3Ÿz¾õ;êê‡%IWr½xê~îûºÎë<óØÏc9î8†üt|Ն€›l²ÉÎ;ï\8¢1 À~ì±ÇJÁp<ðÀ™Ò7¿ùÍê¿ÅvR¶o¿ýö’‹/¾ø#ùȤ¢àÀ£ê£©Ï}îs•¦ï›8m¬ ÍЮ}ï{ßÃH …Ì{‘_óHT)¸á«—^z)æTp̤¸Y,åK_úÒg?ûÙ§½”èðÁèx૯¾zâœMl·Ývû/«µdà 7¼öÚk»³ê|®óBÑvÚiY¤È¿ƒ·¤ƒõŽ?ve}F¼§œÔüã˜óI Ýn»íFS*»óÇ@á{ÜêÒöØcå1wŠô\€3ÙßK’­wêAß{z$¯yYúdgµfŠ .c*âH“CÑ» Ê¶Ûn›¥Ùe±jM­'UÉ–7ØPê4j:òÈ#Ë™m£™0†=è ƒ¦xÂ?¥øvçJV·ÕV[1ÊÎ>ûì-·Üòå/¹¥=Ñaþ éÿ宬V9Ûwß}AO‹Q/ÙàYg•zð/M—,Z¢ S”®ËP ŸË“½ð Ç7¸lÿ=¨w¦íñh“sÒÿN¦6áˆ[ú˜Lì1Nit7Þxc”žE9ÌSÊš¦RW*îäü’þÖ„ñ"`e}&#ÍsBsíb&1ý¶Ü|ÕUW½ç=ïÁ”Œ?•:r•ø©¨!#ãö‰!rm×]wõy›m¶1ÂTLBD±ÇFx*]:å¡Ê¨ Y8 5Ä+¦g’éŸÿüçæé{x ¶•Ü7 ÷Ð¥'¨¦·¯éÌ2¥ ï-™à%(ÿ)”M`Ù#Êóe—]vÓM7Yiga>¯{ÝëBì¾ð…¸‡;ì°‹ þùé’øu4þüÿ‘Úÿ4g@vmlŸæ_Ñÿ½ëÒð¼è15zÊ)§Lºž²ÿ|téåÙYÜòðÃÿêW¿Z鳨øÃþpIîÏn#c¤t"Øøo{ÛÛè?dýå—_þŠ+®À“'À ã§åѪ…ÔD²–ìÙ˜±'ñ ã6ùcq§ž%:!‹Ð:ì‹?”‘÷TºtKÿÞ›}*¼¹î¾ûîªö-ëù4òòse5æ9Jß3ßiQÓó ³]–;[2æCNgKxÅ*cqYè5d,Úí¶Ûn| ­òsø_W¯ûšÏ¬¨PRl›Ô1w~iWkn"¹yÜGIæ°ªºï¸&ˆ‰N‡ç›+¯¼’4ÜxãÉ©=÷Ü“í@só,ýœž[†9h‹*¹Ïgfš ¸YX£kW+öñ…v›½z ‘ÕèWÌ% xú¨`KŽ«{ûÌTA›P(OvÔéR–VEºÌŠ¡A”œwÞypêâ'Gÿ£Í A¸î‡Kë•%÷kï|`<¦{ŒþQ~h¶ð'¿Ÿa²Ï‰ñÝ-ïüg®K§ÿ õ«¿ú«ø6ým'›uà 70âÊ2ø—ãñÄËÚ)i€33ÌAÆçtÎ%3¤>Åëå æÐÉNh–%î†ÿcõÊË=ýµ§Žzú^&- *œlê‚VŒ.ò4;8'’˜Ã¯ýÚ¯-“Ú<^  ¡5 ¹U¼öµ¯­âÊ"|ŠŽFÈD²Æ‘žÖX¢+Õ ;ï¼s5ÿ'ðþÔ¬Š:Íöë7V/JIGÝÍ~ŸR ´l¶&Æc±0‘ÖDMŒ†ÙAáÊúέÖXJTz¸¦×êÊ¢hI…Ò­¬¯”òþÃJ_z1#Û©ûžF:lʶ®¬¯ä9vG²f2CgLš60zÑ6ÛlC6åçYѵðÚS®‰7 ¯÷Cû<˜3–æLµ3Éîñ÷¬³ÎªŸNÓë, “Ÿ¨Óöq<íéá•vqm¹å–FóÍlàKbkšÚ<üðí«òË&¶¦nÉÊú\ï­JI*q7xöo|£Ÿ¾œæ¬t¾„ÑV[mUîçÒ/šÜdÂ÷öÛo¿îºë*„UÎBy3ç•'4~¢9\·÷‘kP1[xÉp UìÇùçŸ?æRúÌÓÔ¿ Ìà ß8dާÓ=&à短.m¥ãK·¨JXÑ`{íµ—u%ñ÷Ùgsø˜{÷¨‹5 ÄInºé¦N8aÿý÷¯¬¢ëÀŒ/Quî¿ÿþ4+z^©àI²õž{îÉëˆõ1â;ì°p¾#ø;W¯˜/Ýé6[SI V6ó¹ Þ…:ŠÄ®aÇW¿úÕï~÷»Õbr’&kÀÈ82H¥{®¸â Ê[d[pugau©&ï0ó‚â hæ…0ñoûÛ%È{õ?üÃ?¬[·®ÖlnËmR@K%þ0œŠK¬¬–¸ÿüç?¿ÝvÛåg£1bPMaNÓ¦Ò— á³ç=UîaÞÚ–é-§Ÿ~úÐõ×¾ö5ó}žâ£Ö Á^üÏ«—µ” ãÚi§ÌŸL.»­$Í œ &›5†Ãæ›oîÎcþôOÿ´"-¦í_¿b\žRÿê¯þʆŽÇ æ€m>.<x/¹ä3)YÑ~ûígž§v~B…žDòƒ:(§Êf›m–Ÿ„Õ÷€z‹-¶øÀ>€Ã²å-­†éØm"QÂkêþëõß‘.oØq¢Ÿ¹á†¼ëœsÎ9÷Üsßüæ7ÁØÈ³Û=üY×¥s¶üÙŸýiâñ7½éM(te}ƒ¿©VÉž{îù Î Ø]8 2ÏæŸÎ<Åmhìi•i5çw^z8&éKì1bzÉ›]Ÿÿüç‡~x–›7€NqÅTépæÐùWaø¶Ë{ÒÜÃ\¸%yQ°YN]üùë¿þk¿–Ø‚¢³DN:é¤xÀëþôy,eüÛ1 ³4FïXÐ5úÆ™sûêµ²¾ê²Ô{1Ir/Z#~åíÐ/?R‰66¢Ê$[@ÃfÇŸ` ŠAÊÊ0ahLá/€­3µ!œ^¦^Ù”³hÜ]tQv{p{U,_í½ u衇"™ë¯¿ÞаYæHßwß}+Í‘Óû'?ù ŽM%wL†Bx×]w…H»îº+£léú˜ƒE Ù~yæ™ý»á†’¼`òŽw¼2ÐÏ`âÏ‹¼´›1{ÓNÁÁ+vÜqǼëO…磙O*ŸÙz6CfètŠx¬¬æ³Cé—½ìetu¸,GÄÉ^ëøà©Þ›57“@<òÈ#ó±/Õû¶ãøã'3ëæù4þäÒ0Éâó¸¦ ¡ äÕ÷þÙêÒmw%|ƒ0 ·.숤.ölï½÷fþLžQ5ñ°2„L„ù‹›Ñ÷ É+í‚1Kéµ ÙÂçqk ¢Žùê!2)«ãm˜«ß믴šjJx°\©Sþ4ÿ†q0Ûl‹ë(@ ËK“%žid89} (oírôâ{dî]‘ƒ/—MHKNYs ‘Üb†*¬{–áR^ZÁÄûUŸÊµõÖ[g‘EYéáŸX¯—vOºwñÆb]ÖýØ#‰V1–ŠZwÂÛ¯“²¼¦–`iõ³YË…/ e,øÃ$z–ub‡Y íÕ…1/OÌS¶ äïÀáÒK/µMh³£´,¶ÉüchYõ<ßÔf/:ñÄá-¤}Z3ÿ«.ýÜéÒ+«5þ‡'»6Úh£A¡g·>ó³¥KgÄùpß}÷•ý”eºÆUUÃäsýBü™n‰(jÀ»coÒTQî&Fñ¨øg%£#ÀŒ\*™Ð…oM\ëøHÑõòÜ™iãEhÄL®ÀæR>ó45ñú˰<Þ tóÍ»Þõ.«cqO½¾Çî&¸Ë+èNfeÂuβðqvùàß§‘§øÿü °œÕå˜:umƒ 6`J‹Ø8ø›üØtiÅVçñqt›O ­d E &\ ›;—E_ó£3ÍÇL–ÑMþVæu?÷®öºàjcn³Í6¸%í½Nä¿í¶Û†·7Îäþç,¨Û7õ§0SÚ3c©d7Ú1ǃޟU5Èï¶Ûn\pïMrB”¨vŠúЇ®»îºÊJÃCˆê§JÛ=_zÎÈ4¬½i¿â¯ÀùS9 l¼UL¼QÈ!*h@cRêŠTy]lmë ⥠sœ~' K}`D,Gs†ÿSN—rè]vÙe@šBÂ$‰ GMúg^Ç£‚fqÎa‰1¨³Ï>"±ì _q_6"{ö©zVþòW}HM&8Ô”'ã®ò …¢ Ö=1¨f8 [Œ’!gZHd;'_ñüâT1½~ðƒ^xáä£j3ÕÈn–\6Ñû!ŒŸ–E>øàT´3y6&X†ëÍ”V\¬þD)|ë[ßlœ:ó+ë˨þÅ_ü…ÉÙý¡Ù”Ýð%:mn›l²É¹çžïÝsÏ=“³“H²¤ÍÜ þð‡“¥û•d±®`E“j;’†OV³s(gHóLŸ¿é¦›šaŽñú_çèþÀ>Ð9Ü4ñ–NvÚDƒ²˜yêÏþìϾÿýïO2ȺuëJêo¾ùæé}ÐáižbØ:«ÍRάÚœŒ…rðƒ|)öI½¸÷šèÄ%äùOÿé?!™áiSE0TÁ¾&øÐP?Y½Æíðè£Z£µäÜþÙÏ~fÇ‹ôìŸüÉŸ¤Ûƒü¿ÿ÷ÿþcû2~þóŸÓs&G»+«ª<Í4í‰oÜpà O9唫¯¾º¹e–±[³RôB(¿í†º€-}ƒ–è´£pÔš]Ó…]eåŒ|O™¸£è´Šè¡PÞ˱Îf׌O¬x°‚]#‹öœÁ5ÉÍ št¹,¬I@h¹w–õ՛à ”ÕOÐÃÈd.2§eoy¶øá,·¡³ýO«yAE) µe‰†çT—öjò~Zf¾‚ñpšÃ”d¬ro³²GwÝuW•Äè¡S ­Ü´¶òàƒ¶´£Ž:jºMµü±vÝéÕçw^AP49‚ÿW/8ÿ’—¼ä·û·÷w×T§/aS2gÂ)å%F2ì›ü«e‹¤<›0ût/…§9Ï–RÌÞò–·Üyç××¾ö5˜‰ùÀô‹áOì4:¥V…3Ãòo½õÖAWœ™:Zlp†*£od&€ó¸9gq¸Ù÷Þ‚?WEªGL-”^Gü=òÈ#‘¾ ±;ËkV €{—èñïà}éK_ZY”ù*1Ú'L÷Úk/Ú€§Éÿà?Hœ%»!êp?üЉ‘‡<¶ V#¾1Ã3ÏùdÀO9‡6Ëbà`uØa‡ÅßZ…YÕÆ×ã᳟ýì’ÿ/«×ü«¤ÎÝþûïïß©IÛÑF·%ÓéH^ÔæFÛd\Tÿc?äCjh'ñçøðñÇ¿²šVœég³^´zÙY{Dä-›ÑTµØ•EÆò­HülÖ8a¬w¿ûݯ|å+Q\.¸*iGn¦ZªE:|Èdàp{çþ'–θãŽ;rÎ/ÛЯ¹P=Ú=X1–£ “Åcm½a,VÍ`9öØc“¹ÌÌèšÞ'ÍÊ™X–Γ& 4uý òÏ›.Ô˜%cŸûÜç°,¬;ÅǨhêÓs­K× jeµéÛ¿ù7ÿf:kàd áàV^œdª ç2*ö‰/J9Ï!píêuûí·ÃX|oThèíó ^ð‚ÓN; Kœ >|á _W-††­Mã*èj4¼.¼¥Ñ³ÂkU†ç¾,}µSÅåÄbbáÛ·¿ým”å6pÀ¥-°ó¸µiPûÛ3'^7Úh£ßú­ßbr"ÏJÙSª?ùÉOŽÒëícÕ×\sñc¾ùË¿üËdi›žÁ„CxìèÖ =†Ízu½ -ð­o}«WcbiSÈÇ­hH²Ì‘¥7±—)C1v ¼m¢AL#A`gýÅdpæô1¢Ã‡µÚ…q ùÒ«MÕSn‰›¥Æ¿õ^±dS eOaûã?þcŠë’ùŒßÀ¯&9J{íÉ&”+H>ôÐCóÈä¡»ÓK‘˜YØ“IÞ‰OJ1]4¬ÇAì,w2@BÿvL.Ê„Ñèx¾ùÆ7¾á6ø0§HZú˜y‡)u4˜yÀ|á _H,¦fãÌo{ÛÛ.½ôRK˜^ Í m¥~¤Ì—£ÝùÝ4^j€“šºd5¦ÿòñ›^5£@ L¥•õIîk~'MÆ å@-ÀÙAÍgé·ôÈgcç†Óã8ŸÞÊú~m9'§¼›¥ëµ§e<$üGzÔéç(ÙFѸHpˆž\rÉ%^º<ôì§çZ—þõ_ÿõÏþóOã&‡U5åÊ2¨—îÖ[oáGà`¾,Yƒ£â]ŒñÇ hJ˜CG½¤áä¸Ö½óÎ;ãx`ò‡ø‡¦™3 x„ cõ7Y') éêø3*6½úœ^xá…ù(2¢©FlØ•õuœà|>íZ–hP§?òŸ6õëFÝbªA €¸Í+’ÅAµô ”ŒÁ¢+³—Ëü¿ŸÇ—.ˆ-·Ü²Ü5M,r|˜ÑíײŸ­ô®¢«RhiwâxVÍjðˆÛh¹¸%‘™×"ÜS÷azTyE<¤VÔ–ãßZœ¬¬oÞ±²>/µC½5¥$Ö( ¥þ-B!ðÁ)´IóÁ ‰Âêý;²ük"+ú7'U\½”±Ñšû'‘'į¶ÛöYÈx¢j Ÿ_úÙ/2n³Í6wo·ÝvKFÐ'>ñ ºˆ"„uï´ÓNïxÇ;:è  .¸ È`þ”üº úPj¬Ï–¹¹îú¸F4½Âw—ܲ`sä ª#7ßÿþ÷÷Þ{oX:ºqƒÌ³¯ýë™Zî4¥åÆåBLî“\ñs/¢^Uao&” ³6ÝtSZôÀ0ͧ±N‹â6¥AÍœGK|þc<æ‚lŠÍßøÆ‰e¾½úÕ¯Ž;¯Ïµ.=—iÐ;»™ò2„'}uÊv'5Ëø¢È­¼¹Ø#d8á„à!ůp¯Âž)W´ª/õ FÃÉ—"#š]ÆtMD¤¥ÚÕjªêUл ¦Ù‰ïŽ=2’/¢ N}H(¥76K<¥­W•jß LtGúÌg>Ó7©7©mÕ¯¿}>7S:ï¼óH¥Ã?¼bѬçËøô܆êʺ<¸YVß2 ¹UàÔœ½qbtǽ<ú^Ã.«å ,]3fO:é$¯6U ÃOF½I<­¬Ï)N01š°ÉäÀC~øÃþï«—ñ« …h˜¹ñ“åNªd-_ÿú×––ó9ÇÅ„rÅÌ}ãES‚5&Sö€‹(‚=ŸjÀÀh’•‡*¢žÙdr¥úwäll*áÞ¿<ðÀ¼ÈL˜6õ%­¬â{¹ ¦â´SŸÞ Ï=÷к‹ö™cz Š@¸:•{Ï=÷¼âŠ+ट&¬}®C=”°FDô ÐûÀ>€uøÃ¾ÿþû±ˆ»îº‹öİœ•õ¹·&<Íè#\BÔq2¸1‚ù<ÅÀÆMÆY÷¯ \šÏEÅGЃ´LÈzª³ù<ú w–i& $D pѳOñøÌ.ˆqÝu×½lõä)AO;ÍÍÚOßmáÙÕ¥\äi’«´ÁÚ  µ*[E–½îu¯3ÿã`B;ŒÇ›lÜt„P s0ôŽÉw ñ¼Ž}G·l@€·¿ýÛ¿KŪvôrï:2Io·L+ …¬ÂP“'¾²Z¢3÷|p±˜4~RìÍŽ;îØ#ã©æ›‰¥-¤ÞvÛmv*àxµÑ¼ $cãT‹à#ýÎw¾cÕSøÂÍ80’?çœs,L~y¬óðã©ÆñF`™5¼Âa€ìÔY£Y¥àý¯«—‘azÚTªGài†Â.ìQì7aä©äZ{Tè`˜` Ìmœœ5b˜‚Ûéÿx ¥Ë犬œê¤‘¼ˆÎ͖߃… ÊU܇\©Zùž^PD!U” ÐÁ™ýèGí>Åxâ =뛡 üëKpðÁþv¦ìû›o¾ùCúE×BJ©Š/&s³|¨`hÎ¥å+0™é±›‡Ð’mz…½ëG?úQ!ˆVæ6ñôÓO¿üòË)ÏC¾øÅ/†Ø{ì±û±Ô×)H8Ÿ_ûÚ×á裞Ÿ0vØÂꤿ}ë[ß‚2ÖÕ!2eÏNUûz¬ ðY“g „rÅÁ®¾úê0³Z÷y*·ŒjÝÉѱÇ;¼zMð€mD¥­(Å Sn‚F&JsŒ¸è®½:Aü£Ó)›j÷¼éÒ³|;H"T†F=þ=(qæ™gæ%~ûÛßþ¼éÒ¯zÕ«’cø,_¦ZÅ!“ü dEPsÿºuëªc-»í¶Ûä š3YòjšÃ;ßùNh–”/§£°|ãàØÈÖ–U‡þC²ÍãKÒâT>G›x îŠcÔõ©KfØ)' ÈéùH~© žxâ‰Yd/Ójð–I%ÃÓ*OûýéOjƒ~ÿ÷ÿ¦›nÂü;o Ç:Ñö:óïüݯÕÎòeD‡@PVê(FQ›ª­Êß{A8ø”Fmp2DgZ7ÌìÕÅ–L£ÛÜ)ÅE›˜®B%°„#úhé-K§úùçŸKÏ>ûì%Vøid&‰~#üùê5\ø£à…Ÿ5Cô½ ¯ÉóëuÎlÝÙì‘…LêS|¸3‘„Ô0í 3qn-|©äæZ“ÛKpd<w4ŽY&6QøáøÝï~7îúº×½n=öˆZ3ŠçJI>ðÀÍÍ+Øb(ôo|ã)§œ‚Žè~©ë)çÈ ‚í°Ã¬`@>è ƒ˜ó¾Ç®­‘y‹W“ÅðpräÓ¨‹Q4 §n¼ñF&¹uUKŽô«óÌÓhE1ŠÏ}îskÖô"´‘Yµzo(²àùÔ¥ç(ÖŽ´êÞ;ys!ö…+úõyðK§ät(c×@þôÓO/ãoà 7üò—¿ €„cñEkŽ9l:-’ì[n¹¥ µÅ<ð³ô¼óΛ‚?Uœê¸Õñm¬þ´ÓN#éb¹oûÛ=âp@¸Aè',°”ßÿýß°Âó).qÑêåƒ}ii ë>ø`yj>0áÈ#D˜¹ÈÀü3Ÿù yD©8óÌ31Ìj†3äŸu®[¦álrVgÚDÓî×L?}™EÛo¿=˜|ñ‹_<묳¶Øb ÿž{î¹0 [@\—SÄtš«aÁG>ò‘þµ#\pëoë[ßš‡Ø‘ ™KÓÊz#}`â L‰Yô­o}kªNa¼ökt¤òe -2ìEÔªrúF»ˆœÝišF Ò9çœÓ*&ÒBEx›•íKl~¤xØU;S"› ! !•Ød iEs‘áW¸tþ^£ab4Þ ¦aJ×\sÍÿ³þZY-¬”Ü1Bå=óÁzÐ7ËCuF É/ð·LŸÃ;¬XÄØEúZcªDï) ¿zùàߥµˆ¬–±FNEÁ¦,»\ÚÎ`ã €÷sÌ1íãž{î9›’‹¾SÅh/UGÿ⇹|°Ù51|>g¤ ­= ÚȹèÇ$qÀiCOÀs Anþ­Áo~ó›šo€ëÞÕ«/¾ÜxãÑûkW/ï%h¨Ž´2¼Î$­=.¡Œp•9ˆÃ&#u „êX´ùƒ>ˆ †Eüä'?yÛÛÞ¶lzHõuO<œU»p¹Ú=´ãÓæ²LR/V CjWÔaÍùÌ.ÜsÏ=•òî²(”»P4zvHÛŽ¸™Œ°Ý!†/š;¿ûÝï"UÈé›qršæ_wævÿ„N°MxfÜ)7¼%ËÌÿ-oy åyÙf¢“¤a½ìn¿B Ì:]¶zÕÑì†n eÑð[0©%(,½í¶Ûa¿ÃÃuëÖá-PÑYçóYÇ#\µ_•Ùìœ}2 c§”4º4aô<èÒEæÁøßøM6Ù$êÈ÷ˆ¥ ã„Ø. Chkh*qóÄÖùfJ¨UByyàۙù;¾âZæuz¦y5« ùäEtÃßBB-¾í¥Ë’æ9RŠûŠÉcnÐ ¹'×L~ö½U¤šáM7Ý—ÐÑh5<¿hÊ Z^“‘”DÀüÁv’Ñ\›o¾ùVOôKÇ:&B{ÙYyÌÓ.zè¡Guø`ÎùŽÖL @âü?MSl jµÝtû"iׄÂâHj³EYÄ Æ>ßXÈ»Þõ.Ó?ÀdúŸOi£6ZöeHÁó%I÷o|ƒ,(@ñu¯{2™R3J¿÷½ï%ð"ˆú›¿ù›»ï¾{A,›nºés‘{èílå‰vyp>³, ¢f\<}³žg+ƃþ‰o€LîŽtfÒ/"³Î^{íUž üt饗浰wM´RfvÙ¦>Ø‚?2/¯>°¥XÍm¶ÙÆ8c5Œûze}¯„¶ÀFã!fÒ m$ÈðÇ#¬CöfRy¥R¢ÖI °4³ô¼óÎc@ÑìÑ0êR{–' ÍaY ï‰,hÙ cùëäŒL‰†í¶Ûða»‰U›z8ÛDy•—$¹tYLטev@½êÓ»„Ïîî6ƒSùÖøfA9´Ìetk¼¨PùòjbœYvЏ\àRÞMrГ¢èš,†r"lÇl°dkB }MìVá4KÇuY6k^‘c³µWx6ód¼ ñ´~¦ÒËDqŒŒ ò–„Šq­=öØÃø„~¸ÑS±ÓáºÓx%Øö$«Œ6Rƒq¹ù‡?üá,3¸Ä¬š Š3ÕÔc›Õ«ã¢E¤,±®$…Z·—¤3½Ë—ÇúóHž™ø‡`,~&O07g†IêÜADU`zÃ@¦ÒÄRjˆY8n³Ùf›U$|Ž]ãÀèîØc­2áÖ[oÍ.¦uSiÑsìõ¼éÒmÍpæ""Ìœ$bÄ:ÄyÕ«^õ<Äx„~x¶ P—_~9ʵva¿FèC®s}èÊTêœkb&mhÕ¿C¶b0J9GÈã©^£Øt¬ùÀÌnn»í¶ÀÅ`ÏÓµ²hÂ5}½£áiEwøfúpAQO•Qëb°D;©ß ïC^˜ÿtHaÌvØ}öÙgO1½eíôÒKyXr•|ãý˨Thã@<î,¼^ …8@ŠY¯˜Þk²Ñ]Tüœi@£f`R§«°7üdje¤MÍVf_DT ÷¿ÿýKY³¬'¿ Xe«·áÞèˆAZ+ÃŠ×*WtZ@Õ·ÓLÏ2f—íH‹uOE;›H,*»0›¥¸lS¿;kC\gžy&Ãù+_ùÊG/Z'¶²¾Cî˜áôPë-f[¹•š²…6Se”ù4ÕéÌÐ I·¥6Ò©Ä’²:¥]¯8”ƵL+Ë…2ÖvW_â©jâ-É68· OUo ¢±cìaìR÷³Ø¥:‘ŽÔq¹›‰Åï~÷»_]½ªa5æ3Z3óÂøÏ9çœ)î´²¾)[ÿ9k‹I»ß~û•ƒ¿,AðlÅK‡‡sÕJ«&AÇ“Q\¶ÞÓÔ§}¶téq8qÄïyÏ{Ž;î8Ë'jרñwÜq®âÎik ²šÂõ5ƒ +ÂÛz¤¾ò•¯$LY¼DYÛo¿}ŠbÇ“Ðá¯oª*ßláª_™ÀÌ(R{ ®£EÔ£Ž[o½•g‰4‡|8˺ñ L+ÅrÖøŸÿó~Å+^1Ù8‰û—ÅSÎ'6 (¦•a‘W³CùN¾J—N™)®£TúÂwgsË;»í¶ÛÚÔ[(²K/ʱӫ$à2œžçg(-wúíVõtM©aà--£Æ;\[Óe”R~rIM)­eê¢; 8'¿ÝCÄ{¶jEK#"k%f2îâáüý[d]¥Ûb¶æegŠq°°>(l±ý ÏIÞïð.Åczå´ƒU}衇FŒÒ{ öÈ%’o¡~gýóäéáªÚg=|;ë'|GW'‚LÓ(A)ð¡œs®@ñÈš28¦c`ÁÉýôÞ©›¶Ð þüÏÿ|¢Å̹:9§Ÿ~:½×î@•Ô¤6èŠ+®(¶ðæ›o>ÿüóTåÝRQ0%£åqõ`}ŽTÜ5m¤ÂÓ;õÔS‘óÅ_L㪊xt}ÕUW±pAuË-·¤Kð‹_ü¢/½åšk®©„ O@“¤ýèGi†¬ïX"^azôó—¼ä%F¸ýöÛs>oºôãVD¦}ôчZæ@ÄL úV[m5*ÿéW´<Æ[’ËK¯ÝS®ÀÖ%ÚœúBs?àCŒSN9eúJc¿ù§&a•øÉ4ñ42n_ÄBLlã7¦¾mî½÷Þ£˜ݸ¦Ø©Lm´‘}ÔJ¿*&¿¢NU ­‰ÊÔ~yÅ[l±²è¡àWÈ‘>ø É›ðDübìV]Iÿw½ë]e…G¤†½à‚ pc#ßÿýSx$Š€äï{ßûÙ7·¬^Å㡎Òx‡­jŸ}öé3:ª÷·Òv®¿þúuëÖNhQð0s†¢Õ¸ˆÏ;AJ#ë·„3Jw0Z–ô7Þˆ:¦CMþ¬³Î*u±¢‚DÆÉ'Ÿ@b‚EY(…®Ñ¬—vÊIǨ‹@ã±Ö|5>TÑ4Ýãïþîï(Sv1«Dw"j¡ý¨E 5އ©ú)™^tÐÁ§ÍÜÀxö³Ÿeƒ/s7L´Ï8ã ÓÚ«ÑÚ‚"X™oVíužZv‚°õÌö~Üæ4‡Lßyåã?î†÷¾÷½µþéY|lªÇø‹Ê>äh7UE*ä7UøOU…Ƙnþú׿náëWÛ1-àËÈ#Ö'vݳ¤I/…œvÛ´•†BÂHƒMÚ©z•1{ì±F} ')·™“n¦HÀ¥Ô3÷C•´K6Ú_üÅ_cG`bCþE¤ÄÇŒì×÷ïþ]aQ–àEÆ|ä‘Gе/_þò—I„ÀǬn=öðMCÝsÏ=8¹§°ôö×{‰Èg1n¹cßÐ Lf%VpüñÇ÷R*îÄA=ƒñ‡B;& ëá§d«¤êØqÇGs†9‚ŽT‹@òvØaøI{YœtÒI½o¿ìþ84¼â²Ë.ë¥%.ÑÒ§g<êC1U…f/vçé"—‡E›á•Á•MG  ãÅEÀ%œªˆ[?Rd÷¬Î÷,©”º4IBp²' BÂpŽ:ê¨i“7žº|¹=>àiUæ V°ÈZ*4±DøìjØÔµ@#)-£I²FFS2œ¯¼É‹_üâ9Ü,µ;…Ò#‚§ô}‡¿÷½ï!É=|à )© †ÜIPÅåLØŠ0ê¢%ï¼óÎ"Ò]ÀèíXúì¸@ –‹µ0ë©@mÚž¥AQ{È ìº¤È”|FòƒçíSÐ=5&CÞÈU)ôSÄâÅ¥ šÌºŠ¸ÇFLi)¸š;¥ð? §Ó’¸éK_JÙÈÊö8Lc@¥©ZNþÆâˆjÇSÊRe ÓÚëPå·1" nIʰŲÊg!j¶óìãÄT%H7È çË)N~eµ&Ð Ûâ!R÷ã~UK;úÄ'>÷zü…/|!0b­“Þ9Á3S¶%d%Ž”æ¡>eHeF•ÛüÁ€J<üðÃëÌÒüàiƒã.Ïø¬zÔ¹’†LºUm|øã±ŸÓ a ±Ê_ö²—½à/xÒóèg÷* ·¤]ˆ mñeA›ßùßÁ?1 ÄžÁû ]K3±ÁžØ¥½C–jÞvD8.²åÍõâ!V¦^¿3œñÔ$k”‹G÷`™bAKgþÉ›ÛËŠ³§q-(Û?rÀ@åd¸Ç,³Âk…uºan½z™ýNÊÕ¦›núÚ×¾vÛm· L²àºPë=ïyÏË_þr¸áÁXtVöHŠ9˜û]T t:öØc§õÏš2Vÿ”kyj¶ôMšp'z¡¦Áð§ëâEÄ‘ï`’ŸØ!f¡S“öÛñ_]‰§ŸN·(ŽÙÂ)ãW­º£ðT}´qdßëUMó®^ŒŸ<8Hxé•|Uœjë­·†ZÕ¢ì{;k “\9§jŠí»•VHÊvS²í˜S‰2ÍÃízF«DÆÄ Щëòd!6¾²è—4¢™ÆUW]•^b£ûY ´ñÆÓÊrÒþô§?5ó) Yâ!8wn›èq¹¦}Fõ'GŽL§E¼‹$%øL‘† Å΢/ÅH‹|6TM²bA“¥žF]-ëòøþÄ“ÄmJ9¯ï•—‚yÉ}Ë3ÜlLJKíÏ!‘ýÊW¾²žùQ2»Ì€-FÒÙÞûÞ÷²@çìãåÕ#¹žt Ë£"œÓyo: J yãß8äqÑ9äE•yø£ û^Xègƒþèþ(ššüqÓ)Ôýú׿î{#4=¦\ÙÇcëÛeû"ê/|á öÅÄúžöH5¢Štš£(\%Aíºë®‹_Eø=ôÐÝwß}É%—`¿&†¥Ó9b’•4½ÔHºYÆÊ|ðÁåcF&“ŠXhq½9¦8Å{yŒŽÝsýÍßüMR°½\ÚÌóPbW¦fÂÆx8Q=Ýɬ¦C‡ÎÐ~›m¶±#8Ouì{„h[šœ7Üpà åìu•á• A+¶ïÅßšcÅaæµOÝa‡h/ïÿûëmzä‘G2mÀÁbÍmŽWV[ 1gÖúÔ¯ËØ·äeDV‡aΞ{îYg‡°…mR~PÄþï|§·ðío;ï´å hèqÏ=÷tó—¾ô%<ämo{Û²öÑÒðô,¥zHæ«_ýªwM# §£¾Ë J­Ê鄚Ò÷¿ÿýáßúÖ·Æk„@ ([8R|üñÇi­þS öÝw_Ÿ½”hËëâ~AJ÷Ýw_E`<ÅŠ y&/µŒàΛPV:9¬7xøÀL ’dÒä9n“q/XlU%c FÄË^é/Ò;ùä“í£é2µ!²Ê7Ž¢ËÄIÀ!O·)ÀB.»ì2vÓD‡ê V¯4Þšú¥·ƒOI[¦d|°jo+«EewÙel oµz=»~ôhæåŽ;îˆÛüúêÅè>è ƒ0–I(˜öp¿¨Sz \!°p°ì²„ûðÛ ÃóÎ;’6JôCkƒ ·ûT—úÄÙ)÷'@Õ¯ yj¯à/l©de!ʈô®»î:âˆ# ›,©sçw†½nøë¿þëe.*\š”çÎ^—3­ªÂ^d>I‡f6~®¼Î_rÎ uÿà?Àh©1^]­ŒY“Ìòíró¹çž;Ù¸^D£ë$¨¾‡þž,¨§c€¡§[ °p¦D­ýŸ«êèÐ'€Ãd“Rü½æšk^üâå+_-kÒØû‹Â™‡á[;‹„ÓIÌ-‡CøßœéÑ/þ3.Ðb Ü_©Ðϸ'ð¸‘íKyU¼þúëÇ$É÷[Ɉ²ò±J²¯Îk9æ<:7¡\+«uVWÖ•]YßK}Z£V$øÄ'>áí¶81BΪ«‚qÂv0y×È  '¼ï}ïà úÞfE}£·d}“V#Ųm'Òz,}ÎÖ®n?é6ø \µ¿É¡W™îþŒà&Y‘ÛÜ‹-çùtˆ˜¥PdžôZF=)u,Þ¿W^yå!‡2âà ¦OÆ17œÇÖd§^YCµ6~‚Ê<2ÊžµÀRó§ÖVš¸°¨OúÓàÖ^µŽX¦@ÄDÚ,}…' ޽ýío·­£ü[;m0o’-ëÔ‰”¬ÿ“&Ð=»×šü ó\&4唸eÂKŠÝš%b@¼RŸ@rK ©:£I«yÚ&d£ä¾XHüô˜ˆ¬P"–¸ ”òv¬žîQª‘M4«f~í–b,pÒæàŠ½”ô ©Üìâë‹ñpÙA:Æ…^h›6Ûl3\½°"‹²ÆA­ñ‹ÆÁüä¸Vn$Ùho¼ñDäV%nž´#pÕ­Úœœ)Q†êNHÀ¾ŒÉ.6õ[la|„S§ã°+ceô.K¦âÆ$ãQÖÏùl–QÁ±PéQʲÆÎTÞ0·Ç(Ø-(h »¥%R E)r–3‘á ŒÏX» -5¬~ÁzWOi‚™G›?*µê€ªõMÙ¸£>ÝA9’x;ùh»?õ©OùÀ†‚ ¦G¬3ÏñZñIr‡ZuË*\„4o&[³c¨H—£#Å2ÒØòñíÑÿ+®UÓC#øw¯½öš’5]špµîI(rÜU¬r5g.Ubì3Ñpúé§§‘‚Ãæ›oŽÜ:›ÎÉ7c÷ O¢”[Ffš…áöèÐC­&y~Ë¥‡ÎP0çT*ƒ`S“¶£™lTö{¿÷{:à 09.Ä`¾‡…xkο0pà*z§ãÏ«Óà”4ÓN"ääY¦Ø: {ÖYgU­ ˆŠ 0{¶øsÓ+ë+4Ò%P¹¡‘5™eË”¥_4e¦F$¹ `ZyFáódL¬¬–'Bq7Þxcª± ªâ,]"°}Š\ÅTlžó‹âšfQSš`äuNÙÞ‚ðKq]æôµöt} —`δ°ì6Jr#Xלb>;í´“ýJeªÃQjUû;Çír÷ð!{ª˜bzg .º ^áíA-­•¼ÓÃ0£îe~ل³è”ITÆ’+þÔSO…rSñ&õ€üÂåª ±ŒŸ~ÁBõx«ÿ¼ m]¶êxªXЕõM‘Í8½N€-èàƒF›ø1¬:×XSÖ•‚Fµ( -¤Â1ìàœO3Á!¥rUÜ3J¾1Ù|6Ü@€ ¼ÝÜjŒ#w²¼—Põ%¡Ö^ÇXF£ëĤ>F– l»í¶ÅéáN • eMúä²×ù26l·ÒŽ–Î8ãŒxã¤y#ë¤`2OçÔ¸„ýZld>“MÕ9'ÇA°lÆñ±—G0Q¥•­Ùeèg‹#®ÚCfâ¥|ìcË¿]©Û¡¯9˜‰äÁ0°ˆýˆÚAŒV‰TÝS÷É|þ‰¹9º´œêGµzÌ‘DÃI'Tô‘+Û³i¼üå/ÏÓîCÊäs¤?¯É‚TO×®y“føË¸YŠ1¼_¥Ïa A{Hcx†ÃØÑl°õÖ[SZöÝwß=öØÊvØaͰ;Šj*´#Â'.™ðçŸþî»ï^ó,úpºë>ûìƒWWÛÙ†.kµŠ{Ÿyæ™ö·üЇ>ä]±–«¯¾zb›sVúµ´/L›Š…â:D›ú%êØcÝe—]Ž8âl‡UEBøf…T$„vGPVýϵýöÛ»!-%>ƒ §ô=¸ É<üðÃf¶@ -Ë2{Ð+°€IÑ­Pê³ZU9¢Ç†šÎGÓ_ ã`V®Íßhþ›Ì1Çó+¿ò+(ÀóJœÚ01߀°™§í—ñÑ„ýK·!ÌR2ÿì³Ï&³¨R“ٱ뮻¢‘[o½uå¿m:ârÙÕþbn¥â6\p†cV?þxïzÿûßÌA†;VÖ·>Y2^:ðŽ;îhëM»ãŽ;,¿++šCa|H5wØaÊùÞ{ïaŽ™Lk’I+Bè$t68Ó쨣Žzå+_éqºAþ#l¹å–i­>wsMU*26xç§õÇ>öØc£C–±’P(OÇøbšCµp|ðA:ƒÏó¯¬/ìIâäçöæ›o. /YÕ_õªW1²Þþö·Û‚þð‡43`fTû Ó Uwæ`uYá­USVíÑwÞYª)½šV”_½’¼¹ÈŠ]žÖqð˜žB¡¥ÏÛJL†2<–¯·×ddï´z™ú± }ñº‰/Bæ oxÃ+^ñŠg‘?¯©TðDOH…‹@Ï`üòg‹} ÈLÝe;òrß&ñª:9b²,+õF~îsŸ ÙÚ…áWqfŒnljG5#ã–Ú 0ÂsKÊ6àSþ…šz2•ÿÆ7¾‘µheÆ+Ê!…ð?{0d6+BÄîT ¼°¥t-o©GXÖ\I¥iý M›Ý—>YC¸›­Á?ÿùÏ×á¢J ¸}‡ ©_þò—“eõƹì kˆ¥Ö¦›3¥·¨"á;R™öL7ÝtÓß®^æ€ð¡Y™øĦ±Ožª!qˆÎÊAŒÈ}iJˆ]¥”‰° *A”Vp '¼óïLßnOéc6‘ü%È’˜î|ú†§ìÕI$ ”¥¾´%kÚøÌ&Ó†N64ÙŠh³lÍqÇó‘^[ÓöQG‰ÎQS ¦|>e´%v³Å[t*M/᪑w~!9¥Ž¬ÌÏŸ‹Œ°Ãý’}u«÷ù³Ÿý,wzÛAû*Qd3pÀ´ñeQµG}”VV$€72‹®½öÚºìÝvÛm¹”Ù­È„Îæít:9Ýeg]ô ÊB€Õe<ÔqùuÎ6Ûl3ŠV½{\)?à†®Ý9>F{ç'HNá¡´0ðaav?,6&K üÓCr2€'èYò{ßûÞë®»…¶c@ab”OÛt饗¢»e^ ïÔ)gTäl­®¸Y`Á+p6_š¡­· ½ÎOþE5¸뉒3¼…¹džÇŽ´k¿ó;¿ãíu³·ÎépH•ë)Ï•)a@ê³Cð¦|¾þõ¯R¯Æë(¨Œ,Úš]+Τ±# ì IdŠ%®¬o2K(ɱÀâ‡#g“/:eà 7̉Ñäý;­¦B¡O<ž$ÝÀ! Í?üá3»À «§ïåZ)¸hbÂcqÜêX¦&¼nl¾ùæpÌ®á3ö•Yš :äCªu¯¼òÊŽ³@üaçúõÍo~sÝoWÖ÷îÀ®^5E…ÕŒA“¬5 éi6.g±@–q³RªÍz#FǾ¨‰˜…#Cƒ)j‚cå¼S§ÅS,ÁÐÀ˜ð¿ŸL ÂÊö%ÎpÚi§ÇêLr¯½ö²p„ÌÜs[LxÓM75Žm2aËÇçÙ­¶2€ªÇ¡ ¼² äËE]4µøÐ‘WPWÀÓ³<Ö†"k\Sóä—¼â6bšæ ϺµûKÆ¢:@ (ÇÄ›R´ùRàÕ•U°:ùä—ýˆU³.Q0ŒgçX¹ŠÄSYqD_~[tÐAA²=ks#. À=÷ÜS¸Â(óönlÏ&´Þm80‚M1óö”¥¥¥2¹&$ùŽkQðÏ´w/špÄ&T[¾RWÓã TÍRSBãûØÇjz[¦6Ò‘z1 ž*%¿1£•.á¥yŠL bÅiAv'q\¬8„D‰DC¨‚¬2¯Àõ,§šl¹³Æ Xý}ÒSW‰ÕE×d2$éŠ:»ñÆÍdÊJÐa@;²47˜0• àOj›ÖB«8ÆŠãH&™Þ…lk0G¢ÞR-Î_,OY ƒc_öE#C¼=YÙ«©9+ê,ƒ_U:;+Þb ×1a°²›xEáÝvÛ-\Ý]Ó°/é„us(ÙÐOÙò®4|tžb-éN|J±a—‚uÌ pç|àËp&2W§ÕÀ:«Ã“™rHÆmÅÚ2 (®Ñ`Vád Â(¼÷àƒ·vêÕ§š¢²È=’Yºœ?ƒ4é„züxs JšDÑK‡°-F5ÅxMÆ›}éܶ•ø0Ö –ŽÜö@H2.Ç y êÕW_}ôÑG›01ABU‚ j Ï.O~*]º¸Ž9ïÈœ¯ï^g©õBzfIâ1À)·‹O&Òð:-“¡þÍ Ð1"õ#9¥Ò@eFußxÙË^fG€±’©Êèˆ~!Ûå⑨Þ˜{p”5M" ˆÄÌ$VŒCJÚM¢|M”¸Æ1׫^õ*ÆÑšãc ³1Í?Ù:5ÉQ oMÌ+A_ ¥!2¸¦(âÊj!úŠù˜¶¿PÈ<[WDz» HUßö¶·Mª×è½î|žbFùìDiÜkn#nLúaÈH»>eÈXSÆ)°C׺´d!ë ¹L ÄlþÐÖ´çó—âd]˳ïq°&r-NE«‰Ó®©É’©aàÙöU»¯ÐeKî¬aüTãÚ€OCë0Ô°Œ&(ÇÂ33Z—Eìs¬Q½¬7[´ª‚_àòËÍÚj*ßRh™üuc ]ÛG\ñ;ßùN 3¾Êþ‚ +Øk§ÌªÉ#‡ªü™vµ’ÒŸmÙᇞOL¡õihËÆQБXë_hœ‚7NùÌ¿Z‘“¹Üì‘å u¹a¯Çãn°×d} ‹%SÂ[h½u;ì0¿Zc5Z×\`K™·×Äz´wí±Ç´LÞ —I=CémÐÙ¾xï²ïa §øªi˜[N‰À•J¿l˜ ¯|¨/XqJÓwyÜ+À‡!ʱ@}vmMàÜ/¯K—ß·&_ò‰§çOö^¤< 4ë‚`<‹ùi\Ò¹ŠîÇ?þqßè·bSsd†ô¼¥#NÀÇrñs{1ç ôI6,IÔKÊhàiœa2ˆÕ{Q)ÕF  ½éMo²;û쳦EW}Âòý¥_ÁvO¡²¢×F°:¶mÌ–’6%àL8i‹¦ˆ0+Ýÿý 𤋮¿X«Ü`æCTZwÍÜ6s¯î¼²*U—¢u˜µì;ß!ÀŠÊ+Ñù­b*.Ëé§Ÿ>VmáÍb’×l7û‚aúåù[ÝÆåÌ s,§‘ŽÁÞuÇwø’âŠ@@;¥…ißq!ΰM¦àm^£}÷ÝתáçT&YÊ8;e#ͬÙÕ/²jø€‘ÂùÝwß}¬E?p°òølQÐÀ§Ndc®ܯµE^2“GÑ6Ô«¯ºê*T_;¡¦ Ü{ýê¶É‹QUÉ‚¡ÀƒQ'ØEäÕÉRöEó!² …0Šig§ŠÝýó?ÿów¼ã~ª3Þø‹Æx,5ÿeuñ‰—+ØU=Š_tüÀoñV ²`ëߪ ÑÐL#&cX¾#ËÒ¥!³[Fû~Ô |̘õñÇ ¤ö`t—ªÆJ22ø£5Üi)¾QáK|Sï½÷Þ¼"n(ê¯y9üGtKlŠ)’ˆf›ÐŸê>°‹M~xYìu+×|¢™ÐúŒœjgü™!±âYdnVË“2ãw2bwÎ9ç«»õÖ[SYq6ô[ùb¿6[« ó;: ?û•¶ßÁ™%ã„íÇi‰èç?ÿyXÓRÚNFJ[HŒ"ÛË.»lÒjL#S:£M]‚Al¼Â>Lql`¤˜+•71ÐH•š&ѾI¢ܾ[c©O.¢°#°òìûÞ÷>Š+E´Å~ï{ß³¹ïÿû+²M«3)¾í©NgjS^45Iáfo™ ÷âº-–˜C»)U÷–Â:ó)*ŒŠ[€—™†Îpà^|ñÅ)í´¯01Pºùæ›!Ʋõª¡:€ˆ*'UpT_ÐüGA/¶_³?ÜæÈ#üô§?=ͱ .À<âˆ#Ì„ñˆW/íÛ‘?öØcá?ŒJ}Š/e!ÂFï­CÙÊjçb¯«¾SÑ8ãúÀ9Ù¿ÙÂÞ’—Þ!XÇ£! l“`ž6 ‘,m„©mÄc„Ñ‘/ ì~5Urß<=ÓÀ-ÓryùÕd¦&Æhé£Z“Ô"""?W¿à‚ ²Ê“h“<Å‹!}Òº0S"°,MÎø/yÁÉH¸ Ňw"_-ßšMWÁûz*Óoï½÷¿AÌ3)IG9ÉÏ3—…Å R½üMÂú€Lh_Ô]T íí8ª*ž¢4>úh˜Ð™Èô› ƒáœ™¨&ùøã‡pÉO¥‰}õ«_w¥=‚Höe ®Fw?úÑ0¹Ò‘ÎØ¦ë®»®ÁZe¹ª–AÝ¡IñZ¸.ô†`7HØæ(A/™WÔž)xu÷Ýwǯ½öÚJ‹<òÈ$¦ V•®¨‰4` ˜^=*`ÎS.lN]G© ˜&ø|Nˆ2ÃWVÛŽSË8ýÊx¹•ã÷¡ýêƒi× Ü@ÒrPJM]©j*¢;—'ª¨©(ßêÌÇ+Ì|JW˜…Ð11ˆ¤KëøÇ?þq© “OjÒg\€ã½åÚwÕç:¶LD ôŠ/~ñ‹É 8“Æž!o u˜«Z7ºvÙe &þI´Þò ±hà2g¦bžŸö±¨4m¨NÈNþÊú:º.f‚ÝùÎw¾c)äÑ7¾ñr9YâÅXZì„= sòt|M•Ÿ‚ÏÞÞ€ÕŠ4>3 ªÍÛKí Û _%k¨FL]š•MŸWÊ0@)ò^äf/m¢¤*M zæI¾O:|–FÇðñ+ã—ˆ¤„@ï)ª^hõ,_ãcžð9“'ŽMœQTc¿mh{Ú¹޵ŽXÈk¢°^¹zð@¬²Þµ·ÜrK…Ù£úÚOÀÉñLš*`Nßœ.Ä:ïAc’élŸq Û&·QÌvÜqÇNðÉe"ž›áý÷ß?Zkev^ýêWâeo✸ÅžE–ZkJ¸4üYæ¨>U|c³ /ô  .ZÞŽÑ™-JÏÀœ-A²òªÆp/ü±¡H‰t#› ;í§3¯¿ÞRת¥é:P³­r`цÿïú«*p“2ïC'éœíÚÉ7˜+`²Y+p:þ4“ÏW3gdfX}-x#Ž—:—Æ[ÕÑÜRõלÕà¦xBú)€ùØèÆöåu'^Ñf5£TåÙâˆx˜p§àÙ\Œ‹«~To’” ïfüx¡‡axKææÓö+Ì©]lBÓœ)98g›Õ^㙓–îsgî­r‹±eˆR&N£í3sˆ„íì°Ãõ웨Œ´÷M7ÝÂ[ŽU1%œŠH ¾è¢‹°k»SÆY ªCņœ'ÿ4‡ €Ðæƒ uMæÀ1ƒºÝÏ!†@ˆ¬²}j²Õä›'zŒ‘&fUŸ‹Ñ$s‚M\kˆ%¦5a¿”1ŒÌ©"4ùÁº5‡My8WÖ7…ùßV/lÈœO¥"ÊUúÿ²Ïé/­éÿ8A¿)ÒÏL…^“FÊü©Œ|Ö1Ã$_V7Àá©q}ÔQGÁ[@µ†?o¼ñ™gž™-éûœº3sƒuÔƒr÷ú’V†K¸‡v ž@°¹øC¦Í8ÓèàO’2¯±q{]Ô}©ëÓtd½&ÞÕç±@‹XƇ³×–Y 4®å®!ºxi,´UÔÀ´zÂfeÇ în¨ÊÝ>ÿ*[¬ÔK8/™óÌÍÈ´²e›’4bO1íîÒæz' Ê,)~Yô)ª´M¢â]½tj0p™ù눭ýöÛo‰“Si!(-}wþ…çÖ•¨í'ü³Z²!ù“¶‡«&€«`ìã¤ÊíßA²´L¡Íª>•îËvÖm ˆ`[vsnúç˜WM{¶Tt ê¿®^v‚«é“éxӈ܃ÔQÀüä³ôìà̺uë2`§x਩5ƒèÈ{4ÛF^¢âò<«ê‘€ðÀéêD§ù·ƒc¿ÿûßÇÀ‘ùlY Ïüîw¿ËÊ;ùä“ßñŽwPæÇ´!ÓO8ácæÜN’n°Áùlí#sŒŸKòª2¼W›yB¶ÌÓG}ÖeË—\fÅG• ̺ >‡Ï©¬ŒI½4ÿšU…ííæô©‡ª÷ôúЇü:U—§["¶@—NjxN×H뚬ùé›S¬iŒðó…’Œ£À×s$]+æVöPáCý­ÜGuE²éZ¬-Ρ]ð-;Ô=Yåp«¬Ö🈫ÐðæSÀRžMdØNá“¡à‡`£8à(óìòý¼#(íÑDÁn»í¶ cƒunûéOZS¶j“RÿðÛ±àHØN£#pÇÙ^ÌÝwß=5u¸\e¦ÚÊq°Öm·Ýv“™Ÿ§ŠÏ%æo}ë[Ô†hÄã&O[™+¯¼Ò^ÐííZs€ÈjDïe•Nuà 7t3«Iâ+ôk8›·WÖ|€1鉇×w£z2nèÔcÉÕ'ѲƒærÖ"pXGÝ5Ú¤ DAvððÃÏk:\Ñ«G[+Ÿ.Ö?ã ‘æ“K Ûw"‰g L‚Àýg2°LW/á1·ù%À„ö¤ƒ<ãÜÉŒªÞæÓ¾{f¹êÈÁÌÏ>ûì1ŸAÉŠ®½öÚá÷Ýw_~é¥ÿêê• „Iv¸ãW»C®øFÍ+“âQßFoì@„™œ~[0CÀª±è$`5“‹64,”ŽáƒÏõ,9¾ <ì“m›í ‹0¸µØ'Ö¯¨³§7‹áRÅgÜcI0j™gòe¦1¬£×U‹»ƒàªÙ, óNQ¸´ß*ðO4a¯½öš£Õ:A°8Ò“Ó‹ò{¬©*t}®Øiu3*Dݸ¢Ègž……Κçt$OôÜ™µû–·¼ė Ê5=*qÎ PªAÖúðü-¾Ú™xµY²õ‚^)ð•K«š'ÒšIuû‹þ%yÁ9liïÒIZõ´__fã¦Þx…û'…ì ÖGŸ¡F⟿û»¿{Ê)§Ìž2êG½4~•cCÎÊxv\KjÀ@šÃˆiW¶Ã`{ ½¢y/5£ÓhF¨_ °W õ›ßü&4xík_[fwúv±ÔΣ€Þòày>¨‹.º¨6Á“E?Y¦Æ(ZàwÜÓ†æá§þ€wK_×Ñ­;«"ãâ?øÁ;= lÇ`ÏaÄpþª” Iü±ÓÁ¶ú6ÅX¾ÇSIg[æ)hSiWáˆGy$é¶´tžÅ:Kk®iCLØ#¶¬¦uøØxã7.«)¦BçM÷~ÿy¤QKJwb>tÔ ƒTËf: "¬8’ ßþö·ï¶Ûnuº‰6½®£|xRpÍ¡jEe½u*TS³×¼æ5HŒ†¸bª†]6˜nSµ.*O¹h^òWüä'?yî¹çâÀ¿w#kRÉ2‡aÚ#<2¶$Æ;ú†]žöX[mµ•å²å£‚^,çŸ~¿ jÃ’2>ø å°æèNæ6‘U3ˆ .·- Z~á _è 7jËï„%­¹}ík_@ ™Š¾IÉï´ÅUÙ<“›Y~NãE†ÝÐ#IOqÙe—‘›Ði°hp`Röæp³ÈóòCõyç+L;¦gòæ‰SðòmÎ9¦{˜ÃÙø“ñ½ >øƒ»’¡ ú‘–PÀ'd+•Ì_Øeì._ª·@dK™48Ž;y°êk<ùqÎ+®¸¢ð‰ÒÇ7ÜpÃBñÃCªû‹ºÿþûó{, –) ¥Ïtob5,¶¢˜  |B†»¾ŽQ®pf¥½&[«n‘ dæ•‘|fù,ø[Öª>a4¦V½QÆÇ á݆¦¿±¹lÁu×]7Qèˆp 6€ÛXÜ„…xäÖ[o5Ãm¶Ù†mÅ@ûÔ§>eO¡nŒ4Z@¶{±}4›¬Üi§R{ýM+ƒ¥˜sêDÚlñ!…-ß<÷Ýwß"I˜?ñ|K#}Hýðü²˜Í¶bhøvˆÔ‘ÄßøÆ .‚ØÇs ’ÌO2l²É&&Ì^FwÔ¡`EN ÉOå/ø˜³ŸRGé0aš«Ñ iû…§ÆQ-¶Z4 ê`›=²Å[¤ÕTÐ8˺Rê w±ä—JN)§ÿ²z¥ú20š¼§Ì/5Z¨~Ï=÷xq—KËô¨·¯Á÷ßL¾#NƒËEÅ»`l¼:u¨²œ%jç²Õ+|6m/Í×TüÒuÚ©©£[]ùPð¶B i2XÊ®»îjÓ°Ã÷6}:[ÁFׄâÿZ½VV‹–§d‚s}&(çüdt.0iï…,ŽjQƒÅv¡¬(Ã_ »zhvš …ª>…h*VµFì«¢.qWÚ}8¥«¨¡*iBHÛÄ “¼ú+¯ƒi#ýzûx̼ȞBì‰>ÊkÑ»ˆ¿ÊÕVZ°º%£‚³×Un‘ ¢Ã (öØc7øÐ\¶Ó"t´µ“N:©Å·2K÷xöŽ9àÌT0Ä|üä½y™Æ]Ÿï7Óò‰€ìþ‰™‰ÜXCPqγ| %ñCùпK·RM¬š¥t©§ˆÊª+äR(æa,”$¸SçsŸûÜa‡F·‡iÞ?þøN蔎ÈMn¬9-Ê^+á®c#ȹË.»Ô·pÄKÞéø$˜ï³Ï>Ø~t½²¾³^­¦Ç¥c,T` ùL:’+M£P‡ò8Rþ'§äém´Ñ9çœ3ÁÒA8kÚܘ¨yŸÆ=L:Ô«>a‡boù‹›©d&ö CBüö3Ÿù iBNë®SžvÚiÉkrßëß—ÈÆ"R§G©†‡|0 {ñ"7SPNÖv¾zOE’Å* 5…ÆÃ»Hítiš[rvzT}=‘3ñ·)×PØg+FW`•‚ÊÐ8á„è ùÂóªˆ5Þ­xø2%­Ÿ¦l¸] “Ë$Ž_ÿõ_‡Xî,)A·ìˆ¤â]7ã9"¢éa¬N`d2l»í¶4ó$i­:Æ:€$ö.ÖµÂpˆ‚F¬@¡ÎµÃÃ)³6ì=´dhvgüÌž_k-Aõ…®Œz[À>hÌeÐT3V“3m6z͹væjÒ>ò‘ÀÉgKûÛߦ,s €O¦éM³ìgVÏ–Ñ‘`Ñ$TL)mÉ–i&4ɨ‰µ¿¥¦n¿ýöÓ ô¤Ø"'žx"Ú)„v¥–qÄk’:QÖdSæÇœ™ ÂdòTä!m‰ê("Ç]Å'U°&Ô1„Žo¬Ñ°Y“G5þvæÛvG;ãªOʲòpG‡!C._ÈϨÝvuq¡\d‹Ão½õÖÎé6˜…bÀäl¹Tá|)ØKÉUž©«#Ý7ʶAh 4˜^tÕUWeÝDÙV©^Uô5HaiÈ¡X T¦ÂA¬Ú×MÞ—ÓN½®y 1¡/%Cï ¸¹/´8iEÉ9묳ìTýC«­—F×aVZtŠô2­¬ 1ÕetJ%Ä—êt¹s· òå‹_üâèixoRë³bÌß =MNçÔÉ—F‹õÞÎ Eü9Ï„y衇êmÔæ.¹ÖaÜ„±ÅÐ˜Û É„L¬9)¨9x½ºabÉS ÿÈ#$†šsò¨sØf)!ÀŽìVrèÎ6“œ2¤)í}ïÃüc E…¡= ‡ïå ñÍ¨Ž•^7Th“f˜ê2ê¢aÍd2ÙJIFQ5Íb­ËôÌŽ“ŒÆÏýöÛ¯cÊü§õµU¿ô¥/­dî¶vÉ&á@ÁHæ_Ëì´M Lj،÷Þ{ïX‘f[œáí·ßþ±} Yáói,Áð'?ùIE×M•QCÖ—EÐU~ÂTVÖ7¼3¡Ö«éäiÉYV¾ý²ÑGF° —s r©v ƒ23÷ø²¤3*~ôÑG‹«tÿºuë¦ }ݸìE«(Åï]ïz—™Tx³‚UtóÎkê\q5ílÔM•-İ•77BŠ*ø¢½(Îæ×DUU¶|Yû`DÍš¶w 8"nr}ûæ¸ãŽXƒTlm2 Çæ2á œÈ«œÃ§(Š_çkÀb\ʦZÍ™Škîn¨ç¬íØ‘È4{jÙÀ±LÔ’¼ûÝï6s«š5úò•œªÕ]y"„už´¸j½³Ý„Ë™gžiã¢,8|Ì1ǽül£ùÄÌËÐœÎæHµ¡BżgsŽÏÞ“ijP[¢QéÍޤ-dÚx¥ÿÜzë­æi]téO|â oæÐà¶Ûnóͧ?ýi´†Ãø ¶Ôªø›ßüæE]ä¥l1– :úüç?oäýèGÞ^xá…¶8«ÄPYÖü%/࢜КØtðyï½÷&MvÜqGäù@ªK/½4þYAûgð ³-ÊwEGTA¯€q*VPtçf\ž‚bæ¸oõšC:hcC#ãÃ¥ÊX•Þb»a)-Œ¹J×öwúbw9Ž&Ë{ 't’;—õ™­%›ºUyùv!Nˆ!Ç\)oˆ?€Lª2ñ¬Åî´ÓNðÍ¿¾ùÞUG©üß¾ÐsþèþhÜŒSu§‰h¶†ªy˜§eØÇ?þq,ˆY·O§ãÑ¥:ɃUœÓìZziý×|ƒ^pÁ¾¯—G!:™<&à¥S`Ðöùé¯W/"^$oIp£üñ6½®Uu9 á½£Õ ’Çl[L† Pwyp¬X—TÖ+ #ºœ½u>ªYÉ8@€Î»pc&LåKÞ‚ÜJÙ˜à“žYr ¬]dSŒ­Qp]ý¿úÆ4:t®QQ)ðt][éž´­¬o¸`ÉvyZY*Œê:$E®þLú?ä4‡LóÏ>5l‘¥v@$C…@hÖå_2wÿý÷ÿƒ?øƒ‡~øƒü`ªiÇe«sÎ98ÉQG…ÑéæsÑ’{î¹'Þ’†@£¶–Z&Mï›çâJÉ‹NKÎÅg–©[à@ÉÏ}j 2aÆ™SW…§ßÏ!q8à mìûX7™™å›S#LÔÙ̪8“qG)­—V({$~Ÿ—ÅÓÊM^Yßa­“ñÎ㊜ŸTµŸ \vö‡?ü!öhßmñ]«×„QUèk_ûäLÏ÷Æ<5NÂ"¿šj ɶ˜ªgòýÒ9ÞÒYØ”• ­°]vÙ%W§±J—ÓAŸÄå̶g •ŸaŽÑ'j©’×tєà -Ml=»ÐÙwC·IVA¯›ìõ¼7¥%Æ—Æ^3@˜ñz»»ßÍG}4Q»ÌóÞémWž)¸Õ í¯¨:d®i€„QmUßð†7À.úÏä o·4ð aK/5“Ê5T)¢cM *ïe1O7O#€×cq²Š¬‘ÏÉ8,šóÎ;á#y ™2Fqµ 1Ž;ñp°ÊM ¡_Q‚æIfÅÄ·ÑTÁóæ›o¶›&yË-·LǺn«KWµ¼b\4fµ,aºÌìÈú˜Žê˲L«òZçXq½QbÔùŽÆý;±ÜãÑ/_áýk^AˆwÖ™ùYêÙQÄŸ§üԣݬV›|®¡ A@’–ùûå/¹è¬Í6Û züÆoüFÞ]Ì"‘€ðmœ¥ÌTl“ù K'êÜF „¶É&›øÐQ) 8¤²Q`;c<“`á‰PÜ‚=êf¤‘pŸ^Æs 1"¬?EêMסQE`{;žbïs­½kõO¬Lþe1´ÿõ¯Ý;8È; 0âM?¤ïUûhÍÈ×N>ùdÈ0Ô´ÆÓ…E3u3·ÆÏ~ö³ja¹–ioeÞÍåOK”0g^¬ƒÃQGêŸõÖØŠ.óÓ—Ò³wjA>ùÉOcY@~ŠAÝâ VŒæfBœÆRì/3¯Âí4û>í´ÓjÀMÝjØÔ3ú°iÏñ=.Msè uðzÜqÇè( gœqÆÁLÐ3-Ï<óÌÙÇÔÑtׄ•)ùŠW¼ÂýÖnðÉ^L‚ô¢,ÙNs*Ý ¼r˜§íÄñÚSô•ê•L©»S~]`\fÍç°‚~ Ij°Ÿ:Sèhµ6yY:³q킵˜F9t! K°2nt×´Sûþ©O}jyÒÄšNjÈYΰˆàÆo<å,‚¼‰­IT.] ý¶ýRwæ‰ò+°…-³ØYÓˆ´ýµãÿ÷ê•÷.´ hƒŠÎ[…6Ëpo(V|Æ~*èwÜQ3n÷{/XU¾7I³üÉò"P?E¤F6«:¼ûeÙ¯…\t¶BÍëôM,ÓÉ;´ g hVÓÑ4X 6ÖåC,©Í´Úƒ[u]‚¢XÍŽ‹hç±ÇcB¢²Ò#ó\Öµ+}2G«¥]vÙeôQQë«—ÇË‹1²I—ñCËúøÇ?>‰Š‘ŒWàW¬]BЃÈÍ´«M‘íCÆ̰ÑF=ݵ ˼óÎ; f›°|óüÄ'>AÐÀù¥_ôåÿÕŽ;餓Xüzè¡PwØšÝLÙÍ)¤V/û]wÝ5þ–ޱi§àXi,“ñZ•Ú~Á1º“­Á Î:ë,8og½1õ ù<øàƒ(tÔ×?øƒ?°ƒ8LÞ6Ü8·p'h^4ÑÅyz«Øu|饗f'Â.tNæÊ#õ¦7SF½Ý4CÛÚŠð“ñkÇåpϯS­êv9 HUýðáØc-Þ,ö¥/})œ)è9tœ]GuCÕ«Îü#Rß§èFËÙÈ!mêoöÛo¿cŽ9f’+Æ….¼tJšx¼x­ÂT]³GPè/W/2^ ¥RÖi åvú¼ ¬ 1 Ê»¼´lA7ÜA’bB›k®¹½k” Êzýíó oxCÎÒÑu‰TÌŠj+¦ÝÒ_~baåž’IIv¼wÏ=÷,mª†ã6ÓNÇ(w¬²‚“gŸ}öä(Á¨|õ‘ÞÄR>§— Ê/ g–¦YdH¦ôœùkÑÿh—<Ó\rŒ¯5*wý¼:÷ ¬â•4dóˆÔH3ýÙ‹}“­¾‡½ -€?EÔ«JQÍ4šÆÇ>ö1LÀ' xÂn-ó‹_übÿÂv áœ^|Ÿ¤þœ·:u†E³]YßÐÖ³Ux˜%c,ÔÅvüõ¯=þO»î_è7ÒßʯatTIµHf|¸ŽT®Y3Ž×½îuW\qÕ!0³ôM2yaVa5QS*ä>ì²:Ìdö·“ÁtBÄn&9ÇèÖxõÕW_uÕUÈaÛm·güaxYØ*à—rX1™N+ñTg|u)e¾4ÀeÒYX”{véÖbñ‰Fƒ¨s^3&{tìM£ÙµQ“š¹Ÿ*¥²3ë²§švöB•$GÁKTUJqÍñt>¢ÙâH`Ѐ‰±ß~û½óïÄE—}ŽXøçÅ_œ«›æ/›l²‰_ è_yŠë‘Ga "p¶Ø²I >³‰è?´ñ©ŽXç¾ûî˦ŒÙèg–s÷l]Âæ3ŸIùŽý,Æà½æ5¯Án¿ývûnGK½…ýÅ ?è ƒræÃÆ%W0á—)!’šWx>F ÅX–™ª„i’ïbPS5‹Ø‰“_ýõãý^&­/yæX|ù‹:ó²´)³Hsõê8r³êñÔU~miÚx{h {™„ÕÖËoì]Ää&-í·XåF@€“^W±Ê|p\9f‡í·Ò]wÝÕ®ÑùË1O¡ZžgÙšI¹]sÒUúdüª…gF¡ôuþÒ—¾´Z²%”˶ÌiúÿØ{÷pëuÿw‡¤å|*f9DŠ*)T¥D"‡"*)"–ÉU("‘³H¢P9DBÑA3è\³9«Ùœ³µæ^kîuíý[û·÷^¿õì×5^׸¯Ï|#SƒÁ˜Ïçq=Ï3žçûý|?‡÷ý¾ïÏ}ˆ! ä4ͯùB FÖÎ`¹p^ ƒØ¶Ö 1æq@Qaߪ|ŸHªZµ*¢ÍÏãHQû•Ѭâ­Á&¢áµÊBô™ïòÉ'i½¿4N? ).ÐÄ@E>.Ã|ЃbE‘šÀÛp&wÙX_ÞøÇ”æE¥¿³Ï>;RÇÇÔ‡fí£cW³3(ÛsÆHc盎›îO²âžÕ‚ÒÑ´iS6ÔùçŸß½{wþ"UˆR¬6êð±Ç»à‚   Èz„¾,8âʼõt’Ìu!f lÊk"9F’|}#OõÁ´Ð€Ç6¤ÿHêAƒi_å¾:tð\oĈ¤m¯^½œ;ÏpY,Z(4*Lán6lªú´iÓÐkdìJ“´°ÂÍ”…jÜÿâu¤?ÕÈ0gÎ X¨ç\Çm.(±€#®åˆ¥têÔ©Æhøvòäɼ59êGy-^“d‰ Œ<]Àu=úôú<½òÖì##¡,TñÕW_Yë uŒ-ÀXÁ:Ø&}ö,XÖZc´ÃA IÍ7åÒ¬4h¶9š´)eò’ÐzÖ¯³4û:rÛÐDÐ[%®N(šX¨1AŸU±PÛ¹,/˜>&Ñ“8}lB}°¬C`éÞ½{=¯Ôo$j—HÛâäH3,ý×Í#l#Ti¨—‘8Z†i¼à-êm虩!!¦M“Í.[¶Œ+[VÆ,Cqm‚kÆ'RúoÞ¼9jôh¡)°4|ñs}¸sÊ•-çÊ8³Ù‰>÷â-eE0 ì¦Õ’GÁKW¬XáÈ0àºè+.R¤¿Õ[Of‡½Ã7MÇá¹9??~<»fìØ±<ð*’CÊ66-JhD°«´L^c2¿f ‚iƒ!V™?À«ÔU>gÓY^|ŽŒï(B‡ä#œKéfÒ3F˜i’Vñ‚¹F†""o¹å–ðù×ë)¤mœ²ÄsEnOR}ôQ …­®ŒHyô(+ĺ?¦›£cÀ©N õêÕó¼•~¶nÝÚÐï•+WêÐ † m—/_Îõ:ž‘ÏMda–`¾Ã^QÉU«VÉgX*¯½ö;‚gÄæBdˆøË 76–WVp@þ­ñaÎêÐн©ËŒmÔÌÂoÕÖE!î`Ây[!1R 1 º¯OŸ><﫯¾Êçfl0X[NÈ_¤ ʦY¤<eˆôBd#€  GÔG£«•*U2³ÄI'$ϱTäE‰¨ž,Ö ³2FÛµ1eÊO” ûõm,€ð„w1Àëà–w£¯@‡,—é'ð(à#& ²6» }3ކ‹.!¸.Ì·RŒ ½RQ&Åîe¦›ñgîOÍ>`¡<~üø_|yʰÇFSð¡B…°Žò—¡C ›nôÿÝO‹ªOÿõ·-$µ†¾XüQ¯!…ÐC—2´Ø¹4c~饗šÚQ),©6 zjªRƒÉpÚ´ô ¤ÍܱÒ,qb:‘3Î8©×¢E‹,Ÿ vVZF6“_FaõêÕ,HVP ª)Uˆ$W—9®u6H‹zÍš3Ø{$Òa¥¥˜Ü4Òƒk…{ï½÷ ñ܈ϳÜÕø¹‰[ÍŠiŽ8^ðÖÔpÁøí´iÓ´Ì<þøãæ.ðsNÁ„•ïLqñßç5ÓÁé¾Â†USŽ>óý¨G``rø!Óè¿*’2dˆÓ¤6šà¬³ÎÒAÅô„é‰Ç•½‘§±ìhƒIÝË&ƒÍäWEyë­·ì€çqÌ‚ˆGg4ùf¹ÓìܹÓg×§B?ÍîÁ‘"&`£ÎàÚ¼–ɯ3È¢…ű€a wÞy'nذA[=½¢ú1Z–¦£lÄYhjÓ¾M3a ™Y„©w72ŽIAÃÃ"¢4*¿Et"tÕ†¦Ê ¼…¡™õȹˆ n“ý^pÁNÝ?Qoá ^f×4jÔHG‹0&óÔ¡lú/õå—_[nÒ¤ ßG›F/X³f SéQc èghÉ8³,X.¯zÎè!£ZúßIÓ¾ХŃDÏY3çŸ>Rƒu›Œ®KÓAˆÁw²¤4¤I–kÓ>›¹R™²ðJå/B'U¨üY›m$@SœÙ :á…*Uµ"¬K›Åßtò qψz8Ôéh˜¸Þ¢TRHN¼ƒkÜB_€»,‰Àø‡ýÍ£ÔÔ¬Þú2±¶¡‹,x–+7oÞ ‘EÂ7mÚ44n´Ú»ï¾›]ãÎ⇲uëÖÔÏמ}öYDwg1Yçwž±*Î;”õ׿þµ¼—^q©eË–™¦•e¼.¯©ÆëPÑRï»ï> Ìé`ïÀêͨÃö²6oÞl6ù/ÝàFìz:ÃÞ™3gÿBÛµ²ËšD‡šP* ‚ð‰è¡¬uŸ\e–«…u‚ï#IOTZiæ^¶v† üah<‚AÁ†½ëz7fÌ`<2¨ð€piî¢83”Ÿs5>A<…£5¸1sæÌHxÈEÞ~ûm3§é|¸|ùr#‚•;ö ‚~×qÆÆ(µcX¢j¹e „^ðÖYS}²©O®47ÅRn:qâÄPŸ+¯¼Ò\²:H÷íÛWOÖê›o¾9eʃ½BS¸å–[2ù¥|ø_vÅÒ7æ©Í+|ÃBå@´ªnÆ ™5ìœ}öÙ, ÆÄ©•JÎ|Çw¨õïßÿž{îAÓ¤Ÿhí÷·Ù š2Üõô9ÝûaßËJáeÆcÓÑÿŸûiºmgŽ®˜iÙGåxAo^Áó—xá\šq€'0ãè8@Ä“O>ùðÃ#¤xýÏÿüÏp•#FÀTY‡|‡×EÅ¥ÁO¦o¹£kɅǪCR§yÑÓc8¨”!ˈ¤ÉT%ŒsÏ=×Xi7Á^ …@cî6nÜhhˆ0«M›6éñ«ÂÎ¶Š  {-œ½ÕO4-¥| 2\·nÝW_}Õü]p<~nPƒáZ4²MâLFÕ«WnÌŸ?ìu;h2•KG8d&/t×®]}½?.­c6×cé¶ÕŸ U°ø¦YLéÉ ýI XqNd2“—ƒ‚½ F±?.íI?1‘…ĒшŠNêS/sÄeaf@<Î~ã7ø¦ ð¡¬a^C£?餓¦OŸn…&öhÉ$Fzœ—óZØ @~)—”¬ǵÀ/׉Ы¦Ûâ_ .D‰ÞL}Õ1¾fµÙP=aš\¸RÕPD­%æ£È²?G,ª ryRîÅ[å5¨¸i|V®\ =€-X Ä" ¬®J•*ÁYÒ¬P½OŸ>,Z°bÅŠi­¢:uê  `Ý( =lA‚ZÐ\ÃHåk3K#éFIJ3ãúAP]´¬1‡,®d¼­j…û+uïWá­a¼|&¿† ‚™|<þ.¤ÏÜÔ¼=¬g†ˆAkß¾½7 Šù áÒ¼éw4AŒ÷Þ{¯'ZºiZ<ËhrT5ÍíóËáÁ¢ó¼!EÛ%ÆÐõWÖjYgEæô¬áäµÔ hŸBÄ ¹¥E T…`×H4ôT…IÖt7ÁóÍ ŸêMaó¯ÁȺØŸ4aécÚnÄ¢B|Ä.fŒÂÎä—¼ájá×äÃ{¨Ö¦CZØ9£·™$¹hŒÒþ|<Ô•¬¬³‡›¹©zƒã~œ1c†ná†>*>?oÝq\Y0Qyá^ªár¤OŒ0ªèÖ‹80±àaÚ1Sϯ˜ k|guõ޼0Å·PÇ1/'°¾•®Ç”ñ6ªP¥g¯nWõUãP#Ð`‰U”žw˜”ŒGp£Ë …;vìxÝu×uèÐ!N‚n½õV–ÇÖ­[Ó@¼È{ ¯öìrÒ¤Iƒ@ x0nÊçj¶JƒÍÓãÚH-óËE×±·>¯+ÍzOaYÕ5g…z[°¥¥mãƒvi’½Õ¥Óbå”H.zŠGqq¿» 3ùeP¢Vže/èã!*:§Ó¥ªkª§°‘á´þjæÌ™ˆ°«¯¾íÀ/þ”f‚.ºè¢Ø×ûóñØçªps9›  02£Ú ÝG^e±NhÕ°ï¶õARU¡j«Ÿïo½…õ&¶s,9==Th ³i]o'—>õÔS#9€'ª|'‚©uƒ—€x|nc­ÒcTuðH¢FP>†½L™2,*Ó•׌߾};¸¿ØC7¦¨¨1P¾´Ž•Gï=÷ºuëæîsa(A¢€µ–ygê‚ .¨Y³&øÃSßtÓM’@g\G…;v€Z¼-áá1ìô„],D;f4Õ‰¥qŒê¡>«í‰ï±E·Ÿg ©O‡pÿàƒÀ^qÃ`À?ç5+ZøÉ’¸Yñt~Ë–-ÊY™'”Œ—§¯¾ú*s2hÐ DG–«‘ŸLŸ>½AƒY±´`#€ž €©¡C‡B˜ƈOO#4yLËÙXñVó»;BSlA%=M_o©õw¾é^3Z3KI%÷ ³^Ö¾ ôûÿöÓÒƒ'iX” ŽL7Òú†qø˜fP)Á±‡ ¬Ë¬­ Ã<øàƒ,7cÆúó`Üîõ×_¿ñÆ mvƒÂÀMÙºþ"aõ:æ[Œþ¤F¶¬BíZã×!ºöíÛ·ZµjåË—/W®[£S§NË—/»Ö­['ÙÊx| BY“ž°+¥|ÎÎÕäÈÛ{ï½Í”MÇר’¼E!ôÜ#ÒÃa¢à oÃw‘§°ÆŸÀÂÕM[®ÇîáöÀ¿Øþt†¥ zCÚáQû‹=¾ ü ¥éé§Ÿæ Öææ/b†ùÖÇÃYÌ,é ño¾ùfì&¤˜˜¼Ñ+¯¼¢AÈG¯9iÒ$˜ÿC=ÄØÓãî!ÐMøÏžóçÏ7q—ªW¯Þõ×_Í5לqÆlg¨T"+H+tɲe˼W\qß„àZ«ø­ž6]»vEÁáíˆ#x4¾†gš8(—mݺuAEFkL$Eϲ+>¢o€OÇ¿•¸¢éT½OÒn=bgAFB!,¢ÈJí6®±ppR[á §Ÿ~:zôÀc Åelç_|±Y³f– >Àø8Ë«°ÐCõ-¼ƒöJ“å½#ãÒ1ý“g̘1räHõ÷ŸuºþåFiϳ,ÞÍö¼ì²ËÚ·o\~ùå@ÐÍ7ß ”vÚiŒä¡–M&óayäÇæ ÑæÉÆ´º´«+Œ0Ú²mqú ¢m•:§cŸî(pªx`̘17ÜpLaàÏy áa.^xá`Ùe£|Ññ# Yµ€}é± H1¹“îñékþ»råÊÄÂ%UEž],Ÿqa~gû@¼u½^vïÞm¯ÄL<¢2yÙ#¡ÄþrâÑ«8”wU˜Š“4ÔjÁ%Í}÷݇nÎ"q‰F&í4p‰Nš‹ƒ]={ö-Ùì]ºtá¯z}4ÀÓÒÞáõäUÇúT’*Í™eÖ¯UZ£¹IñÌ1=ÔÐEÁ¸N¤­äÃïóšS¬q†{ùÍL~õpy)—B9BEl”ÞT¾åÖ µuZ׬Y3`À€sÎ9G3ÅwÜáœØÍ›7GN<ì5F Úc}#ó°·€0YI®@BÏRŸÊägáKÙ¬–™Ô—ÕÊ¡©a?.ëÁSJSÕ²^3œ§×gÜ P³ìÿa~ùïý4Ï¹ä¾æE±x™‰ˆ¥¬„ÀÀ^¢ hžâ &¯3¾%yjs«jE”;6²½Õ¯_=þõÕWëÁßÛn» •VÉø!ÏRh‰µàQv¼sT£F ž‘¹Úp`ìÜnݺ…õ@oçtíÅÔ§þr¡>h¾ Ó¥~8Ö¯lõ…@:ßÿýeZ “ŸÖÕE’æñ¤E’c ã¼À#Kx yR&o,<¿ecêìabÂQ:ÂÜÌ•ÉOôý÷z¦E<¾ÓÑA·B‘œ[Vég#â®É 2y°5¯“O>Ù…©?ü©§žŠÒ‘º5jYJSYIÂ>¯û\úá!mBº÷b•–Çﱎ[ ƒ‚ç&šµŸù ê¹ ¡ÅBÎ[×$#-Œ°Vð >&ó¨e[^s³gò²¹0\í,N–ºº$’e9bíœ04sýѰbûö푟ÅÃ}é‰{ŠÆãpG—‰§žz åÊg­=m;~ï[ËI·óàÉ‚‰&}D¤ÏÐ`™4kaÓ=(%W[½z5C*nóÛOóš…\Åp~'×ÈDúÌçn[®ÉúÔcÊ”€Vp²€nF ´$:¯ƒ·“ÂÐMž<9 ]çRZΗÁUkNùó™3g:Pêª k(>Ú´½TVœ#šEhgiɧêÕ«ŸqÆwÞyg˜Ùs­d´CÍ¥Ù>ˆõMÒ7 ax“&Mêp.Úç’Œ!•"ˆž;>|xjg>t·íäÜËÃ,ZË–-„®]»¾ÿþû{°ñM›6ņåLÉìÈÌC¡ž@l¦OŸ.([¶H0Þ‡zH :“ñ-Ñš3gNœW¢GG]0®wáRà̬Y³L!µ=ztÐiàqÅŠfaåC`Ê2"a$yæ™gà“Q9Ža‡×)©A*°Ô/k½\¶l¢9Ü$fÏž ,32JÇ‚ ‚H#wÀð`8 óZ&?w+Ä“¡ñàò€Â…xÇŽéq-ò+.Ä—b¨¹é /¼€èd„ͳñøã#þ<¡ã²–ÿ[³f Oô±Å¿ÌZep<ýØyU—i»m…&Ö¿Z¤Gc–)lÓ¦ÍùçŸïo™Ä™ö(Þ®_¿>r&·k×βzô …ñT&êÁ¾¿Eˆ‡2•žµioç¹X*AàùÊz*âd_y啚5kÂrÃfáîôže¨d±¥I¶£´(Ã¥ƒTß“¯à¥ñ}¾ÌjÿFOOÂZÎ h€ é©`q!3Oçtüú׿Nó«D&™CaÖÈáaË”+W®téÒŒêõ×_ÏJcKN˜0ÁÌŠ´ÈÀ\0î¾pi"£&@šõêÕ«E‹µjÕŠâïìÓ(#ÙÖºë) 4 ×Êâ\²dÉÖ­[Á!”_ÍŸ?_îÍÂKùÄ£I=iVâàè’é7øn‹–ü–ËíäË`ãâÅ‹yôž t‹œ¦Â{öÙgYäÊ\¾Œ‰2ÄÜxD: ¯_ú`å_pIå/¾øB?7f×ÏêFhÅ@š–Ëêtê¤Ú¯xFFÃ4ÎtcÆ ìbµWžˆÌä×e£Ï 3Û?Å<Í  ÈoA+jq—àÒC‡e„ÍKɽxÃûÛß2ò–*v¨S3#‰ÈÌo¹å–¦M›V®\yذa™¼’Ç­ZµB-íܹó´iÓ¸oTŽë¹–ãÒÒLß_wÝun·!C†@Ûzôè¡]:ÒDÝßÅá†ìqˆdÀ~˜¹´Î?éá ÕŠx ˜&jP;÷@¶fÍšÑU _¯¿þ:ÿB±e`ûõë÷ÄOð/Ï4Á(cœÙ¡*µ-‚™F;ЩM¼#Õ=Oo%м‚.B½ø ¢„K…S+·Ðt~ãî È ð†9Ž×‘íùk9€.b3ùiå""/$ðèoÞ"µCX˜%/­Í—õbéÒ¥:Yi(†þ±°ˆ*`Yƒ7Òû:|˜%TÚm À©]»6Ãk=묳N9唞={¦'Âôе.v–B³“[Ÿ:u}Os*}Xÿ'tŠ•ÿJ]ßyaðàÁn!wäÈ‘¬¸•žxÀ-[¶ÎY)7 á(põ¨«EQ³“8hÐ ¦Û"Ýé ƒ›ÉiÃ~a‚DOÖ>¨ÛWƒc¬É8(ÔXkƒáúþûï™)¿d’¨ænÆŒfâE¥ÒÃ0tÛ}FÞ•<.mŸÞ\7ß|3·†@r-Zd•Þ½{÷ò…Ö­[ó®B-9;Eè‚RŒ\Z‡Ï˜wJkœ F¹êÖ­ »fµð¯4’"Ò¥%utÞâTô<žv²,Áy£_uѧ™‡Y(ö%¼…Íö#]4”,ÒùZÀ7Ð&dJꩨ3Oå[+(1ë Ü´²ðV¸Ög8=ΰz«d "ê' óE–QƒÜu²ÕvíI½‰ã4›´'lÎá†g^µ¦ìL~m”ôˆ3+ƒ XìÛ ¯ƒ(‡Sxî"söÈ5\F%dÆyÁôñÍÝ»w3hƲ*ô4«P¡BýúõÑ)6lF§áÌqé_ÒŒ]Bµäu—.]`³06Èo¼Q¥J‹Ñ:£Šê¦Æ„Z"'2!C¹ã]wÝ•ò„ÃãfuÌi5cÀaõºDÚO«®°õè¶Jë„ äÛáD$fB«êÕ«5²¾y€¤ø¦Ëw&¿&˜C¸rõêÕ¡Ó‘ÒðØã°)uhÙö°bÅŠžÈÇaVtQˆ>p}Myf¡¤ç•*UzôÑGSB¦˜ŽYÌ”«Ñ½ð€~¹Ì•MAûM_ï ‰,šF«u×ß à=N⸚êÃèÑ£QÙäœf̯×ب1ÊÆ8É8q¢ÚÄСC#Ä2“_”/£ÚHêø//ØJ©è¡†¬ŒÔúüöá‡n×®¾Ö™¿­p±xñâŽ;2à<~èÜÿý+W®lÙ²%O¤ÃÖ•}š mK:A']‘è,€‚5õxF¹½Ç‡—,©Ãò6"ˆÛ”†¯RNÅó_lSï—GÐ mk¨(õü1Ï"gÑ\#EDaô:íL‘ÇÓ™\:õfÑÊaÁ£íÛ·óèö_îšÁÝi¶gõÓÀ¥õ4H—A–» @a šÝƒT³mE–Pµ^lü(kŽJ·‘G¼5Zи¶ÈÝáªóŒÌÝÇZ}ÿý÷=½Ò!\ Í…o¦‰õtÕH—·’R»Í÷õ]4ñNx»ñ¾v ¡>œ¥Ö¨¢ºvhǦWæYBëµ ®Œû~ýõ× ©¥,GËO€zë{*F]Ù͘¡¼vÜ„ý¥­ê¨k_DMjbJM ¼9Kù‚±‡sçÎ5¨X¸0”ž¡VPÚóˆ÷¾[¶l‰|œŸ•ü sþüùÜF‘Ö¼îÞ½;Ÿ0ï &ì±ÇZ¯'-^,êy®•.†5äÜF{&­k×®U«V½ýöÛ½cžw|ÈÌsÏ=W¾|yXkzL|ظt÷{ì1öWÓ¦MLgoŠQà ž :0’ã·oß¾¨`¦ÔŠ*Iͦ•’sFÛk£×¾}{ÖÀáLàÉò0wî(:TkP íÃaèñÝwß<'õÊŽ}'1€*#ñ[µj¥O¬ÿb¯Y—U±Ï ÿ\: ÿÔ³ëÁ”Jy°(ø°ž„²e˦>KÑ·"Ô;Š‘Kgþ¶Ø„&‚…­5v½vHFìÎ;ï4E8‡4ªÙAABë5g½º&5™²Ë"Îy›’.#æâ\&€7ÅŸð^Žd,nX&Ë/€K,{©»Ù;[ºá5Yƒæqt«N#m¯·¢‘IÒt·pšš7o¾wïÞx¯Àõc$MïyN"QGAsæp‹¨Y/xzw]hø¯ô˜Æ•áÛŽ¡ALQs' îÄpíK§áÒéb [þÐCsÎ9*T@‚Ô—\r Z ÓŠ\›0aú” iøc æÈ„œ<&‹‘§óiõ–\ËqéäÒ:rLŸ>ÝVØ´É 6Lr•Åc¬HëÊ6° q¸/…8 ã†bUfº<ŠHêPá!ogžyf»víü\ª]»vŒ`ÂSàh`¢†Ž;ŠÉúÜ ,VW rüë¿þ+,ï_vÙeÀ;5‹#Œ.qÂÕ Ö¸gÏž–Ïäg`H1î †n.ðÊ'5&¾¡­¦ Ð+#ÛefOô Eá,ÉXzši{ôré4eS$:¶(’SúªÝtÓM:ìÝÿý´5,¸T8Ö:®äxsPXêÚ6ÒV= ÒO“©fé¶éÑ@ŠY2=¸®ÊQšîÚk¯EQ2;PÖhÇ dõÁ;òø=zô0mˆ™+ Ûx]ÊãEÑÀÒ„04&QœéׯŸ©H” ÞÅú4zYìøš'øBhŠ½Ì oµÄvêÔÉC½,x4a`\Í·üJ³ó£G®\¹ò!C"e™$?X¢iÜ4XvÊû¬?ŒÌÛÏ<ó ¬›MÊ£«>9ºåD²ÐÂëUmܸA©²ƒ)‹fÒü0¬G2\ë¹;¦?¤Í‚w¬Ø¤‘3<Ýà;wî4h•¬V·WEJÝGµDõïߟï÷îÝÛëJË—/÷P,¢ò¹\‘]àÿ#pé0¦±0PEQA‰ÅÀ²¬Q£FûöíYZà'ÊH™2e>ûì3Ð EZÃ.J—No”2gy8ÆŽ†‚F¼CóæÍ=¿Cº—mÎ"é@±yóæ¸F,06,c¸xñbõ=ǾÉk‘Èhܸqà'_ Ø}À>ÛPãLoÖ¬Y[·nuË3ø@‡ç¼z9‚¼e/h`S¯^½Ús=m5ôJ//%(Ú±cG `äW~ÍÔÄ\ðÓO?¥c\ĺ‡@–%¿ÙS }… Ð|­¿ €ˆÃ\Ǻ‡}ô‘v'Òß±f4„ À>å‰t7C2ƒÉu¤µÚm,}Ë¿¸oÔÍä%ó™9sfXϘ Ç¢ZfA±îá>c¹&Ó$Åå^#GŽd£%y˜¥˜)’˜¬Tš{„ù@¢M›6-Ž5YhëBP¥uèR\æZÉãÒ«Fp Ȭ¹sçZÇä‘Ga¥™(oðàÁ©á¨¨±ÖËÈH ,¬[·Nû*;4º.&ïbûLŸ>]ÏÕ EQr‚N"ÅôWÔ]v }ЬlI `Ù# UBejhÑL%2ÑhPÄbÛ¶mz6=˜NwŒ °Œ1"h€ntë­·j©ˆ3/€Yá¿òÊ+uH€.Y²Dü7ÈK M߸÷5C)kìµ×^‹J‹™<‡´M›6…»H¤¥o`Äø 3‹% b0ßÏk¡°<ÿüóôÓ2Œ€#vaDÅmK Z¨ÿZ·WzÀ!hâ¤XÖì y{ðÁY$އ}'Nä‡íð<;Ü W:¡7ÞxcÍš5õšc®­‡rÑEéLnŠ*u F‰£pX@®9â[¦Ö‡JwŠõyùòþrâñ5~nånSü?¬#Õê3ù.©Úa2ù!Z¼E ótÜ®C‡"¬_¿¾V&=Öb»YÛ%ÇBs\úK²Øºçž{2ùå¼Ù­0I^´hÑ"¸Slü_Þ¢~_lvS«qÇn¸Á’¬‡“K›¸X»„[Ýr+¸—ÓlÒȯ(xÕŒT¥ìÐÔÿvíÚµ|A7ãL~føô¾©{ð®n‘'0ýrz¦/e”¢ÏôâPëÜ+ ¾ôÒK™Ù=z_µ‚†Ù¹Ã…¯›¶æ›è;~ÈþýöÛH(¸w NVŸÆ}ZÆs02§EþêpT›)›">’åfò+dòs>h“7ïlYcEµjÕúôé“v,¬3f̈2¯ãÆ„! 1í—¹ DÎÚš\ì›Ý€Æ°SÂdÕªUú/™”/½u”µÚßfäç0Ét½©wd‘¢Ô–ñ¹óÎ;]Ї—œÄáÇ›`9NXbr=Ÿå­nAb:, Føõ×_÷,RĆý¦'›éöíÛc§­L„”žY`Fø-÷ÕîðÒv É÷ô–g9ýôÓyÒÈùsàM-VsöÙgkƒêœuÖYž<¦§q&›k9.eüS^‹Í[øáÅ AƒØÝóçχžñÛ"wZ¶6œ#Pì&žÁ$mH•õ8g•uãŽ@xË~W*4M·Ýï‚À]wÝ4é ‚ôçËQ›íÏÞ”?0_ £ÞR…5kÖhdÿá¾}ûÞzë­ÚîÀ:ÀS nÄ5ÑÇC"ŒO>ù¤963y§Þ –M-»Fç† ®^½zÇŽF©-5Ï‚{æ! 3÷å)ø¯@úÉ'ŸÌ›7/[ïß¿¿EÂÍ£1}<8â;¢ü´IŠ~Ñ´Wgò£o»wïæ; Sÿ裚2Tiba;«¼ñåÍ›7óÍ7¼e)òø¸”Sñ˜AáÉ“'g’Ð?•Ú Süì³Ïœ˔)„j¡:á„5jD¢|9ÌÄ c¦~bLÜ×ï[‚6­rEg:wî|Ë-·H*/L(‚à vÍß›þ—§ÃÌ#’å”SNÑÖT„ùv §vb…£”b‹R/öá‡Z+9kLö·ïPš6mZ®\9ÛA¿BŠÿƒpé<üðÃQ¼2jµ§QÐ3´õÃãêytqi90 •Á+²Ì`e¬®ºuëª ‹Ná1¥c3 °ôgœ¹°µÃ¬¤Ã’¡ݘŸ-åðóf_"/1bVK´ÔrZœHOlHõëËä¥piÙ²¥2Ý€š°XŸË£^z6UUoæ(ΆømغEË@T iÎ F ”sUû—¡·ÿš×|ŒÂ u¡íf’ÄJ¦ú‰b‘iÚ%þåE|vnžr1J © ðٴݘdh  z×®]|éÆq¦O¸V®E\šÅ•ì¶mÛ6uêT‹`x7Ø YirK—ΪžFgØh(×P\£ •üesi›5…§à›†Õ[&ø Døó5@,U^Ä“¶ñ‚[›Û q)s³,£¡4þÐÄÎi†“£.^4ŒÕÃ3ùåÚSž¦LÉäŒè6=4X;K¥ {Êú¸T÷îÝ8-É?ÒQ]½0m agÄ®,SRAziÂ@ÙÁ1§1—ÒAÅËFþT!g–¡F…pF~Q½tøP‹¨ÛÊãr¦2 KäÊ«V­âsæÈìLqº*?Ü´iÓÆO<ñĪU«êZiýß»ëáÙ¤ÎuT(¤A¡K—.}å•WfUª=tÍ=Ë83&åË—WJ¦ê€ùÇPúøÂi§‘¶ÜCš¢M·}î;Ï;vìÈ4IEV„Å? —ö„gÊh §¦Û-¶çáqò\²dÉÊ•+ ¦½ùæ›qV«i÷½÷Þ ZËÛ7ÞxÃó8~»yóæÈ¤ÁßÝ»w§¥ ™Mt”/ëÖ­3b”Í‚Žoú&Å%ß_¶l£33JtM„Ÿdä ãéÒ3P.åA䯠®‰¦ÍÅšÉKÊ_æauÛ`i¡V0t›O\l<o®W« ò–#Ý+C!aД¤ó¡ýä¦ .ÔK'“çÒ6cÆ †HXà‡á…èãìÚµ‹‹#‚EòÎ;ׯ_?¨ËÁ£ ªo™z#£3yêDQé>ÇBs\:m®OƒÎ¦L™R£F-ZÓ™çSD*Âuu¤qéÔÅ×á2·­^.–ê Ó.€€Äg-ZäÈ\tÑE†²÷ÿ#¯ÙP €¼•*U ”ûöÛoçÎë>þøc¾¶uëV ná2eÊ´oß>ÅpU¯~CwLØã`‘úÕIæágžy¦çVeË–Üø&`ÈhÃÍÂH>Cü |`ÏÅÈ¿üòËï¼ó½µo0Cט),XÂ2(M7@6ƒÎ:Ф3Î8ôû裸i„]såµk×:Ý\ Fj÷>|8@ŠÜ¡ŸÚüŸþùp`±ýæ7¿üƒ12àŽ€}K—.µÿü„i_  OdŠ*ÅÐŽ;˜5V~—.]èí¥—^ªS.æj¦$¥3°8& FÁdt àÉ'Ÿ€WiÈרþŠÐÒ2XL¨eù°W¯^µk×v½)† Írv.%'§‡°P¾i4<2??ùä“´œ1J­-èÀ³¤ùo#Ò‡b'ÆCy.ÉÛÔ-9N ^ Ç)*ªDØ«yÈëÖbÎ%ºÞÑL¹OÛµk7bÄ®ã ÐÃð¹c<xÓƒE”Pžçþ!¯……Äôì9 šãÒûllÖ¼™î@BÌávèðíˆâÒYÁ,Fáé¼Jƒ³ÅÙ“¡>‚ˆW¾3\&L`KÖªU Åùµ×^‹ÑCLJ!ëËÊ¡ÖBØ/ýâ‹/,‡ZµjÕ›nº)­1 Ì2¶ù²e˵ƒAC©×ç„¿¢Ï?ÿ|(¢);n¾ùæn\Ÿë„¾o…YPË tB«™[Ò 6àû‰hi÷, ¦»ˆ>ö0ù| É…,@ÖÑBHyÄ%täöÀQµ"r´Z®Å@•\|®9Ža4WªŸƒ´MãIS0•—\rIùòå™ îÅ•™—(OæÙUˆ,sÉaÀ‘ éEx±ÿV~OÝ3yÙ<G74hÐèÑ£=ÚÎ$þÌFÐmIˆ)hh…ñÍ‚Ad±ïЪœ±V²H#ƒþ¹4ˆØçDõ©ôº§=Z¸´2tÉs€£aÆùè°©kùR w…³%Óåj"eà§6U“rX¼•×24V5`å!¦øiø‰é/øüúè£`¯‰èÞ¨Q£ÒÜGsçÎ¥“!+¯¿þúL^j;ËV¼¦tÆ em íÚµ A'tÉ“'ó˜eÊ”Y°`AùÍš5 Qxà 7¤‚ØœxQ#LìmÙ²%¿õÙºíu×]§à;|` v”5•_{õ~ImDÍAƒÅ^pXXóHm6ÎÂ… £?úK¡­ê¸¿}§ÖÉú÷¸äDæbáÒ4XÎÚ`ܟ׸ûĉùÖ2Üyç=ô%;s\:“ïãa‚‰£ð¿ýöÛ,t-ˆZR¯¬êfZ€ã­ä"³5É ð®Y›o¿ývÖ9|ö¸Ö«¡&\|ñÅôÖ¤LYÓ¦Mé¹ÅY`€'Ÿ|rè#Œ6:Ÿ#Å¢«æÿ7ŸIš2qÕªUü¶sçÎVÓ>¸-Ï ¢é<ÿ³Â‚Θ$ª`¡C×Ôã˜ýÏ>ûL›¿êƒÙ<ø¶”O¤éÓÓ$ɱ®ö·ï²5X<,˜b¬rx$pit4¤@5ÐÖÕš™wÖ6ÑþêÔ©c-ÏÅxãÒÑ%u4…š.1‘/º`–fÖmýúõ{õêõñÇëŽk~ýgTö ÍpU³2SO~ýŸ3IÊhW…ø`1î´žošÛ“×{öì ’¦f@Ñ€FoæðH¿)FÃÃÚCYÙÊ"àRîÑ£G{Ô%ròhz³—°®hóùçŸ &öDòÉëÈpþÇ?þ1pÉÚaaçAT´#¿‡"Æò¡²j%f©Š!XXÞ7†¥Ä¼˜‹ÛÔ|&¥7^@ïǃX1û>W»ì²Ë¬Î–Š->/š¹V2¸t4Öáˆ#¾:uúßößàõêÕ»úê«Ç¿yóæ"Lâqriq,Uã5÷ØceƒËœÙÑgŸ}vj6t˧º³Â”]Ù§O&^½xñbÇ|Ú´iag ™«×Mß¾}abš…M±qãF@O@ãj ,pLø/7Ý´iS&χ ó-t R eï¼ó0%²8¿ùÍošÀdÜ2V·mÛŸä:.­p4"{ëÖ­²SïnÜH΋>úȤ|\VWüÁƒÇå.Û·oר‚™Œå‘o»í6ºáS8¶ò®+_}õ•ÉcðΣÄónذÁþs}dV&q’Ï:êŒkÖ¬ Ø7ÎE»´Â%8<@ê™ù "d¼þúëY&nuHy®¦ÞÁÔ¤6–ZµjYVþàb„ît»J•*ÌHä@Ûgã /¿ü²å]ø2/gÑCÑ<1ñµ²LhJ}ß{ï½fÍš5iÒ$8ƒâÏ%O´¿}—É/Ä›×ðõÉ¥d«±•õ=÷×r\úà(¤¢R¼dÉä õø-×®] äšÍäôªÀ2ûèààvˆKÐüŒäêüä FgŠf³‚pX:ÈcNK ‘›¾ÿþû±œØh­Zµ26w»ÀOy{&ßË×â&™¼HúÉí¸5½Z´hQÙ²eCfÑÉÔ3¡Æ­ÃÉð믿¨…/(‹4›|‡O€eŸˆ=‹hà·‘šƒo2 Šl“ ¿ÊG¾<}úôx¢wß}×ó,ƳjÕªW\qE1λ–ð´òŽ>ç9šãÒûTÄXð<òÈqyíÔSO-¿ŸV¦L™Š+6hÐàÊ+¯3f „§ f¥æJ3sÆŽ...]ˆ¼`Ì«U«ÑòÀJ‰fFb÷š1hÌKºõÐî}ôÑsÏ=·téÒÇs Ô–uûí·§ ôâ1gΜSN9ZºtiT dp^}õÕ0PÃIF-¸q/è(¨ÅÆ×ŒÙávôM+1³ 7ù’É ^xáð3*8†áÑmÝÛk¦ª4›ßB_ð0‚çü\žÃT" ´ü˜×&ò)1>ø òW/eíõ´¨ŸÑn`B¾ ÝÀ"5êr0ófòê’#q¦L™âuL’ÉÏhv ¾Œ4LKZ0†l ÔËp‰…´ŸvÚiLb”#ßg ß`tUíÚk¯Í2¶k“ÉËUøªc„5<¢yýìú¿çž{ø&œòó;ÌÓkÉEöHj‡7YйJd+øó!CX‡ÚKµìíïl1Ç¥Zæš}ÚÄ)(‰á¨*Z$Ë·Ú]£€Ôž={Rµ_Ûµk—äV©-dr~¨£E¤Öç'ÁH‘§1Ü*Àüäì³Ï®_¿>Hî‘PV·#…Ž4ÕF&/PÅ#¶š5kN:•ë¤A.Z&2²Wñ®Ã#[j0“ŸîC ±.mØ´u 7gcdÎTÊð ;Í&Þ6qâDD¤Kè¾ûî+Ï[¯^½Ðž`;Q Â"ò9šãÒi‹Ävxâ‰',>‹Ð߸Ÿ†|œ“מyæÞ"ý¡õø)`Òu¤qiá€^Ú mÈçwž@ê‡BŸ%JÓrÏ[¶l+úôé#VÔ©Sr€2ÐÈÈ` á4Žk†Fï©wÅJßJ ¨”;E–`ଘ¿ž4-¶ó…ˆÔ“ÖÆO„AÓe§Ðaw~Hz(¦Çf>i£«†lßrË-5jÔèÔ©Spf~e$£e t?Žì™¿M³,!·ªx&?$ Y0{öl¶ÞÑ“'OösÆAƒ¼Q“18ܵE#‰OÇR·ZZ”ó¹çžCñDžkÊíJ^»vmãÆëÖ­ûðÃlj§¾R]!>x±œú÷ïߣGný³Ú¨uи—ŸžôÂ8R’O[nÁð?1o I'ùWíÚµ;3é…ñŠ·t†»|òÉ'_}õ¿¥“B–ÕÀy^—ÇGrmÚ´Éú›ÚŽ¢¾ =§ÏüÖ„Ø:o G(%é?o‘¡ÞšäRݺuëСƒ‘,•+WFIŒ²¿ÅÒ˜ÜÖ­[õQe ÚSŒÜ>׎X.­’Ⱦ\½Y¥… 66;ˆáIë¡x4ó]{æK×­[w¤qéL~îÖ'Ÿ|²cÇŽ .Ô|É’%†'ÈHë¤Ã SÚ[È• E¯ºê*ý.¾øb7)TyܸqPtã ĥŋó+†ðE·nÝ `r°  —–Ád>Ü3Ö¯_7–÷nÞ¼ÙÄÑ™|çH&×ÔYš1ç‰øCmòO¾É't€N§áX²`ÁäX@è£>ª‹…LxÆ âªÎíÚµãFz8ó÷õ×_âYÈ—™3gr©°~3ž‘ÑÔ´Òf„³˜ÏŽØ’Bùå—ãÇ×ú¡¸6lØÈ‘#Û·o¯-÷’K.T3É•Ñã'Ž9OľöÚkçœsާ¨ºÇ±‚¿•üë,Í] Y$Vó¹ÌÖ\À2ÿâv^YG—BjiÅDX¿, ±ÜŸ1<µð~Ǿ‡®yÂÞY×\sn¬&zðàÁ¼=zôÿ‘×rvé"i <'S `SŽK-?/¸à‚úõë÷ìÙH‰Û,Š¥[r&‰°SÇñ:ðI€ÑJ1™Ä,LÌ’ÉvHDÃj\ 4›DŽþ˜’(-ÅÂZÙ‚ReÍM7jvèHIGŸ}@«àØYrßôMqñ‚ƒfüˆ ù/¨û#˜ íz¦éóÃ?B–ÍСC—âÒÈŽ\ËqéØl.Åf™6mZ ßì§¥¢áP˜>"ÞelCèåÓO?}riÛ˜1cèÛÙgŸýꫯjgÈä'Î$aº¬¨¹g™dÛ¶mË$V¬X±_¿~°ß;ìYFQº $a HÖb°ˆ¡sÄ"½O¬ \#*?Ñã"€Z×”€qí!~ÓàŽTˆ*ZÝ o‰ê]\Ö”qZ•«T©rÌ1Ç,Z´(ÖÒ¶mÛbNÓ2q “ú8F 2#æ7æW†`›ïnÇŽYA=±†S.Í ü•W^ñªñIˆ Í;Fñð}ˆqíÚµ—/_^ÈF0åuè¨ PzºtÑEÁÕc18³Yç i‹’å*\fÍŠúæÛK/½TªT©2eʸ»‹0keáÍÇ4­)¼Ž?þø›nºÉÿB<ªW¯nbÀb${%Ï. €dq˜bŒÇ,Á\:“_w›} ¥Dïþúë¯çÍ›·jÕª?üpýúõ[¶lañ‹«á,Ç^`Ïþæ7¿á;(þü—Ñ£€îX ÿ;ï¼ÌêKî^š²ÃϵHó_OÓø$A™êÒ¥‹6(£ivíÚ~ã7¶nÝjí*Þ>ûì³6lä²H”\…éÚµk.áé6×HùLž£¿UqeÊ^YN%]u âGŠÁìt;•FÁD™³I“&q5Æ¡V­Z³fÍò¦G‚+…™Ê—/@¹ú꫱¢˵’Á¥å¬ö?üáÁ¥ É3`%…ÈãQä2:-âušìØÅ¥͇löææÍ›ïKë½lä`Á(ã)S¦Xȉ ?þ'Ÿ|[ø¤I“&ÂN@4C´lÙ2`Êðñ‹ K7mÚUTøm°AÖ Ü<¤°, V–:ê¬^½ÚÀm¿¼sçN‹ªˆ½À£O$Ð!M%\œ./à!— ××_~“‘jÔ¨1{ölż‹ûÞ}÷Ý­Zµš:u*`Îð}/E'ù2 Óæ›ÞÔP:ƒHBÁKÆ_|ñE] .¿ürtœ{î¹'5š2"•û¾¹’éÏÈx–.]ªì4ugwr¹éc=F ‰CÑe=ÍÑÄÌ^xá…Ìì-·Ü’Ê‹H²ÏÆóZáË/¿<ñÄ+UªôöÛoªÀ <óÌ3Œ°zö¥C½/ê(̓´½ãŽ;ÂÏÄÊàô§`2«—>èÆz8õÔSÙªì¯BÔ±—þ…MygBéT¼í¶ÛêÔ©cÿ²eË¢_ƒoP\6)ÈÀ6D1gËŸwÞy¼8pàØ±c{÷îÍk–-ùÈ# :ô˜cŽ9ýôÓ;vìØ§Oþ¶mÛVTéÕ«Ú(D%´e^sT»víŠ8Xºt©oO8á„Î;wïÞýœsΩV­räûï¿gIÜ|óÍPSºÔºuë ¨þ_ýõ0ö•+W^{íµ't€|ÜqÇÁ¯¼òJn4|øp ¼½ñÆ/½ôÒFuêÔ‰gäs]¤¾:(r/6ø¨Q£¸¿ìnö8ŸÐmFTç"ãÆ«_¿~³fÍÌuyÝu×Ì<Ñ 7Ü€àC((þ^xá…4W&ɾ[Œ²^›<¸mlïW\‘«{˜ãÒûS´Ê,`V2«Íø³j—¹­4襎Ϳ¼é]*9wžÁ»Ž4.m¶Š>øÀÈnî“ýùx(M<äÒõ—¿aFfüÍþ0ƶÀ¢¹ ÐÇæ9s&xòôÓO?øàƒ «¶V -:7B O9å” .¸¬ëѣǹçž{×]wA]€‚#F 0D¥Ïýúõ3fÌM7ÝÒš×+W® ˜4EFª :ÄþÞ{ïôø¯'NœÈÝAo®Ìjy衇Äa~Î@ì¾}û"`€ü°åv\Ê€hÁŸ>À˜0÷±}|«xë;Á oß¾4.S¦L½zõøäñÇ¥"îþñÇÃcî[ªT).ÚóN½úá‡@æ4”ô;&Q*ˤ˜ñ/“ïD f[1°.0ó¨{l𮤕"µÝ“[pq%H| -ÃlèMéSˆ‡É»2yqú ‹ág¹YøÆ¶}ázö|ÙO~üñGø?#©nÓ«—þåÍü“©Ü/^âZR¹tà¶þæÒ ÄèŰ\}ÉlT qïÞ½zNºßAð: ªŸþùÀ¤fÍš|â!/`ÅPP@øw¿û×ÿÕ¯~š•+WæÉ¯LúÔ°aC0“ådÉ0_<½õ´iÓ>úè£ñãÇs5¥‰Š·àðܹsy @Û›Z)Û(\ôd ˆ$–m p¼–É äéÖ­›ŸÓ1Íj¤€0à Q7•œdøÛ´iS¿É2@©·¯^‘­y÷úë¯Ë%„MÍçs8A,«”M™2…~úm"©\Ëqé´éÀàp6T]3$ì³eIêHÎYTÏeFˆ>öjÅŠG—†CêO«BmÎj±‡Yµ×õžµt¬¾Ó\A8¾@6Þ L1Ú¿bºµTªÚØÚÐÈ &0J>ú¨ÀÅ'€Ðç ÐZˆ%’+ b§žz*ü¹2ßAþÒg ½qãÆà*¨+ºòÉ™gž©Û škË4€"¶‚ò“O>iÞ¼¹V“-Ó1~‹Ô°Þ77=ñÄé¿Tð­±.‘æç€-cÈòâþûïç⨈ Ó;£>´hÑ‚28êõë׳VCšÐ>×nƒ>óp¹Ô šºUD+:™rl¦Ì0ÒȀʯR"ÍÛÑ£G£Œüì:‰~©{UTêׯό |qe«Ô^é;\1QÒn¸¡7‰M›6Ñùø‰b@Ó!mî_ÈwŒí‰ÖƒFlÜ¥sAÇðÂc6s\ú›ðk„¬£“—. |"I£ÌÐÿ‚±O<ñÄ!C¦OŸ>gΜuëÖ…x]¼x1‹áÉ'Ÿœ8qbÿþýÇŽ;uêÔ°¾>ãÆ»ýöÛ{ì18y÷îÝy•U‹_µjÕ²eËžÊkàÿ½÷Þ‹þí·ß*>^¶U‡ ÇÈÈÞÎ;ÍÆéÅ¡|ÜtÖ¬YŸ~ú)"ù9¨Yô©ÁEš5kÆÅ·mÛžuÐÚ?þñ~ø!—å üö¹çžK©86l‡AB0œ[lݺ5“Ÿ ¸{ùå—'MšôÀð°ƒíÃ'AÛ²e ODè3¿¥Û}£<¢oú‰i…(FŸ¥ˆLÖºvíÊp!Îî»ï¾ Íqé‚véð†E~lñ‹CŒæ•Í$¡èl(XÓ‘Æ¥ƒÆH_ÑåÏ?ÿ| …ï/'^AÍš'Ðé>úH›­ÉŠß~ûmsªŒ9’¹6]FäÇ)bÖZã‚Üúé§Ÿ¾† °ë~·`r÷ìÙôr¨' <ðHÇR?j.øÆolܸÂÜyôI»)¯÷jH‹-zî…A8º—É+txÊ)§XæÆ›òý[o½UrÞ¶mÛ‚K«&#©1?õ3dlÿ’×âºgÉ*´¼X3Öp¿øà¼æâiÁ>iʈÎ-á‚.cáËí¥q©ÂãP”˜úöÄ¢åRÈ‘† rÈÿ»ï¾›É/‘¹¿ÆCñÔî$—jW![•ΣԘdÆhˆÃfÃÑ̓û"—é6âxРAª„öØcCܨ­íëYHÑž¼lÙ²X!|ðch®‰°^W?S³õ:øô\G $ÚoûÛcŽ9¦R¥JÑÿB˜•Ñ‹\!KJð¤¾p¹v ’‚ñŒä“O>ÉJ«^½ºSÔeâŒXŸ:'"¸tn^²šª:ã[o½5bĈóÏ?ÿ¤“N>|ø_|R Í:«yªð0ù\;üM#íÿÌo:? (á]µjÕ*S¦Œ ŽØœ‡– ÎÊp«åPwëY³f­Zµ*“”ªm„”¼L;Æßâ}^d´Šý3<ýôÓ›5kfá郣åì»»ï¾[ŽÝ»wCE¸à¹çž«‘–a1Û[ÉXÏbŽuU`#<cˆJxÆg¨þ«(#÷xüñÇ{÷úýïo™+®¸âÆoüÙsše@`ùœõƒödHËŠ+RùeZȬ ßîØ±C×ô_|ÑKIQ¤©,˜Î;£…ÝtÓM _ÍYYZê!jÜÎp™Y5q²Zêg¢«6j>dñ¿ÿþûo½õVÏž=ÙÂè}ôÑå·¬uÊ8ÿîÙ³%«zõêóçÏ7 ʼ1.?V#;… >öØcÒx—äü0pi“Üfò wìØ1Òú¢iÓ¦lyƒ1KDó,›7o^µjÕâÅ‹Y¦ß)I\’ ‹D7¯½öZ¿~ýtÓ*]º´ÑfÇâ‡j|;(mÓ£I¥íPbråÒñ·7ÆÍ-guVÈ}ÕbÝwß}\ÊSÂÈq›—há µº]jÙÐÃÉ…kYÔY˵b׆âõW_}5gÎèVãÆkÔ¨<õ0±L™2ÃæùwÙ4XHÖ¶øßó›áÏ™¼¤šC† 16¹lÙ²rŒt‰úP’ˆ&®_¿>r$¿êª«Š1³Äýò )aAÏ¿þõ¯ â*Uª´jÕª^½z­[·îÝ»wñ†®ü_yí—ïSM Ú휽{÷Ââ.¼ðBäÎîÝ»Ó ýâå–EÒ„ ĨϲiÓ¦:´lÙòøãG:Gü!¨Åk‡?ùä“K—.ýÖ[o¹Ìb±ÑgV#t€lÐ\ˆaаò¯˜ù\:­;‡gµFSB‰÷»ßi’Šd±¬q™eî0ßø›o¾I÷PL~øá½+ÓÍx¨M¶Ï_¸´Vñõë×÷ìÙ¤b›6L#g‰Ág † ³á®¨=öX ãÒz¿G µ6VW£F*W®œÅ7 BÌùx­~š&B§NŠn ضm›iWµ´žhmõêÕ,×öíÛgòÓä¸t– O!Yÿ5LjéûRÎfá¶Ø2%@ví­døx»Š`x¡+ZÒx.õ|Piø5;%ßç“ø}öÙgÅkÓ0 Ò×Ö9hÓV&ÏÚ aæ:Ï=÷\$?¾·à¯©%cU›3Í׳gÏ®[·®>< .”h9ïÅé¬1ݘ‘VY阖-[Æç×\sM2õ?{ºâL–3Ç.ŽÒŸañ‹# ¾ g~ê©§Bûº¿ùæÖ Ý3fŒkFå4 \‡zÜ Vöäí—_~yÏ=÷ :T?ú.…G{s~úé'-ÌË;ï¼£q Äpi¸ÖŒ3&Nœ4¥æµnÝºÉ )}à²05çb‹ª™]9vñæÍ›¯¸â [i„ùýï/8œ@ܹsg©R¥N:é¤Ð…s\:m`òœ9sêÕ«gÕW;ꌉXk×®]¡B…2eÊœuÖYO<ñ„±ó“'OF‹,_¾ü!C<†Ëµ#¤í±‡¡ÅŸþùîÝ»¦ABN8᳑ü×ß¶í\Ú@Š—H§–sŽ&ô_xM†eÔ¨Qú—²yxààÏ‘¼î¨nð=Ô~÷»ßA±Î&ˆnܸq•*UÚ´icüÿ'¯¯nZÞ{ï½t2RRD¹[>Ÿ;w.â",Üw‚ û}^K¿˜¡È¢â¦Ôß#e¤‘ÒÖ"æ3gÎDÛ²Â#;…N²Tèᆠ:wîüÁpY—ePèÃsn•Q¼€äÓ¥¨øi‚܃3£Q-|½B-»%†K—+WNV|É%—XªGfÝ0 råÊ,¼/󚬘ˉWäF›ôí“O>i}yƒ »Ç.ÑÓ‡~Xºti Ê¥s ñÒ&ì3JM›6Eé˜4i’;85]€Î6žÓžzê©SN9>óøãçFïÈiG{NAË?ýôÓ~ýú™P ]£qãÆ¼¸õÖ[z3"¸d@“†UZ3½F–Ö8pà‡~˜*ÅÒ¤×]wݨQ£„ÄX{7Üpâ x f^IøŸÿüg ñ̘1Cáˆ:޵¼`rµÓ.Y²Ä8Ü;wfÙ¦t'`Á¸qtÛ®X±¢|>ÆjРAÆ Ë!dqµ’W«å½÷ÞcK~ñźä…"écìi*›4ÿLŽKI‹j ŒüƵyN™2¥oqÞyçéÀp8•µk×Ϊè¾ýé§ŸÖ­[g¶Ï¹sçF`ø-·ÜÂ'W_}µ&²\•–—.*»MVö (ÔbË–-áJJ·EÝB¸“…;ãôÐâz%c*ã•a™={öÙgŸí†•aΜ9Óÿ– ÝÁ‰Š[·n½í¶Ûô–¯_¿þÈ‘#wìØQŒåb£ij;)¯­^½š…ƒe¡òyëÖ­o¼ñFó¢ácy"~¥ÙÙdÒ™Y—=/ô¶åstL=^´uÇ‚ìâꞼضm›‰ÒÊàО:uêÚçZŽKºæc~ýõׯ]Æcæ¸t‘7õÔ–¾}û2¤—^ziÑÖ9òìì / Sjn¾ îëöíÛ3J§Ÿ~º´™•¿|ùr ˜\Z?OkßtëÖMæ“ãÒ9.]$í»ï¾ûá‡þô§?™ï.Ý¡ÿw^KQ·`ËÃÅJ—Ö4 ÅbB¿øâ Ø”6LZ¯^½¢¬RɈyüZá~°råÊ~ýú1¹Ã† ' Èg±'Ó¦o’üQ£FñÚØ;w–/_þ®»î ]°âyVCgdc^tÑE\ªC‡Á½.\hé¼yóBQêÑ£‡6 §[?Lbyf‘Ñ»víjÔ¨_~å•WÜø ÚwÜÁ'çœsN!s\ú)Â<xÅFîÔ©ÓUW]¥µ$Œrn“—.Úæð¾öÚk¥K—®X±âªU«"ˆ£HÚ»ï¾ËLU®\YOB]ìrÃn3œvÙe—U¨Pá¼óÎÓÚ£7]¥J•äÒ®|PºmÛ¶|Ò¥KE_Îùxä¸t‘ôÂlš šyÀ¢¸RDEµjÕêŒ3Î(oË”)S¯^½à“lö¸”I<âÙ·oß~ï½÷2 ½{÷~饗üÐØá xæŽ%Óz¿þúë€ÒçŸîæ/’*^<§÷Ýw_çÎ׬Yj7ž5kV&/¾Û¿…Ç„Š¨_|1?lÑ¢E¬á+VT©R:½dÉ’øò5×\cÞ°D…a*ªÎyæ‹Þ!ñž0aÂ?þ¨—ˆOr1/9.]äš…,Ú(˜7Þx=N½Ø-žãÒE‹œ `<Ñ—Ì xEeâ2¡&ÀÏåp‹‘J×^{­–Š0} ¬·E‹Å÷/¼ðB>¹þúë#çR.Æ6Ç¥]3+#\ˆ€$L™2eæÌ™…|ŸÇ<õÔSc KÆJ>„ÄŸ~úiË–-»víÚ³gOø­±³¢ÏŽÞuk±žôÃ4÷²ëÁlŘ·äûᅦ00þ eTi¡ŸmÚ´)_¾üÛo¿m*MF…—H<_~ùåréL~Q•_|±F,ì¥K—Æ—»wï^ºtéž={ªf¦#à¯Ls—ÉK2yòd® V7jÔ¨\¹rt/‡9.]„{6ò”fý+vnŽKº1ò¨ÞõêÕ;ãŒ3 ™¼Â¬E{¸“u÷Ýwœ+Õ—¶Ôïä“Oö 6{ì±Q5ÒÖ²eK¾3vìØP‚rFþ—þå Œ ¢¶ ñÐñã/ù €pƒ/¾ø¢ð<•+WnÒ¤IJÅ£}ÿüç?gIXÆ$†‚=¨%¿$-]k_²ªãm1ºˆG)«yóæ=òÈ#Ÿ~ú©ô¾L™2gžy&K—×F»ÓÉÔc¹`ó)n»í6+h3›ªpéêÕ«C}µiH6:vìÈŽ0`€²,u쉜x~ÙÞ´iÓèÑ£ßzë-¿ðÍ7ßÀóëÔ©ó³n'¹–ãÒ‘È*ž¥*j²–Z[ Ç¥‹VÖðÁW]uÕ 'œ§¢ÝãˆiP¨bÅŠÍš53 |ŽK§Íãã?þ¸uëÖˆ€¹sç~öÙg ÚË/¿lÆHFÁýõ×_oÞ¼¹J•*]»v–™»œ…?Ç¥‹ªŸMÐ SfÑasSÈ  ñÒ‡uÀa²¸tÉpCúë_ÿ 0:Ì##8É@A™bZKÆóZ>;åɼ.˜OÏÌb줬 E‹`ãK/½ÄàôÑGìµN:9Yú0§94 Ù=öX©R¥†(z}¬\¹ ±téÒÆ­¨u6hРR¥J“'O޵Qªyw8Ì·ß~ËRQó‚ŸOš4É"29xÌqé"lÐ*‹Ú!ë †Þþøã½"©Îqé"oPh}«V­Œ(1‘l^ùðÃO>ùäcŽ9Æ´Õ9.í§Ÿ~ >¼páBsÕ.Y²„ÕþÚk¯YÒë©§žB:ðW›Éƒ>è‚ÿî»ïr9.]´M ýŸyM€'„Aà Z ¶š5kz>\Úàµ0•úӟ؆á:Žrݲ¢µ6"X¯äãéþy-“_ß!È33Ë ±püá©-²ÏÆø«¯™¢ðõ×_g:ÆÇë›o¾9fêgô=þ†s)DsíçÏ=÷\… ô¾æyÑ¡ø¦@Ðl¿“ÖŒ #înšß?þØq»ãŽ;Ž=öØáÇçà1Ç¥‹wŽj. ±d²¾øâ w®U2ùe’áTf©íþùÏÖ(¤?=I|çwöìÙBÐKñ^°sÁP«‚¼wï^ÁGÂLOèÃøñãÍ“©ïhY´ùŸÃ‘ìºë®ãFwÞy§.”áºP{ ì}ÿW~ûïü‚Ì Œ’†ì]üY”ò( ¥gÄi)Ƭ-^¼ØIH›LÞz×\sÍÓO?ÅÜ ÅÍäræt“—>Ì—>…†Y`Šg¬V­ZøìEŽâ\˵CѾùæ_è#µÿþf£bùEmáºCÈš—_~ùÊ+¯lÓ¦Íí·ßÎÛ¥K—wÜqì_˜ó'Ÿ|2tèЦM›Â·7nÜ(KG*q H`ìl-)-¹ï¾ûÌÖîO&MšW?’ æ¸tŽK½vix,Û<¥[¶lyä‘GäÞnß¾}ÆŒlÛ>}ú )+à“=þøÇ?ÂHÙ×§vZÅŠ!`ðL¡€+ð߬38˜*´“¿ÚO¤Ü¼¥ .lذa»víÌéµ+ÚBÖÙá‘gÏž²ß¶m[Uøt¹ç¢q#ŠÒJB‚TW'üµÄŒ!iIˆÔñÈo pš×—a~ Hµ¹˜:>çk äl~öÙgq‚˜çzä¸tŽKçÚ?Zí}ôQc•n_}õU,T$‹óg‰+ Ê×þg^ZA]¹ù´K—.-ß`_xá…Ë–-·Óµ]p‘k½´ÿå_þ…zæˆ4÷F½s\:Ç¥s\ú—pKç‹-ï©/Fͳð– Èv†&õêÕë„N¨[·n£F7nlñͰ°Ê°»šÀG† hDz"ï¤ÂO&“ØŠ¹ã®]»Æ?kÖ,;Ưè@Ž'½Bàšßÿ=O„:o‡Zƒ˜Þþå/¡<š$Yß6>ç;Èô Q"m³ˆ­äS?ÆPÆ—'Ì]ä¼`* F&Ž×/¸à‚ð¸ãÙdf35È›:‡™9.ãÒ¹V‚›'ªüñI'tì±ÇΘ1ãá‡{5+TD‚x˜®d³ˆ{ÜÉß%K–Ô¬Y³B… óæÍQ³²¯ó6²¸D!ÈÌßúxÐvìØøëÑ£ÇïÿûgžyfÛ¶m¹‰Ëqé—þåýgkCù6lØpíµ×šÈ¦‰•¹yóftaþµvíZd ‚ÿ²=´b‡~÷Ýwˆ-¸“Év‚?gò\8tÊÊäE {÷îå¿ZÂ!ÏÁÇ`°Ðï/¿ü2ܽXE*òEøÈa"èÔ©½mÛ¶­Éÿ¿þúkþÒIÙx|Ê¢$:rìï‚A¤#bÚø&ßšbñèZÒû̶råÊÚµkW­Zí#-¶ùñÇoÁqcÕYQéI¯™Ó¨‘k9.ãÒ¹VòòKá…̲ê}:uÊ”)sÇwÖªB΢á„XÕ³gÏN׿ôß²eË0àüøã"¥àÛ~ýúé1ÂßéÓ§³eŠ1f3×r\ºpéðRÐhÌ_Ô^زUiàQ†éÅFƒRò¶víÚÌòˆ#x}íµ×¢ä6hЀ×ЭLžãü™·\ªnݺ¼€6»ßçÍ›wòÉ'·nÝzèС\¤\^Ó”½Ï5S´©!R€âI«T©RºtiütÊxðàÛÚ¥ N(|›ï¤§ŸLjLàqè…¤E=ÂÏòý÷ßøá‡;vì`Ñ}7nÌ_ƒCÙòèGˆ ==ø¼cÇŽ ט1c.ºè">Ñ+>K¹ÈafŽKç¸t®•à&Êýû¿ÿûܹsÁÉãŽ;®Ú¶m[˜’2yG´˜\€ýüóÏ5;›ÊƬ ´ûî»/Ü9B¢U¯^zl¦L™ñ^¿~ý×_²aôí·ßÒ'žx‚‹N®Í<—_:Ç¥s\ú—´~ø½–I’µ¢ö™Dý4¨çÙ„fr`kרQ¬øä“OøÚÖ­[c¶oßnþ4'Ø¢†ÎN;í4èëêÕ«ÿíßþíŠ+®€Nó¯È0 l6 …ûåÍR<‚st÷Ýw7iÒ¤ÿþ™¤yþùçµÃG¬ëìÚµ &™kÐg`jôèÑË–-ûꫯ"!Y´©Hi3¦Ò -¦#Ó.mlxØURBÂ7ùBÛ¶mo¸á† ´lÙòƒ>(hb¹–ãÒ9.k%²!­¾ÿþ{ U¸t¹rå5j´fÍx¯î™¼ÃÖ‰©WƒróÛ_|Q+V­Zµµß &€«øÃ ,‡/»ì2^O:õÌ3ÏDN!ŒB†‚íß}÷Ýž={J_|ñ‚.}üñÇç&.Ç¥s\ú—7˜ÞoûÛx ã½ä’KØ­ηß~*e9ïàÌ,d¸L™2o¾ùfåÊ•‡ýÿí½w|UUÖÿÿ¥÷z/‚ˆt*ƒ¨‚X@Aªt ]št)‚¡#E@¤FQÞ[h!BKBÄÁqœyÆgžyÊý½_÷ób¿Îï† %¹çFöúã¾Î=÷ÜsÖÙå³>{íµ×8Ðä@ã2~â`Μ9 E¦/ñ›6mÊ× ðõÙgŸÍ‘#‡®7Qæé@(tíÚ5!ðwóp>”€`ÜŸ§(ž™äeÛ´i£Gk‘ àóöÛowèÐAÅÂe `‰ï½÷Ä[ ‡††ò.ÎM`a¡”$?ñ²«W¯6e¢ÅŒ©®aûL2ú8@|Æ@wõêÕååhÙ²å=ï–8ÆŠåÒ–K[ùãÑiË’;wnMÔòY­Z5L†OO¼ÏM”7O^ y6øä¶&ibÆ^sܤI“W_}uóæÍ 6ܵk—v”Kê)Zú$ûk•[±\ÚréGñd…"Ðûâ¥ÎÅW(1g誌¦u _Ó¤I™Ä"ÿðÃf 'Î3 §×‹KgÈŠU¦LÌ_¿ÿþ{x,cábÅŠ™”ŒÜ¡ßº­@ƒcm”³•bÉÎEiœr³O)CužxàÀ×^{MègjSXEd€þüeêÔ©™2ez÷ÝwÄÆÆrÀë3ÊЪÌÄ¢Q¤œv¢ÑæeÎ T×q4 ¨P¡ïÞ»woè4MBÅbƒ¥-—vWxGú#ýŽÎ®døv@g%åDåÆÏ=÷œ¬á /¼  ARÛûí·ßć“w2I:uråÊ•?þºu늓›D[|*½’Ç Ò¼ys,¯¶² æ'»6ÜriË¥(íñ&s6\:K–,×®]÷ûüóÏ¡—[·nÕÅ!!!\0pà@Žƒ‚‚”£ÒãIç•ëׯñÅŒygÍšeh°"âââä£mŽŠŠ-ª8GÐüzûöídß“Z‰ïL)‹\X|]´hQ5´þºP¡Bž»!dh W|ë­·t|êÔ)ÀªH‘"ü ;tèÀ_0Ùƒ ’oVä„Ï7Ê;E§LôPJxÍš5j0”Fåʕ۶m{á•JlÊ ï(p®W¯^£F( `§ 0Ls[é“Z–nÅréåҌ֡$.m¬¤œhßÉ'NtîÜ9C† r(a*Uª„)2¾åä] Kó†!+VìÓO?-S¦ÌòåËö”–oŒËÊ•+¡Ü€@Íš5±Ô©¹sçÚœ¥–K[.ý˜¢N$RDʼnLFDDœcX„—¶’ÒbìË¡C‡ÞyçZµjµnÝúÂ… r anŒƒ:¹úË/¿ps,lš4i*V¬ÈýÃÃË)2hРýû÷÷”s±úõëg̘QÖ¹]»vÜÁB´åÒ–K?¦È¾Ð•èb0Øùóçà ̀‚­[·Îœ9sÁ‚[¶l1™á=Þmž†>cÆŒ}ûö}ûí·Š•õxg»øìÙ³çæÍ›CCCÅaÅñññG=zôÔ©SÛ¶m ±Ô:â‹/ò5¥¹´ó¥àÆÃ† SʾìÙ³_¹r…ÑŸÑÑќɗ/ƒˆ¤¸ôìÙ³ ( JïÔ©“íöx÷½ÒüòСC»víúá‡jÙ5%̨„¿«ˆ ÜŒ&(“È·;Õ¡ 4ÞËÞH[ÜZÀ´\ÚÏB_ÓP×m‡VRÔ’:M̵k×@E3¹)º{ûömÍ’$#w•Ç›ƒ7Þxã½÷ÞS¿ÆÂ&Å¥‘ÈÈȆ æÏŸŸëmfiË¥-—NÑ>wZXGÝ™½G}öìÓ.„Ú²ÄãH|õêUÁÂ7Ô££¢¢ Š&Œ›Ë„q;^µjUù¨ P¨P¡~ýú™G¤tŒ‡Xë®]» îpfM›( FôªMçN¯>1•+W6KÁ"EƒCÅ›6mZºti× sΙ3gÙ²eź¹BQO“&ÍÈ‘#&¥J•2‹1SW°tRŸ3ÊÑmÑÒriÿKæÌ™ .ì4L&µ£+É.>¬all¬6 ð (RúPÌ„’OúýäH²‰¦K*ƃG£Ã±cÇæÍ›—xë1+–K[.ý¢bôz¨/]ì_^ñÜMòlVÿb,–kh’!ÕtÉ3gΘë9yîÜ97 ˜3ÿg”âb¬Íòø•sæ—ó¤ØÚCtH¼öPÔ4Z9‡y¨Â˜=I¯=TŠûZµjAÅ[µj¥»Á½Õ hüK—.å [·n×®]£”üS—Õ¬YSeKÉW©R¥Q£FRF噺¶JTvS“4B`\¢ã +–K? 0.^¼¸åÒVüæ•ÂPþÕ+‰©²ì¬,¬’Ý%×sµÁ® ”ëÛÇž:×j¢ÐÙýµÅ­­AË¥-—~.í¹;9e¶äP ò©à.ÞHÅÆO{ùòeEzð“Ò2›^¬M”<^7µà…ѱitØÉ^¡¸V¬X¡_õ“HuŠæÄûÅ+0[”çe5<dP#Î+o[‹-POLþž9ñž{î¹fÍšEEEi·GÝ|ß¾}Ú]_¡Ù"Éïæ5œ Zëæ‘‘‘¦â¨¹›#èFA)àÚ¡]k%åD!m"Ò´7YX®ix|r¬Ä2ɈÀ²ÂêË<ÔE“¤râ“Ê¿PO{š[µåÒ–K[y|¹í"""7nܤIx¯Çë?sæÌòåËûôéS¯^=íç8|øð£G*PäÏþsš4i8Y¤H‘´iÓ¶jÕꫯ¾ ß¾}û AƒªT©’%K¥¿SË•+W^{í5˜v¥J•2dÈ1cÆŽ;J¸wR—¶b¹t`Š:¦çn¶sË¢­X±b¹´åÒVRH´(Ia S¦L™>}ºIýÓO?EFFîÛ·ï믿þüóÏçÍ›U6«°/]º´xñâ¥K—8p`Íš5'Nœ0óÈÑÑÑ[·n]°`¼šcã›ýÿøo¾ù¦ÿþÓ¦M+\¸pûöíeå9¹gÏ[V,—¶\ÚŠ+–K[.m%‰sUÈÆÕ«WoÞ¼yŸë<Û†ÙÎX_O:Õ£GfÍšA°ùÚ½{÷Š+¨uÏ‹/ZsoÅriË¥­X±b¹´åÒ¶m¤.Iœ}âw¯ÿí·ß~ýõׄ„“ÕDkZ5 ¿víÚ¿XÑñªU«Š/®ÝK”(1räÈèèh7^:<<<&&ÆZ|+–K[.mÅŠË¥-—¶’ŠäŸÿü§–‡8›®±¼Z­%$ûÛßDžµnšO®‡ÿôÓOÎT'ü¤µ„†¨˜=׸ìðáÃ3fÌèÕ«×üùóµÂÑ,ê´¹Z±\Úri+V¬X.m¹´m©ŽcÈÃLÓÕÞˆÊ(Â1'•ôÃ0mŸú…œ˜EÙÜìãããM#K§­X.m¹´+V,—¶\ÚJ*†ÉÉ ©›U^hiز3arLLŒ²ýýï7ñ!m¥éÖÞ놽h•"ÌÜ$a†9߸qƒ‹i*\¯ÌÒqqqÚ ÖîBeÅriË¥­X±b¹´åÒVR‘ÐbMÊÍ[·n©Í“è’ÌÉ_½âÌÆ¯ý‹ãüÑdùðÜõ3›ý"u Q×1Ðuu.ƒlÛ½$¬X.m¹´+V,—N½\ڹў6Åsù!<ùË_Ä£R#—†Å]ºtéÁ3Q¤PŒjܹsG›«&÷pn†.‚í¢E†xót´¢Ð|vŸ”hã­äÝTëDhê˜1*þ6ˆšà],:Êö&l1jJðQS|äý1¹3Ø5mÚ4³A§'Uí\Ï(Õç­Q>66–ñ/=BóA¢ÍÚ|*и4 ð ô\S§îöÓ üo^qQ‡ßÅ=zMTT”ë;÷QV4Eí–«뺽§˜ñj,}ÇE¬ nĵ´)¤2›-ä¸ÌÅ"Õ>;‘‘‘Îýé¡Õ9w^¦mË/—.]º?¤_šºãá{t^zĵk×âââ´?2­Žƒ«W¯†‡‡§.ýóÏ?£°š(ïò¸”«aÊÊàO Ùõ'vÑ"‹Éƒ~T¨©AÚ§“`(ÔÄ]î 28IBÀi)Få:ë4ñæ¿þÔc¡¢3ÒÒTºŒÚ¡É|þ°FË™>}z*åÒ†>‰ @´pX~ 3ñ5ýÒfïf —L¶Ì@ó!øœQ(Z ážéªœ¤$u@œ¶L|‰{ÎÁˆŠ×-}àT€›´¢Ne´»f„UÑ\ ÕLî–ž“OÍ>;¹ÁCÝÁs×=Kóæ@{ºýÁ¸´fÛ`þøãÐf“·ðy¯ÔÂ¥¿ÿþû+Vˆ¾Rõ ’ëþg d”·iÓ¦S§N MQmnذ!,,,)CãÏB36Å ¥÷í·ßš†™3gNÚ´i —~Nî–hµÝÐéÝM ,*.L.mæ²W®\9vìØ ŒìÝ»÷ÓO?…¯j=ˆ‹V#)Ü1bÄîÝ»¥­Â{ûì… ´úÕs×=ûh¶{Λ7öÌ+‹u¤¢Œh¶äæMKSkñññT. ¯k×®Ï?ÿ|LLL •³œÀ&L`Œ9qâD†Ã€ž‹5)Ü+[¶ì¸qãfò“Â/ÿË+îŽÍ5îX°`ݶsçÎÎØÚÀq Ú~W¬|ºndÖàËÕÌ+h¿«3ÂN.íñ&(È;wæÌ™móIàÒôêNþ[ _wíÚ% ¤ƒ ÔçkjáÒ=zôÈ‘#õò¿^1TÇõÒî-Y²¤L™2ƒ L.d̘q̘1:v}™$Zi1ŽÇ;Ñš>}ú   S³Î ·l±´6lX·nݰ¿htg•žz½Bõ\ä jrÔ R#R¿3fÌ ój$blÊã8‘-Z”)S&x&`NM¹¾bë„Z£d¨¾_ýõòåËÔs_$ (h\Z 3á~Tî7 ÒÔ¬—¦á”¶UQÛõ ŠÄ¸‡zËùóçPA«¸gä?ÇzŒ;Ô­†Žzµk×À¨ C¹lÙ²¡$4­Œ î²h9 ôÉX)È+rn8r—[ ÉŸ??ðòh|ïIˆñ 3 ~i`sæÌy饗žzê©gžy¦M›6«W¯6EZ¸ôàÁƒÓ¥Kç¹›Þͼ‹*8t^qFÇ… 5jTr-õ*÷“O>QWr}™$c3ºvíÚÚµkKxÅà9 ØÝ9YŸ¤‚ýúõkß¾}öw%Ïœ9s©R¥À7å p1†‡î •¤…°t“&M¢ùaûŒ5yd§´déÒ¥Y³fM›6m*åÒP»Ù³gÎ!!!;vŒ±†sK%R€Æ¥Õ/`2ZÔ\­Z54 ÀTòÿwíÚ•Ò1b„æ®Ï_$Æ=Ô4h‚((F­árרiHNq 6 õ^|ñÅÀä9&ê 2„ºþo¯¸‹Ãh³à—Æ&N匫ä­øp½Q#wîÜ[ÙG÷Ç^{hòƒ{»ví‚Hó‚½{÷~öÙg1@5Ú´i“ᢩ…K;ÖŒ¡T4Yg·è1‹â)= ;ÐÊŽ Å¢©£Cxõwç´…[ ßàÉåË—W®\él~¬ë+%ÂF°ºeË–tŸì”¤*7S¦L§N¢5ºë—†þQhà§V-y¼,'L˜€†NÿÌc7.[¶,[¶l†KìÚ¨ÄäRkÖ¬©\¹2€öÌ3ÏÔ®]£ vvLz.+0ã¥M€:ÊgÈ!0 <0˜¼Å‹›Æh¸—+W®©S§ú ¡èà?tÛ|ùòõèÑ#`{]côèÑ  (GÝ™™AU¥ŒšêT'¹€¯.Æ¢ˆ>¡Ftt´±¹`מ„œxråɘò‚Ï=÷FöôéÓúµ}ûö¼lHHˆ*Wku9Æ ×­[—ŸêÕ«ã9r丘ÌóÏ?¥yï½÷ú÷ïÏhôÃ?äÓ-}>ùä“iÓ¦Ñf€ëŽ;6nÜø©§ž*P @ •Ûˆ#zõêÕºuëF^ုœtKŸÉ“'Sn”d̘1 èÔ©Ó믿ž\õ;! yØëPzРA;w~õÕW4h@WªX±bR÷éÛ·/gÆŒ‹¼Â_9ù‘W ÒT¸ç¤I“¦L™Â»SŒ¿8˜3g£@.\8}út^™ëùâøÊIç±óš&MšPt… Â(—(Q¢Y³fè222&&&!!Akc ‰MQñ™*¢ôŽ=ºuëVê·~ýú †æXÑ[¼nݺû”¿q ÆÇÇcÙwìØ±aÆ‹/ÆÅÅ)K—.q~õêÕ±±±\³iÓ&xV­Z¥÷:/õËÍ¿ûî;Šõ*T¨0pàÀL0»Ø20Þ&€*‚k°°Í{…¾r²gÏž ðÅî @žž„ðÊÜíƒ>à¿C‡)B÷øÊI~rêbW„ÒèÓ§O‹-(ºòåËc; .˜Ýá)t|lMÍš5Ë•+W¤H‘‚ .\¸X±b4nH{¾yó¦i«©t‡)“\Bž Ê­iÓ¦ô¦C‡qHÉ“'ϰaÃL–Wõñ'N4oÞ\ B˜#GŽÿ¨’5kÖÜ^AIí}æŠðttÈ›7/å©©ÀZ¸Omò•“né“-[6Ü/sæÌ[¿ô8›”TʈHQf¯ˆ= dðJúôéïY ÷p,gΜÎ3|¥~i–(Ÿ={v†Ò¢¿®§v2fÌ(_¨„;øü¯œ¼Oý¢@RõË™¢E‹–)SÔå­¼§0.@% 9Y½zuÞˆ¯ 0O𢀅bç¼³¦‡ÎÛ¶mCFgÆÜ`µ9ÃëèÍ™ÊéÝiŠe½¢GÕ‚+bmÌ4:KJ?7]’ÔõΖC‰¡6 ôiÉ@·škJëÏãx”ƒ6LÓ¥—%†6=âþõ«‹Á ]ì|Gºwæþ<… tþé§Ÿ¦¦| ä>ýŽŸ¸‹â2'ÑwcG ÍN÷ûÞ½{`š_ßÿ}Þ÷Ã?—vŽ>üé§Ÿ2r™9sæ¬Y³&˜È¹'ÏŸ|eDÀÓ-}‚ƒƒQ`̘1(Ã× & Cã@+7Âè6bĈ`¯pÀWNº¥<´T"-MþRÕcrÕï´$äa¯ ݼyó—_~¹dÉ’Ù³gs%T•’º¯3oÞ¼¯¾úê{¯pÀW¹ ô²”ù'Ÿ|¢ÎÅ wíÚuæÌ™ƒîÞ½;<<œn{àÀˆˆˆ¹sçnÙ²%::ZËù9à+'ÇÎkœÌMI¹ahW¯^Ý´iÓ×_kÖ¬Y¹rå矾xñâ… NBŽ;väÈô1~øá@ã›o¾õ………ñëŽ;¶x…¾šDå÷Œ)R û¿ÿýoàNø—¿ü%!!!**êúõëÚw^3ÝÇÇÇÿWb<´Ê“ã|S`?:cþ«ÑÙr£¡ÉrÌ»7îâÅ‹úiÿþýMš4Á¬Ï˜1C>vX÷/¿üòo¯lß¾}ëÖ­6lÛpýúõ|ýöÛoC]0 ‰FEÓB+ÎÐ`Ž=šÒÏ]Ÿ„$u=¶Œž‹†´d--—.]ºbÅ ºÃ_|Á×µk×ê-è))­ÿ‚ –-[¶nÝ::ÊÐ=y:šPtt7ÔX´hýР«®Zµ*©ûp ½˜?òîºí¤â-øÊËîܹüá˜ä‰zwž»|ùrîÌ9Þ¸qãš$dõêÕ˼Âeü÷WöìÙ³=À„n f‚Ÿ€'ðrîÜ9º¨Å¸Ü9¯pÀWNj¯ @ƒÎ¥µrÚ-ñd• W£'Ò‹•õ>8“î!hŸPí¾Äe®ÇíËXh­Æûÿõbμ%£ò™1jÔ‹“‚ò×sDoò ÑYV¿¿+@®ò·+9°2\Ý'_ ¿ ˆ > ÓôwŽE¥”:U;ž˜cŸkœå©UÕ&œ@Kwœ× ‘{Jâjò;£ìß­;íŸë“|ìž­NÀ¨O¨žS çz^š¤ªØ4`4T¥(}•~áÂÊ j×±cG%s€S™2¤¾Lý Xgüÿ¹$ÆXø¤nKéç>²%¾žCae¶t^¯†§®Ðý”Ö_LLy¨±¤ ><&‹-ì6¯‰Ã¨`ªª>Jâš8[‹V߈å&~¯¤¸¢ÊóÁ‰“Â=ŸêP.P£âÿ÷®ø(öß)Êç#áX#Ÿ×ç)8¤¢œ¥N)Y²dPPà\³fMeŠ›3gN… j׮ݪU+žºRK´0Mm†gø¦óÿ`bjǹ‘‹z:û‹›4*ÚL •[â.šä¢>©Ãþã×ï¿“‡½ò£ ÌÎÎ>Xä#>†ŒÑ]ÙPY(ç+slÖì;9IâŒXÎôq:v^£ÝiÕö´üáž+þ R½¿öa¿‹É‰ËAò€æ8©û˜Â7á¦ÚBÂÙŒ•Ø L¿‡¦ Ï_~ù嫯¾ªÐ”råÊ)[ïåË—;wî ,çÏŸ¿N:ûöíKìÇx™Ò"nÜ“6—V‘­O|!¡¸´º†FIjÕ¦ŸšŸ !yðr0€©>¢1—sg=õ#Ÿ½öœ{kúˆ³ËkòH©ÿ3ÀDUo6é6ˆšx´ÂW'C~@g0ôØYìƒ{²·ì¯ÓçãcJhwîÜ¡uZ*+g<¿v'פZujäÒW¯^Ý¿ÿ¨Q£¦L™½cÇŽ €áï¾û.pí4Ð÷tAóîêMÿ`â¹› Ïgôç¢>F%'ù Àr ([,O©Ö½þ΢K–úM.?óÚ4M“bIÝG0žxŠÿ>{Ûýå/È(·¿Ç‘wT$\ÎIÓ1sl3¢üiÊ‘x{Óœ/pz¼"Gж½–} ¸OýŠÞ;ëWˆ-êbvоϲA Ìef¼`. løÇÆÆ*3s á0:£•* 7lØ0zôèöìÙ““QQQ5jÔÈ™3g¡B…¾úê+OÒ[݉ÆÈÅmEÜÌ(%¯¦«p?¸1“â~¿;½¥Æ£¦+*eƉúIÍŸÓ—´ä¿ß½Ú=ñðþï%êò»´–c¦àMV9ÜSLÉÈñˆ†ð%q8BYÁ¢éYàžz™)F½¯ÊǼˆ“:Á*)¿´€.±'êaqÏ3l~rÑø:)®óeÁQà3>U ðŽÔø€1Ò‹'zR­(ï½ ÿþZ§c¶¦Ò¶ê2Ù¦êl6ÿ`bȃÑß]=E±h9ÒÇÉ‚­Ü ‡‘5üº¥mÌÀ =N±dšM–úýgò°×£ˆ¤Ñ¥ÓŸ|Ÿ˜‰ B“_Hð% 5>yµÝÜø™MÔ>ššÔç±ó¸6œáaýÀ÷Ÿ;6á%Æÿ.g 3(ªÈC¹šÜøwó$¥•¬¼% ¢ª¤ž‰ñÐVÂúÚ¤I“4iÒôîÝ›±€Ç‘Æ\Ó>®0uQ/ô².æñÐæ}ÒPÎ@™æ”~nRsë÷µ@pFÛá™”>Ó^¿{ŸäŸx-U(-DÈxCù¤î#ú§ø1^ê>%#nc¼êtf‚ìwg‹|Z` Ù597(=Í)=Í,€s6_ v®nÊêÁ#=ãž©M‘üɧ¶¡7U¡=l{NÜbÍÚ:¶‡0ïîú~&Jd@[\ºS§N}ôÑ;ï¼Ó­[·Í›7 “ù­‹¡õZ¬5‚°7n\¿~F•)+":J£Ïµk×âââh0hh妶M¹ÅyE¹¹\ŒE1 §){C›“«~“‹CÞÓ›tŸrƒ+jɘRu)ö@™– ^ùL%Žßð$±%–ó¤O8ñ=#:Äá —÷þkg’3%-à5SÉ¿ë'T‰KG…°œÑ5ßý®>²A>¶It"ðç ¾š.W]Ÿ;w.cÆŒY²dÙ´iÓÕ«WÕdqhù°kšJX7 ´¬æ´(ÞÅ9G€i sô>ßg‰ß~œ¬OãAgwâ1Ô}DùÛ5ØW¼F4z;í®˜`Å( JnŠÏ?¯Ñú=Ãc\¦rOœ4A÷©èûÏKªó&þûÃâždNþî}RZœ•+`4GCTlœšœfE1ÜIO¢%Q¼8)õú¥i ¼Zhhè°aÃ5jdòÛ5kÖlìØ±?üðƒY ¤êþÅ+Ók¨ ñœÌª?~ü¸qǹ¸RkbH 4ôŠR¼æŒ‹ÖP)C‘RŘï“'Oº[¹²#2v |||¼™óxw£oúgâ5)ÌQÓÂôÄÄÄ8›™“þùꊒk ÇtæìÙ³tˆèšŠ=Þ…(O k”ç ­ÔWí¦¤m•ÜÝY)@$,,löìÙÏ?ÿ¼3‘”2¤M:U5¥µrò[^¹rE@Ç*‘Ÿ´¤Å1 Ï™îOQ(GFFBáÁùF;Y‚OÒe4ä®Ev†r ý,`˜Ì±¬0mÀÅý^¥! ŒÞŠ2 î.]º„ª”§BJ4ƒ/凨*³­ *)xôCMlQ’ô…yGEE‰ÃÐÅZù•·03ò)-X1že3šÐgѳI –ŠvÚSbžvW—Eà)”’J•®JåbP´(…I#T…*d17&ó³8½ëúzá…Ç+±Ué3祋£I€ãnŽ)*QÅgø¬ØHµ åÅrq+¡±hòèX»Áj{AcS\ÄFϽ–³¹.j†õ™¤g Lí§ãnqiA £•b¦ù™J7óÝ~›ÀßT ôõP}UcÓöÄÆ:›­=”ÖXÑÅþ©YÏݽ¢@æ‹/ “µÐ^9©4†BáTº&åñE1Š” e‚ýUb4cÈÔ2ÊØ;§Ç#VÄÓêîxŸ= pÎb»»ß™ ™BktFñZÒ¨VãË!tŽV\u|KQf°$ó÷ƒ]£›PP> ‰(·¼Ïh%)o’öùu²&ãÙ0ôõœ ; $»cš¢ œ.SÓUMYiðΕ(àô£rgRilF2öµs';Û¼BôM8oÏž==½ÂV¹ø èJžŒþ4‰I“&½õÖ[#GŽ W¡»åÌøÎkÑäD!V¯^½fÍ…±9y¾»¹Ýäe]²dÉÂ… 5Ïî"‡³r¦Þõx…ѧOŸ>vìX?O:$Å¥Å[fΜ¹jÕ*›ÓºmÞ¼YG®X±Âo{…Pq¦W3{öì¥K—:5»wïÞN:Mžiø V0:Мëì >3ƒ\¬ä´*[¥frÑe”:’ŠJ2ÍÀ]¡/Ç{Åãöâ 8¡?Òø©Sޱ.\0DZ¡Œî—PWAÅ|*PÍóÿŸ@¿J „À«›¨ã¨  Û7dM@E® 3Ãy,~›¹¦XxºÖá:»3 OŒVhÈWõm&nº?°EjrvùPDïNÀ9þ¼Ž/]ºÄ ^û¡ÇÆÆf®Q?‹¢y)4ê—ÆvõêUçz³F^µ¹qãÆÂ… gò |uWy$½Õ,‘Û¾}ûðáà (P¼xñ|ùòÕ«WïÀ®GèiÑeh|§;vì([¶,4†.ƒzNÜvqNVݹråÊf—(ê×øjÜÂjÍ"éÌÙ³g!~éÓ§§~µ‘ßàÁƒÕ2ýëì>\3WµjÕæÍ›ƒÏÚ6Ù´iSPPP¡B…´¿FÿþýýSnN× Ýì¥ÜžyæJÌx!ø\¾|yݺuË”)Ó¢E ”ìÖ­›ÊPã)?XMVjþk̘1%J”˜6mšÇá_ÕŒØÇœ.]:†*O 8k:Õ™Øßsw>Ë9ØÜ½{7ýâå—_¦¸‰ šµ-n)oê…T¾ýöÛ5kÖìСÃÁƒOœ8áôÑÑDµ/¶»Â8ýÍ7ß=z´»åö³W¨q:ˆ|€””®Ú¦Mìâ-Zœëbq™}IâââÖ¬Yóâ‹/j“ÄeË–iw!-ªõ›·Má4{-ç ÃÉúõë÷èÑCß>Ü»wï† V«VÎBSÔì¶Ì´ 5æÅR 2dΜ9"êãûöí£†Ú2>""âò利j‘lòR‰™åHª5˜ ÅÒ¶mÛòåËk’›Ê022²K—.­[·Þ¶m›òAY"m0ùAÖ2Ñê,Ún^»ˆšymWüÊ`cJï¿ÿ~¶lÙè;óæÍã z»nSÌ Rü„®AGVþXÅ 9çGÜåÒ/½ôô‹Ü²eK%wQ3Äò€'³gÏfG_»v-€S´hQêÝã]ë—O‚ƒƒix ß0"` bk·_¨à† J–,Éðúê·Ò“—”c€‰íÐàH¶‚=yòd–,Y4a§L™¢¾¬”kI9SÈoIU&(ƒ3fÌ0LÐ5”æ\ód"³²š(”HsÐNÚI¿X¼x1ý”qå믿Žu«T©Rß¾}Õ)Üõ¯¢'ØË@àƒ>(P ÀsÏ=nܸq§Nzöì‰á`œ.§L¹»EMÐV¿=ç[}Ljhh(…€¼òÊ+Ù³gô–,YbŒ…ϼ¼?$ÁxÑC;wî\µjUªuÖ¬YtágŸ}–A1dLÓÜ~Ëœ#— E«?Ö¯__»vmåø¥ˆ'=zfTî5oÞ¼I“&5Ú¹s§þNsõCyR,ø•+W22Âj`m÷cĈ¨W¥J•áÇèsåÊ•&MšÓ§OÓ$¤¿öILÞ) ÅÆ˜ÙLØ2|Õ½{wa/ê׊2E8󨻥K—:×Ý<±bÈ€c_¡žf)ŸSÎt™ôéÓ:T—qÀWNº¥¿OžŸcÇŽÑkhœÆ©haw£Ò7à]t‘™E'—öÛʯÄBU–.]zêÔ©ú bÃKkÅ_A T~€-ZðU¡ ~˜cJŠKCó(:4I›6­$˜,U?ýôSu"è4-³B… ~+=åR¦ ~øá©2›ÖEårF}NÛµkW¾vèÐA¨è·¥·eË–^½zAP€BsÎ`2\zá… üØ—Áƒ?­Åƒ¦@¨)CÑ• ‰ ã_ðdذaz¼üòË”d—.]„-.Î+ ôÖ­[‡>h¨½ccci‡Œˆ/\¸ÍVž(WÒe8c˜ $ªB)[¹½¤†ÔQ¿ CNwùéÓ§ÓyÍãT•XâÊ@‰rcLçñ•)˜BÚ‹òàû1=¦ÈoƳæÌ™Ã˜¨`Á‚K=4<¡+Q˜¨÷ÕW_QãQQQcÇŽå+#; |Ò§¤œ|þùç-[¶4ëˆÕÓQ’’„lÞ¼™B£ŠÇôQéW®\ÑÕ:µdwt8·KHH |† BGÐä¯s0Š7®V­ZÊŸ¼jÕ*úúa½R ‹Éa¥ÄÚ Ý¤qð¶PVôè¼yó:ïÀWNº¥¿’ü˜ÆpñâÅ/¿üÒIÿ°Â¹sç„Z–×”&÷þûï׫Wi¥J•hêÂC•¹‹)èøÌœ9sÖ¬Y!!!‡¦»kàŒ£FµhÑ"”,Z´(ŠéÙ¹s§öYv‹K3Š?zô¨”Ñ6OTtÉ’%˜†Ïˆ´‰²ð‡8Ë7¸mÛ6©g@8,, "m ñ Aƒø•Æ©¯111þ±)@Ð¥K—à ýû÷Ïœ9s¿~ý”ÛOl1eH¡ñÔK\ñ äÒ·nÝ¢Eª©i,X<ÏÔo±bÅ2dÈ`ì úEõêÕ…$.†(eåÊ•høÖ[o©±Á ÔaŒJpôø›Y?¾™;]º¥çéÓ§Õþ,Xq…\¹[éŠêÑ1#¦jÕª¡xèÑGZµj%kâq;é“AiÈ*tºD‰eÊ”AÕ ˜Õ 4HàôóÃú ÓÔ ^³f ¨»bÅ y ±ÒP“5œä€ÎÂÀÓ•-œÖ­[‡©…K;ó™)ì¬Y³b‘·mÛvîÜ9S€)±á”Æ ‰û –¡¥™£á W¶lÙ2kÖ,ŠŽ1²YÞnåÁ%wîÜ£û]ìÅÆ¬DFF^¸p¢fO5nÜX~6h],¶Ðè5pT8 š‹µ:GsÚ­ÃEx¨)NŽaÑòchÜ-7SwtäM›6.\ÅÀjU1‚eÁd»XÅòª¡ÉÓO?­f Dc‘óäÉc*h 0Ê¿ä‡1¦çîŽ3™y4 ¨u™¬Î—‰'òSûöí;fÌŸ’·hPÍ‹¡Å%ç3Z­Zµ #øÂ /ðÜÆ:Ó—µ ÉYæO¦(G¶•ÏJ•*Á²|€šñf ¨ª¼Lvm9üøãEõaÎMý,ñññ4{p S6]y<®æ?ѯâ{gÎœÑ }Ú´i¸Ñ£Gs –scçâú¡š0~æ™gJ—.]¬X1F%æØ±céÅfF˜wñØNY¬ïܹƒbf}.Å5oÞ< ®). šs" a’&Me–öO¥ÇÆÆRÅ*=r3xkHrŸ>}Dú=Ú¾ŠÉ¯œÎR*T9ˆ œ4i’–CÚ釒L™2Áœµ#m•æç®_Ú㈒U¤_QŒáRÉ’%‡ ¢¾LEûm‰nRþÚÛÔ©SÓ¦M a8p =E3w5jÔÐf(ÚÏݤ¦èC/[¶Ìã„*[¶l•*U”¦ÌEšŠYш‰šíÛ·¯Ü§œÇö16 §L™ânáŠQ¹:¦ÉÕªU‹ÂûÌ”lЕÊeÔþŸþô'3JõÏZN¹8`ôaøÓ#""vìØAOÉ•+à¼ÿ~4w‹KS’ZÕ%·9Ç×矞+Uª”ÜGZán΄T''N¤ËLŸ>]n@¾‚á#FŒpQ%gËǬtíÚµ^½zùóç6l˜F¦4B`ÇÅÅΞ»i6µþ `„eåÌ™Óld¥Ú˜M“Ý ¨¸~ýz}¥›Ð•\¤÷Šç§cP(ì°C‰‰éaqFuþôÓOÝí†K#bª@%äβpáBÙ¹s'åÙ®];¿åÇ Í›ð?PZIE´M¼²µoßžþÛ½{w—©e­mAü@oLJ7ô ÖŠ{cò‚‚‚¨\4€+•¸­½™®_¿Žt=Å®+¢Í´œêæÍ› `ÔæñÎÍQ2Û·o/\¸0•«ü®kKkDÕ?üîÀ¨0ãtšœs£ÔöO¾…†ò8:B\\Ü¡C‡Ö­[‡b²Æ•ò'À!ün•˜ðM½è“Vfž]YcdNú-k}b¡uQ|jÙµŠ«Õ¯ˆbù‡K+I‚JOÞž‹&€°a°mÛ¶Íœ9³ ’™;w.(ižx¸ìü´|£KçyJ/GŽo¼ñ†qz¸Å¥=^·9僱¸rå =·ZµjåË—g Ä€W˜%=HàcòƒËÊ•+)½† *‘Q:u4â¢J"ÌÂzkãÆ±¿ß}÷1²ôheüs1wŸÐ[+†hx*TÃa\ 󠧸¾³ÛÔ©S©PÊ>ûùçŸs̨ÄÅ<¥tPºK*‘Bkݺ5Z)]<yøðáyóæufrsE4½¥$Br mÿþý|mÙ²%¸MÛ“}1úGjPaІ})Â\†^C·åkîܹM”v„Î"¯Â­ýSz e”_ºK—.ÒPáêgϞ͗/_“&MhôqµŒŽ®|÷C¸i²†r€ æÊ•kÉ’%TÙ7^ýuJrìØ±ÚòÆÅµÌò“ÓO›7ož5kÖnݺíÛ·/1’þY'".M+¢…S€4³½{÷:ô£>8p`†  ©lœ¼m®ˆÙJ•Ï .”+WŽ Á=%E)Q¢„º-¯à·F’(‰K#W¯^…ZS•mÚ´É’%‹ÒÐÉ@ûs/5$žˆnÔ/Š)–7**jõêÕµ:Ë_|ñ…P3fÌ@m³ÂÝ>"¨)µL™(¦Hñ< 6CNØu©R¥vïÞ ßðŠ[\šçÒ(.Q,…—_¾|™&Ö¢E 8ÿ˜1c„06ÆãaÇ¡;vpòäÉzÓ 幘%ƒê£¥™K-?õÔShÕ«W¯Ñ£G÷éÓê5a³BIè¤få£IÎçå•W4ZwÚ±%ß|óM ÞË‚êÓS\äÒš%4466výúõè†bÀ5€b†GŽ „´‡5kÖÄê©*µzý­·Þ‹¨è*Uªd̘ñ…^8|ø°”Q’"4ˆ2 4€Ïh‚†V§ÈUdܸqóçÏŸ5kÖœ9s¶lÙ#Sî·z±)´… RJ(#’£Ÿ`ÑïÒ°ìÙ³ÃvóIO`,¿rW-ZTÝ+={ö0`‚æÖ­[õ«»q¿Tî¶mÛ Á–.]ªÚŽ;œ+ÁSí·~fú†™ŠZä˜Æ_¶lÙÒ¥KÓM\ÜÇÍÙ¤Ñî ,3D‚BlèÅ#FŒÐ‚ú@h~h˸B… ƒ bT2sæÌN:½óÎ;˜]JU} 7Xäz/3*ÊŠbƒFF"²¶ï½÷^ùòå{÷îݪU«’%KBº/ú퇜´4øëׯó,:â¦M›ŠD¡³–FÒ!Õ Þĉ)U·¸ôÉ“'¡¨„!fèaÆ´™W= [Ê.È0ÊÝ1]j”ðððQ£F1lþùç©níäâ ØPS*š¡\5”³ÑìÜãúôÓOiº.Nw**22’&gˆ= aÕªU ¹BøÌ˜Ú]æEd(4ð‡rs76FÓm¦&¨·`ÁŒ Äïý÷ßgФ®ŠQlüøñôŸóÐH ýñÇ«­úÇÿÜÑ)œË€e44_׬YÓ­[·‚ØÓ¦M›–ªÅlÝ¢¥Cî*#²§„ÊÅÊPæ,·çÕ‰\£§Éÿ¯y1ޱ&h« «Öiw?·”T^}Ä9×àbÞH3ãæœz“>Š£>kY´»¡¡4¿3gÎ`òŒ¶êFsÿoý@tåNž<©"Òd+UlCAòá×®]3î}Z‚ædU8ЍD³gÏš þÚ ùæTé HÕ¯ùT–-í|ú¤!ðÅ‹ykØ´y «Gù(Ö]™XC“.À-¡™Ôú'NœP]sRk¯äFðg …ÃÓXá䥊 MŒ9þï¹J4aÌ+Êœ>}µ1"R^&ØãÈüà è©Hi(.•°¿ê°ê­RØýTO÷ñÿ|ùå—Ê(FÅRŒŒÍÑ=¥ÆéÏdì*½Ë—/'ÞÈF³6ÚÀŵ‡å·Qñ –å™TrNªUËÕ!UZªƒñÌXI÷ÉoÆS.ŠY'¥M ;0|êÔ.úÙPŒ^¬bÔxŠå¢M1)(Vá8GÁ& Þ]ÿ¤“y*Æ[lAЧieÅïùa¯ÖΩDÓÆ¨Vyf4Ùªü Ϊ—7]ÆبÜ;>Ž5Μ:uJìÎBC7Þ‹·Póx×›¦®lá÷œ<¢®]ß•[µcz1*QqêT.5(¶ ¶êmƒ*¥4#|Õ"M4áõ  ë\Œ]4iF4`ŒóŠjÔ¸Àõ`ijíž:8{¥ß<çÎU‡F”žÈ'Bzîn}"ÄV^}ÿ 0ÅùõtŸ"BãBW+u‹Kk­™¶£çB¡{¢QŦÐPýÃcÅŠ+ÜX@aÌ}á>i²0æã!Iöø1ÍhÊà‘㜕´Ö?ÀœÄŠ+<ў†ìi’Èà$4ÆÐªdtÁÖ´½“'˼ž²ý뮤ÐÖð‰ïùdæÆ´bÅŠ»;©Ÿ{jµˆaÔŠçIÞ§Ú»+<§Æ}ž/fžÅ…¥c<ÎÀÜæÏ´bÅJJ²sƒx³QéO^Q¢ÔäÍ«óË/¿p7E;sgmjüÈÞcE{*v>þÊ•+—/_NöŒ:Î1obˆˆˆ#GŽ<š·Á9q©¯_¿„:gEyÇdôK –÷îÝ{ðàA“Њ+VRHŒ+àܹsƒ.[¶l:¯ü¿$¤N:“&MR^ @2Ù7jÁ44mÚ´S§NŠÃF< Bï'NœØªU«Õ«WëLò&š3Ã6††gµiÓÆ¶(+V¬$£„……Íš5kèСïgŸ}6}úôáÇ7nĈ}ûöíÒ¥K¿~ýBBBΜ9“Œ°›»ÅÆÆ~ýõ×|ðA‹-ÓBþ †C¤ÇŒS¿~ý³gÏÆÄÄ8ý6Ú6%Ë ¢Þ¸qãÖ­[›@în+fÅŠ•?°DGG j._¾œ\ÏÖ„ºP\Ð~È!%J”àA{ŸþóŸÊË­{®[·"Í}Ž9áãˆvÆ<¾ÄÅÅñ Ì™3ËiÿÓO?97EµbÅŠ?ÈÏ?ÿ  ¨ÃÃõ›ó111& ú¯^ùÇ?þñ«W|PQÀ¨LM|ÂÕeÆ£Ë=ÍÔ¤2ÒË/ñÃ?lÛ¶ÍãX4y“<ŽÔÖè&ÿŸaÈ> üÛo¿q«Áƒ£üèÑ£±G>(ÜG £@||<4Û¤"1.'ñæb3dpÎW:AvS'+V¬$»8·v|–-[–3gNíž‘uœLìÝUL ©.‚>E©9÷iòùøhËu|ûöm!$Àû?ÿó?‚kãâ0šp™r%ñ+–âž>4O“&Íüùó=w—™ƒçRÃ@®v+ã阞h2£‚±/^äÓlòþ?IˆÏCÍk>àõV¬X±’,¢ââÒ—.]ÍÌÚ:eÏó¹ÞÄŠè'Љ`P’rY83uhAºÇ»ýñùóçW Ÿ aF­¾1϶;—®pføðáY³f7nÜ… €_‘aþkóúõëíuoªªœ×†5X7:tȼž¥M]ehdJBCCcccm˱bÅŠ[\ZëÇ¡qIÀS˜Ì›6mÒI°4ãÊH¯øj0@zŸ;wnûöíp]YþrõêU)êò¸S§Nݸqƒ!*?%$$˜w}æÌ™IpÉ™ü¤:qâÄ´iÓš5k–+W.°±téÒÏ>ûìÂ… Íe€v»ví/^Ü¡C‡*UªäÈ‘ƒ+kԨѭ[·5kÖø2|XŽŽ³gÏÖ®]»nݺðpPÃÁß;wî¼k×.þX @|ùòµoß~çοyE79}ú4¿¢jºté¸&K–,!!!/½ôRÞ¼yÇþÀuTTÔ7ß|S½zuî IÒâÅ‹oݺÕ8.zôèQ©R¥æÍ› ùõšŸ|òIË–--Zäôoø,ÏÄ‚;v¬I“&:u²-ÇŠ+nqi0säÈ‘€-($Mš4ƒ†‘*ïÜåË—+W®gÎ0™ ÀmÐ`rÆ å8zôhùòåF…ù‰3f…²šmp•œÔ _½zµîõ…÷ïßß„ò¤H‘"ðv%&…ʪðg™P©páÂPë¢E‹NŸ>ýïÿ;X²d L^,ºuëÖ˜E!ü‡W£'¡ÄÚž»bW«VkŒ¶¨ Çv¦¥B¸4¬Zµªm3V¬Xq‹K?õÔSåÊ•ãð6þü Ð"—±cÇ Ã¯]»&Í“'2eÊÄ' ùé§Ÿ´)!ǧ ¾M™2Ð áꘀ>}úè¿lúôé9où¬U«Öþýûe)¸ÏÆ9© P£`Á‚âÌ2dàòB>|XÞ9dtÀ•Û·o¿rå ·š6mšN?~­8ùý÷ßk°pàÀûpã[·nñR+VÔ[ ¶&-—¶bÅŠŸÈrM؃ǻ‚Ïã Ã`Èq}çw}ºqãÆÂäåË—£9ÏmÞ¼9Ï}å•Wà½gΜ‰‹‹{þù祰À–×äW¾ÂùQ5&&¦k×®|}ÿý÷Ož<™  T>A‰°n^CfÛŒ+VÜâҜϗ/Ì966–ñ>´³uëÖœ¬R¥ŠñôêÖ­;lØ0®‰ç€5kÖl×®] ›’Z†É™>ø@”¼sçÎÔ©Såâèß¿?Ðzþüù+VÀ“³dÉ2{ölH,—-Z´¨L™2ÅŠS&%¨5ÿÏœ93`Ž& ¶höŸþô§K—.AwQ»GPô^½zAžù#Ø«W¨P¡‚¶/l׮ǀ³v7HŠcAP’[© äý°\ÚŠ+þ—¬Y³æÊ•K“kNÀ9wî\·nÝ:uêЙ“‡Tê+tT ýá‡:aœrÇ/G4ø©€g­ÝÌùKºtétñäÉ“u“ˆˆ‘y°´_¿~œy饗ã1}út¾–-[4òsþÀúãš5k89jÔ¨%J´hÑÚo4ðáí\óí·ß?3$\³Š 4Îó+òGÖ~¸‰ JkÆK—.mÛŒ+VÜâÒ3fdì>›X;è´–cbb„o ,0ÿâÀÏlٲ͟?ŸÛþüóÏN.ýË/¿À™§ž»“’2dÀ4lذÁÜ*ÎC† ‘[~Î׈{¼ñ'üQœ|áÂ…|-P €V =ôF%_†„O˜0A¯ðÖ[o½ñÆtìØÑÌ–Þ‡s%°ï,Ë¥­X±âO¼˜ð^h$RĦ ¤3äׯUºò¯ýëÖ­[_Ú°MqÑcÇŽ9ï|þüù9r@k•¤:66V$9>>ž;‡††ò¯Ü¹sëâÙ³g E£¢¢žbãò´(ÖºU«VÊ}{×’]&¯xHH¶ ]»v¼HÏž=Ùª9†9cAV¬XaNž={£€ÚiӦ͜9ó˜1cô\.ÖväŠᤠD…À1¿øâ‹¶åX±bÅ-. ,  DD÷îÝûÞ{ïM\R´œJŸ9sÆs7u†¨oÁ‚?þøc±Y.þ·W<ÞÜÁÁÁ<ܶ˜ –ƒƒ®ÂÀ×_“}ûö+îÞ½;¤ýÔ©Sqqqhxr7ОûðÇñãÇoܸñ™gž)UªÔþýûËúÄÜ@¤k½…NöêÕ‹›+VŒÏ2eÊ`¤Û}¸1dÊ”©zõêâö*.Ë¥­X±âOQ%(%ŒôêÕ«Jêñ.¾ƒ²Â{oß¾½råJÀЄºÉÇ›>}zå,—FÄBù;ˆ*Úœ5kÖŠ+ž;wÎãu_ë‰rü®]»ä/\¸°,¼yóJ–,‰NÝfÍšÅm¹ƒVŽX÷•+W´LRt•xÐĉÃÃÃò¡à]ž+Ä|†ís3\º^½z&ü›w1ä\kÞAḟáä ü–_ºZµj¶åX±bÅ-.@’ûôé2?ýôÓE‹5P¦4Gaaac§OŸ6I–V¯^7oÞÞ½{ë+çÿ.=jÔ¨âÅ‹—-[V©Š&Mš&÷èÑÃùÜAƒqràÀoæ¥råÊñ ëׯû$,ÕªH» „ÆpäÏŸ¿Y³fóçχýæÊ• dŸy_“5!!A @„ØÜV~˜ûpãüQ†z®’ìY.mÅŠŠàEÑwo¡l¥räñJ«V­ÀÕÅ‹+Ø8Þ+\ fr¼Ú'ñE©R¥ ·òW›ôzšUäæ<:­“£G.R¤È»ï¾Ë ùf ~öÙgŠ…Vô2h©¹E“ÖC´Ÿ¡ÌÈ‘#ÅÞ¹æÕW_2eÊ|0|øðÉ“'c;æÎ{äÈåÊÃ<€ðÆåÖ¨^½z÷îÝ!ÿM›6íܹs£FÚ¶m‹æš¸ ×.³2ÑdI½7Æ pe“&MîY°Ê쪔­‰sk[±bÅJ²ˆœ ]5Õº€BÙ²e ÷íÛÇ1ô,å N:मG‚‚‚ £ „†ô N1 ÜÌTæOãJC•Î'6>þüœ9sÑ&;( úÅ_(•‡þ8vìX, VàÂ… Ǫ@”á2qi•cð™÷™åOœø:!!aĈz5áöàÁƒu™‚ºùä-T8¨d¢¬yGÌSñâÅm˱bÅJr‰ÉêÆ *çÍ›Æf̘Ñpi€W AÕòj­þèø×–-[J—.-²[›¯aÀbÌÉñãÇŽmtöG]Ð+r2ôÑG\üî»ï l 2a³qãÆ"Øo¿ý6×lÞ¼P‰‰ÑÒr¸t¥J•/íÈž=;~öìÙÎgqå¹sçÖ®]kÒMó‚/¾øâÓO?mrôéÓçwc<(:ô©Zµª¨¸ò“X.mÅŠ? Pcâ<^¿±™­ã'ðùõ×_7(Dýõ×¥J•*Z´¨|)À\†i\»Â·™3grÏÏ>ûL^S¨(‚zúôiñXá^HHHÚ´ia×f—+>Å¥±ºçŒ3”jé›o¾1ÌöóÏ?7+Ò©S§rܪU+t­Ë&NœØ³gOýÑè†4jÔ¨cÇŽ… æÎÀ¾ù‹b]@{JƒÑ ¹ÿ7P»\¹r¶ÙX±b%¹Äì'kÖj©5¢ÍMœÉ9ƒƒƒ+W®¼`Ám ‹DEEõïßâ ,ëÌž={ (¢®Y³ÆlMÈeÕªU«S§Nhh¨Ïãäs5j”òìɧѷo_èÔ©“&u“‘#Gr{åÊ }éÒ¥<´~ýú@ºáÉýúõTsäȱ~ýzþÕ²eK¥¶ÖmõÐÝ»wó¯Úµk¦L™¢0i xøðáY²d¯[·î>\šÂáí°\©=|)'g¶\ÚŠ+þF -þi’ç‹'—-[6Ož<Û¶mƒOŒo¾ùf¶lÙt=À+:­Õ\¹hÑ¢›7o^¾|Y¹•ócÇŽ™x? Ô:tÈ,G&L˜` ǯ}ʤ¢òè„„„èèè¶mÛÂÛ›6mqðàA‰‡pþuøðá‚ òµY³faaao6iåÄ{æ™gΜ9Ã) [û`\Nœ81iÒ$]°aÃíÌ,øÕ¼X îÏ«åÊ•«qãÆ¶ÙX±b%¹Ä¹u ï¡ ÍíÛ·%3 ˆŒ?^6hÐ ð6$$¤AƒÅ‹×Éo¿ýÖãšÓ×|ùòullìo¼Á Û´iÎ_¿~Ý™ó““J¤Å/<±OŸ>™3g†¥›Í\tçL™2A°/]ºO–;vìÈe½{÷F±?ü”–EàÑŒ€P>•ÎôÅ_1bÄ—_~¹lÙ2%&}ýõ×u[8¹â Û·o¯mgyP‰% Û‹¤¸´¢yzݺue\´Y­åÒV¬Xñ?ŒW©R¥fÍššgTâß}öY­aìŸ;wîªU«Ö«Wïå—_V"pÌã QÒQˆnþüùµ7 †`Μ9N·e)À·ãÇËɬäuË—/×W=šçÂ`·lÙRªT©:uêpF¡ ࡲy˜µÞZœX¡B…;vx¼ÓC† )S¦Œ~zê©§´‰ †F&0%bþš!õxW¯À·¹ÛtëÖ-h³Oà·óxÁZµjÙfcÅŠ•dthիW}5‚ƒHƬ\¹°-X° ¶_ɘ1£s-ø0(:tèPsF+M$9sæÜäP]¿~½Vhk˜­ÙxkòäÉïÂs˜¶ÑÁìäR£F Á2ÍVÖ&`VöÔúõësÏ1cÆÜ?¿t¡B…6l(îŒZ±\ÚŠ+~pæ£>š:uª&àpRˆÀÛ³gÏ ^F®X±`ëÆŽ;nÜ8p^qÑÚ¹sçöïß¿hÑ¢Ð×Ö­[¯Y³FØeRa˜$N y\\Ü'Ÿ|H ëbccgΜiö•A‰‰‰™2e ·«×O.\€Þ×rùòå.\¸yóf”1¾ô«W¯îÙ³§K—.Âí&Mš 0Äžzúüùóß~ûíýû÷ë/Šl9qâÄÈ‘#!ÿzÏštcàdLFl³±bÅJr‰ á0T0,, f;qâD­:4‹Á"~:xð`íÚµÓ¤I“7o^`,½~ý:˜Ö¹sgeÚдÏàøñãÛ·o¯LPÓuëÖ uC'E÷x³¨‹-R¤ßwß}‡]N †7n ^»v­9 ´>|¸oß¾ðp°±cÇŽË—/Ÿæñmî†5™£Zi[.Œ cx(Äž!¬ZµÊãxÑ‚DÀF,[¶ìþy9‚‚‚ž{î9tãn>„Ùri+V¬øMΜ9#ìòxƒâ@³êÊ•+¿üò‹²9ý'N?~ܬ÷xÝÚ\£õær&ÚB]Õdé_e•#"à•JÖtóæM£˜AN®<}útTT´™“|•{Ü ø4ÿ’‘2Ë[<ÞåêØ½”7Ôû(¨Ãpicãd0ÞnÒôY±bÅJ²ˆqüþãÿP¼8L:uJ($W€a†‚M¤uæÒ7{TÛO?ý4$ÓãÍMœ*•´fÜÀs=Q_¹§Ù.q±ÎôÃÃÃå^ü¢ÞI¯(ižçnäžvÀQ ÛÁͪÎÍY<Þ@îéLO'°~µý·Nb5ä3GÊ!).}ìØ1mûÅË*±¶Oâ;Ë¥­X±â–qú¼ÃÉèèhÃTe2f̘>}zÃëÜ'$* ë Çâ¡­¼Â=!<° & ÿÒ^‡Üß4"lür>"" ½xñ¢ 䉜áËⳡqk³˜ƒáü—×71¨¡ ÄðáÃÛ¶m n¿óÎ;¶‘X±b%¹Ä8æÌÆ)ž *Â]A?ñaýCŽŠŠÛ„QsecÖí$+Xöx=½N‚n) ÍCtmÕ-ÂiòŠø0^‘^çya¸s­7š€·ÜÊ8%”e‘ż/¤ZxÎÓe#DÑ11ØÞB[Ì(·É=¥]»v=zôàM+UªtÏ‚µ\ÚŠ+(à&´‹‹ÓIç*Bú9×€¤R1Ôw0`€ö47ûÎX±bÅJ  Ô1!!AAËà°ÿá$Í›7/W®\Û¶mµƒ9CƒÄP­X±b%0Źúû×_-éç2ç©]þýï›%“fKG+V¬X @‰gàóæM§_ú,ÿéç8ÂîohÅŠ•ÀgÑ ½ƒUÚ±¯Ö8ÉOZ/ó`Ôf®S)^ûí7m•n[‚+VSÌ*Åæù„·ý‘Ä„mpðË/¿ð©àmÛ¬X±à¢0-'Q|Ýÿy…ã¿ýcxÜÓHùä\²bÅŠ•°JùŸÿùŸÂä'á}_çñ°bÅŠË¥-—¶bÅŠË¥-—¶bÅÊFlŒ‡ñ°bÅJ€ùu`c<¬üáåÿ¾—¹ endstream endobj 139 0 obj 248491 endobj 42 0 obj << /Length 140 0 R /Type /XObject /Subtype /Image /Width 1024 /Height 782 /ColorSpace 3 0 R /Interpolate true /BitsPerComponent 8 /Filter /FlateDecode >> stream xÚ´ÝxÕØ¾?|ΙsæœÜi¡îîîîîîîîJÝ[(îPܽº+Û­Š»n¥Íû[Ùm)Ý»sáýß;ÏçùNvv²²’¬•¬¤PˆÄVæ »y›Ð÷€J¤SÙ”Ë$òQâàZÿù{½ÏÛéOÚn\ï¹Eèc· Òiô¾[½ÔW—Ÿö\¤3»/]§zÀj×ôq|jËõj?­…M'°è½ýz?…9@ôA2yB H¤~­ŸÄè#3X ‹JdÒzØ4›FžªŸúÕ…ú-rµ6ÝOéC$dwÜ †)݃`b/À€ëƒt€£úiݸ^„JB‰ïc?™ØO¦ hDJeˆD"ñ-‡ˆ”!"c¨— ߢ]ƒ¢è­ ŸF€ð½ ±éÝp ñ9P™^t`ií°Ì §†x%©¸v€äñã<@éDÈ=àëò㫌›º_S/0u-%ŒoÕœBÂ5ÚwN=9 pêÓOíp¢q]}b?‘ÚßKï'±Dî#RûˆL”œ•„Î,… iF_ïí¾Þ›èxÂ)#ÔÐAî‚Æ_õY´ã “ÖŤ’P9“È”Ilu :T`‚Nú0™ú•î–.v7 2ˆ™F¡3(T@£n²”ÖNZËõGƒWÚ.õ»{ºH÷hä*\Ñ©L•E¢Üè¡Þê¡w3XÝŒÞn:©‡8ÔÓsÒó„E¿ÛÇê¤ÑOÜfbØÈËìÍ C>bŸ_`سØ£‘±ÇØ»×ØËOØs {}ýð{ÿùËöñ=öæöîÁìåìýöáöaä Ì|½|½ú„}ÄFFF±‘¿°‘Ç_Fÿ}ùåËë±ðû<>ÿ5,€/öûò yƒ}yƒ¼Ã¾€Þ¡™,ó’clìõ(övlôÁ¾|ÂF>bPX÷ó4ýù36òyôËÇ/co¾Œ½}ƒ{7‘œML€µF>|õåÃØÈ{ìó{ìÓ´ïñüÀ™~?u/ÀDý95|5næ¼ä^æç而½Æ½ÃÐ.|AF ?c£0NÝ`bäšùNÔ:A£oQÈ{Øß±Ñ€a0ì6ö¢`­±7ÈèäÇw¨@4ç Úâ—ר('ßb_ÞâGì#*|jÂL´Åwx o&J˜HκãG~JrÖ…e¾n ?S_ð35úq¢p8o1 ¼Ÿð÷yü˜|Áwa L¡Dß¾_…CƒO ÿƒ1|ǧßaØK¼ÂŸÇçÀGìé:\ŸÐq›ôé«/SŒƒ sŽTÎ:Øx}Æð#Œ½ÁqŠ‚™_ eŽ~äÀ¦ãé3¾¡Ïøo'J{æ†0†A}L VýuN;GMµNƦ>ÙÎñVýa|™ÏÓºÒ«¯] zëç—Øçר§·üjðÐhÑ·/¿'X}¼Ü'NâmõÍ‘¯¾Õ×v{„–ù<ŠöØ&àÜœ±§öo–£xÇ|7ž°ÑÑx_ÃÛ!§_ ¶Íé ìËÛïÝù#ŽS>çjóoÌ£ã&F'úàØ_(aE´ìàèû46ö.Mc§>PàÚ—Oø5vt ‡7lÔ¤?ã=tŠ©íã4ªÉ¦5ŧK~øÆ竉7±$ªägt1AÆð<òmSÿÓZòÿ?ø©ýcŸxûÑr~Ðèçw£Ÿß|¿‰+ütèZÍÓ—w?f†rfÜ_ùÿO7x.3¶·)·¡©¦5ûÿÏBÐ}ê}æ ¸ÌTþLíÿë¨fŠñ.üއ¯wÆowíïÎ1ÎZ\ÉsyMˆ'Þíjâ:Ïã¢ñùÇ|zÿc>àí«œË;ñAÝçO_F>}þüyddäùóç_`hûú5ÌÁip݇ûÙ'n0ÿÍû¿>CGÆøôåÝÈØ‡/ØÇÏØ0ÆQ K÷gt„G?|üø Có‘Q4p‚„}xñ¿¿`hà166:Š.ðœ«çöJC7 ·/ð;wÕáÁ®NìíK2©‹Ié¾KíyÄ$õ\=Ϧ‘XLzƒ>L¥Þ%QžtSŸôôÞ¦µ÷³Zi}ÝŒ¾îaFû «µg¸ýÚíöK÷ZÛnv²X½CtƒÝKè¥õ‘˜ì^x¾`±»¨ý$Γ?µJcÓƒ…0Ù Ø ­1ùBÊBèL|‚É °¦á,@t&…Ê&RºÈ°•nZ_/ƒ*Àdw3Ù] Áꢳzè,"•ÝCéë"õH”þ6Ê@Ëל@Ô×ñ»‹Ì"“™t ƒNt&ý‡’AãLÃ|* 0©dÀ"SqtH¨ÛÄG ›La’È,* HhìvJ_+…ÝIç9V7 1»i, žÎXítV;LЙ³—Î Ñd*Bf"™AB0—Î"1PI(ªUÇ$#ŒñÊÃW°:TƒÆ$QX½TTO*“N£Òi3$Ú"¾d¼2*SꃪÁY-?=)xù¤‰œ¨0^gTm|±Ée‰‰cPHh>…Dï%1º)ŒŽÈ$ÀG”lxFnÃuX>M¤‘ˆ´"ë€y•ȼDb]#1衘F'²®Ù‰LT‘ÕNdµâ9Íïèe´ã:§è"ÒÛÉŒ«dÆe2½… Ó´.T>æw’˜íx±WzÖVG³ B˜mS3"ÓÛÈÔ2²•D¿B¢_$Ñ/ÁD/ú‰Æ¦à=ˆŠ&úziýŒ¾.ÔæYTó¡‹‘ûÑ þ‚ƒÚkQ9Ëà‹Ñ©8¼œq0zŽÆ`€¯ÿAw£°Qw›–œÍMK…0¦ ç×Í……ºs ÝAgôÑýÐaélêÐÆhC4ÚL£Â)útøÈ¯Qú®ÑØÐ} ›àý¨¯• Ø2»eêV´2¥÷q „Â' ìÅuC±dôÕU´u´J/ê :™¿×g1{ÙT"›Dd÷ûÐZxÇ«Žjá¬.2t~ÅêÀµM…Ú3«³—ÕÓË"ö²Hx"$æ8NÁ»êh8™ÙÃ)b+=Þßa™‰…Qï&ÑÉÄïÇ ŽwO.ðÕÿ©^z/OÿÇË÷ K7/Эx¢õSyšiù™ÊÿÑíâ7~´|èÚ?düŽöÿŒg£Â›÷ä}ꛜrú®¤ò*‡nÜÐmŠ /ç‡ð,Pi½Ü(ôn¼ÿ~/´0£Ýéß›TZ‹;y.êCë¢Py Òº¹á«ôþ2­‡':>ˆâÆ`SxböQy€+.nö}?³ÿGÀp–Œ®ÿÌ^Sác<Ô˜‰l2mŸ΢õÓún°á2Ç“@j£3»ûi“âC4½Aêí>RÛù£7˜=w(]WN±H×úé­`Ú~Òy‹D¸M$Ü"uÞ$·÷õ^¾Áj¿Ñ×Á"_bö\¡\;½§³¯£mÒ‹þ½MïdÁ€nJtn1ôó=ijmW¯¼}öÑÕƒÉêíØs}àÀûòâ:»óé]6­õê0…Mê"3wtî´Q:ö†`Ý42‘ÖIa¶ÒØ0¿•Ö…I»Äî½Âîjeô‰ìnâÐúÀyû “ÞFƒ6ÔsÚ(ׯQo‚VÊÍ6\éVùf'ùv'åd;õVõV mÜ5Òâ8˜Æá3É·[È79ZÉ7& CeZiP%f• ãõNÎÈ€Â$Àm•ÐLøŠ³Ìø’4¨Þdâ¨0€èœ¤´ÓðlCÕ»ÝNAPÉ· ߸{»ÀÙ‹6ÚÚõúÐÔl§_oÏI7' ¡!>ÞNgàc}ØúÀDM`ÂÀÁªR'u°“:ÌÙÜx’Ç+:¨w&(w:h· ÔÛ_çÃ4í&ª§nèãMü«oJè Þ›’hÝNú ·p7&&8îLC`ÜÅÝþÖ]ýA'ýQ'ãîà,ÉY«0nç;ÃŒ¡NÆ@'³¯ƒ90¡¯“Íîd³,žl˜ °è#Z’ÕÅîîd÷vÁ4c¨‹ =ÜÍb˜ƒÝ´ú=|a9L`^ç”3=ŽÕ?Åà$«¿«Ùæw±Ù]ì.Öõ C„¾>B:^G?“ÐÇîè °¯ãð…§éƒgT¨ö´ìföw3{ƒhšÅèfѺÙTs»Ìl!÷µP’Ù-z …ÚÉ}íäAÐJ„Ú«Tä ­ÿ*}\£ ´RÚ(Ð ‡:p0ÑJ×AÛD—D½’üU' \dX- wZrZû´l§Þ˜ÜÐ4­x 9Ú¿æpù*FCÝ|§ôÕõYx,¿ÞF|ÜFz„?–Ã(ÿ@_¡…éxÒÚèÎÞ‰èm ÆWãÝjºz?O„ÝÁ`v0“ÖÎd´3™ƒ=Í¡µ³(LJ“Ùaô!èÐbÛàV+k¸•5ÐÊîkc±P[e o»hwºh·PG]ú;êÝ(ñšðm´ÉÄ7 le\Ÿjò22ÑyG»Ûêø¦§  1nhÂ0‚ºðÆ0OÐ5x™hÕÓu²†yúÑåÔÿV}fÒBeñ„ßwxh£÷ñ4S9?Zþš©>3ø_í–§™–‡áO<;ïßôß)­ý3-÷ˆï×93¸¹ð4SQ„ñKÍ7PýQçåáÛ[Òð/p«â ݶ~D‹·^ö ·î¾Ánö0Op‹ü!-è~ÇC+…Å~ËàÖßJéŸzë™Ä¹'rk§ó4>pš.ûÐé,Ž6¤¯…\&Ò.)pãîí냱ÑF$ôP‰T*•Fáa°àıãT2åöÍ[]˜¸>4L$öPhD@£’™ðè?þçEé0ÝßÇ¢ÐÈ„V…800ÐÏè»Î¦¢7ªT2z–„ñ?D¤Ó‰Œ^æu"}4xýÞ©“Ý7¨¤þ÷©];häæïØLò™ökgE%Uÿ\¡5_Ðó×µ~¿ˆøþ$é2KÞd–¢î?åtÿ#i6WÈcáZï¥ü. \þ#ø³¨ÿÜj9À/ïÏ/ï;Cò ¨„ Á…NRš* QŒ€V¢J‘ÂJ‘¢Jáœ@D9jœJ„˜rÄx*G‰ªD‹ªFâ"DUÃDÕB¾s´,©-®‹‹Ÿ’±âêÑ1¢q‘¼IiÅr“ÔŽ•ÖIâ’dõ’Æé'Nˆ‡”1H’1Hæ3H’3HÀÅÉ&ÊÆ+ÆËÅ*Æà`"VÑ(AÑ(VÙ$HÑ$DÙ0IÑ0UÙ0NÑ8ZÅ(^É(UE?_É _É(YÉ8QÉ0CÉ0KÉ$EÉ4aœIÒ„”)Ò¦HQ1ODÌRTÌ2TL3UL³³ UóTU‹$ l™ÓÊæ™ªfyªf9jféjæÉ\Rµ-34­2&2KÓ2 Ïmë|\޶M†¶m*b“®m“eì°ÑбÈС Çõ†Ny†N¹¦.ùÆ.ÀȵÀÀµ@ßmœ{!0tCŒÝ M\ Í\Pšzl@Ü‹LÝ‹MÝÊLÝ*Ì\A•…K•…k®ÌÒµØÒµÈÒmƒ…[‘¹{™™G™™{ù´4÷¨0÷,çN ¯ ïMSYz!6¾¥¸`÷5KmüjlüªlŠlü‹­|­|·XùWYù—!~5V>Û¬|›lü*lüËl|ëm|íêìªì+€\pªÁÕáj‚Ñ»à:» žìƒyrWï\‹„Ts8‡Õ~« ¯p(AÂË]«Âë#@­cd¥St™SL±st‘st±kT©[D…GxGX½Gdã$¯ˆÉlð‰Þì½Ù'ºÁ+¦“^1u±M±Û&ì^1ã¼£'ÄlóF¼cš¼ã6{Ç×yÇ7L㛸Ù7¡éûù'mã) e+O©Ûx JÛÎSh殞½‡§ˆœ½?$2wOÑùxJ,jæ)¹ø(O)%ÇxJ/?ùC2+Oó”Uu†§ìê³<åÔœã)·öü .ò”_ù‡4\áiÖž66µò´©©…§â­­<•noÿ!e»:y*ßM˜IéÊ÷uóTs€øCjöòTwˆÈSÃaOÍdž6¡ð´å(•§¦ãtž¶ž`ÌdËI¶aó´ã\?Oû®ÜàiÿÕ›<¸v‹—›[¶ p;Ô>ÈSsç0OG×yè¼q¼óîñÎûàè·.RŸk¿y‘tÿÈUÆéVÖÕÞ¡ mô«Äë§znï½ÇmëÐÕ×-CoÏÑŸî¹Ú¬çîYÚ“£½w›I÷À±Þ'zœîzNu?:ÑýhWËõÃäÇgÞè}°õâÀIâÓæ–{/ Ÿ#Ü;O¸}®ûúÙî›g»àËß;Õ{}ÿµžã]ì#-wÎv¼½@øÒByÄhë#ÝîÀ°'n‡ØsTg-3þC,~Ö²ˆ­M˜%>KÂc–ŒÃ,Y»Y’®ÿZ5{u¼ա³×Dücmú¬ué¿ò/Xí±z™ûš¥^‹V„þ±*êW¾˜ „Ïó™%ðÇŠä?—¥ÿÁõ«@ðìuÈk‘¹¸yëBÀ\ÜÙ‚Èo‚as…£ç Ç‚yBшp$ÇŸ"Qˆp .nžN8~¾pX(»P$z±pôb¡Ø¥‚ `™`ò2¡Ä%Âq‹EbÀ"Ѹ"É‹„S—‰f-ÍY.’9!,-˜b=Ç2ñÜ¥RÉKdâ–J#+¤•’È™D°Z6q•²B.q¹<²R>i¥BJn0ÿq0“O!“O>›ÛZÅ\\ŸRÞDæ®UÊ^§œ!”ò4* ’ )¤’3N5KH5]H5ÿ˜'¤–+¤–-¤ž…ËROÒHš©ˆFº°F¦°F6¢žÄ´ yÉ×.@tò'äÎ ›“’zù¼Jn”2,š¢HË—Êã6ɘl”1YÛ(mR,m\.mT#mT%cT>¾€ñ&yã2yã yãy“"yÓB `\ ”LK•ÌŠ”Ìó”Ì •Lª”Lj”LË`¦Šy¹ŠY•ŠéÓFó Ä´±¨V²¬øV%P¶ªùʲnœUªMµŠmµªMŠMƒªõ– êvuêöÕã`Ú¶IÝf»¦ÍV-Û:-Ûê)jqu:ö :v›'4qhÛmÓsÜ¥ã¶ë9mÑsnÐs®ÓwjÐwÚ¬eÓ e³ Ô´iҴݬi[§iW­i_®m_´Ê4*ÔU'DÝ¥ h:#ZNU:NºŽ:NåºnU¸j]×z]—-º.Ûôw§]NÛ œ·:׺TºT@ºmÑwÛÊÍÀ}MF^M†Þ›¼&x7˜xz3ŸÍf>æHý$˜iî³ÝÔw»©ßf¿-&¾{L|˜øî4òßnê¿ÃÔo©ïaS߃f~;Ìü¶™ùî5óÝopÈ2à€eà^‹Àý–þÍG- Y¶ǬŽX° ÚgxXí³ ÞÃÖ!¬C÷MÏCÖÁG¬ƒáŽØÆöá‡íÃN8Œ„i§ÈΑÛ"w;Dî³ØÑzwGÛMn»:nó´»óO{»îñ@xp°ëÅAÂ_ ¯öwC»^ìm}¸ýÜàeú«#WÎÐb9}~Ž0x²ûöÑžûÜîì¾:¹ãRß‘î{'ÉvÜÚÕ2tø4÷><Öýðx×#p¬ëIsϳ‹Ã£›ŽRްÞïë}¾«ýá1⫃­®Ðß"Ü?ÓuëT÷ p² Vyx¼ûþ±Þ‡ Ô«Žt<<ÚöîB/v¢ã¯½—]·‡Ú)Œ÷#c¤¶V*õ›´ÞOÒN‹åâ箈^²[ÀoÝÒáÅA+WÏã ÿY0æ"Qÿ ú·pè¯|™¿¯ÉúU0úáà߄ق`Ž ?˜+þ³EBE~ ûU8òWáhÈßðß„CsDÂÁlÑÈ٢ѳEbq¿‹$ÍNÿC8æ‰D-1 “ ¤.ÌX$”ÏóE£ÁŸ" sEÒþN[,»XU†Þã࣑O£o£¾¾_ƒ¾ïv=ßz~[uü·èûoÓ÷ß¡ï·[ßo—“ÿfC¿m†¾»Œü÷#» öù5ô;ièßlèÐ8ð°IÀÿ“&GM÷™í2Øo¸Ç$¤Ñ8¬Ê8¬fZšFÔ™FÔLÏð-&a‡LB›… æ!GÍCš-‚Y„´ Ûg¶‡Ã"ì€EØ!‹Ð#¡‡mÃØ…í³ k¶;fvX†Ÿ²Œ8fuÔ:úMôOð\à~ =ä « ¶a‡&9Dqˆ:ìu8FíΑð±ß.n¯dì~û˜“£q1ûSô^§˜ÝÀ1v§cÂn‡¯öâöÛ'ìwJ:è’÷ãöNrNÞ‡;0-]S¹¦àN÷ôCî¿?=3›=³zeñÊnæNŸœc>¹G¹Ó7÷¸oÞ1îôË;á—œ; NžäΠõg‚6œæÎ°âóaÅg¹3¢ôbDéyîŒ,»Yváû3ªürTùE¼Sy™;ãª[⪯rg|Mk|Í5îL¨mK¨máΤúޤú6®ìHnèä)¥‘ÀSêæ.žÒ›z~HÆÖ^^º³¶÷‚ìmÓ3g;1{‘;swrv’¸3%o7…;óöRy*ØOç–·Ÿž€ÁSÁA&Oëg°á‹ƦÃ,žJŽôýR®,?6Pvl€;+O UœâΪ“Õ'‡yä™m"Ó„õR9 £týÄ —À!f”$f”"f˜&f˜dŠdCŠ!¢FY¢F9"FyÂÆÂFë׋™mÀå‹›åJ˜eI˜eH™¥I˜§IšgK˜H˜–K˜TJ˜m”0Ï•´H‡™2¦Å2¦%2¦E²fy²©ˆY¾¬é˜¾…;>h—4/–±Ü gYä-s-%óEó« r6ëå¬7|«HÞfÓ„’Ir6%²¶%Ò¶eÒ¶Ò¶•Ò6Õ²HÌW´Û¤h¿AÙg»IÙ¦BźVźZݶXÝn#PE6!¶¥@áJÝ¡¨:Ö!õª*Ž*NÛTœšTœëU«Õ\Ê4œK47i:• q¾C…†C ZѱBÕ¹TÕ¹ !½K¹ºk¹2>ìêî5@©Òt¯Ún•Ú^Eˆg‰¦g…–{µ–{½–Û ëÖ¤ë¶Y×½NϽZÏ£TÏs£žW¡®×F]ïjï:]¯ºi©ïÓ çÛÀ0ø×ñ­ã$ þu}k8Œpu&HÍWÁuÀi0 n2Þ ôC¶†ìà0Þa¼˜‚ m¦Á»MBvš„m6 ÛfÜltÌ(ä€aè^“°ýf¡‡ðA{³EØ6‹ðF«Ða;Ì#Í"k¹YD×s3‹n2‹ÞgÕlyÄ<²Ù2¢Ù*âUä>ëÈÝÖQ[­£š¬£6[E7YEí´ŒÚcyÈ*â€}Ô^#|›¨£6‘§¬#ÏXCF³m¶;`‡Þíñ¡»ct³SÔ!·Øýn±{]âö:ÇïuŽÛï?Î)á€SÂ>à’°Ç%a·kÂN÷ø.0DOáŒÒ¸$Cn‰‡Ü’àö¹'íuOÚíž´Ó-y§[ê^×´ý0PwIC#v—Ôfà”Öìœ~Ì9ýpÊ8ì”qÐ)ópÎ8à–q×<-=²Žzd5s§WÎQ¯œ#Üé™ š¹Ó;÷˜wîQîô+8éWp‚;ý Oùžä΀õ§ÖŸâÎÀ g7œæÎ gƒ6žáÎÐâ ¡Åç¹3¬äbXÉîD ”œåÎðÒ‹áeç¹3¢ìRDù¼]u™;cª®ÅT_áθšÖ¸ÚkÜ™PמPßúý™Xß‘ØÐÆÉ„äÍÜ™²¥ó‡¤6xJßÖÍSÖNâÉÙMÎÙMä–»‡ÄSþ>Ê9HËã¥à0ƒ§Âffþ‘°ñXO›N p+>1P~r¨üä·ÊÓCÚÛ{ÿ éîQò­{FºÓÝ?ÔÍb´öv2,: ÿôÓe§%éjbcŸ¯]<;Ħ÷ÑÉäî:¥‡Î ÓéTþ;Þû©èׂ²ht:]\QÇ'*ÓþØJ|ùæ3Êb(ƒL&þ·Ô{Ç—þ{iÐ/a¨ý-äËÙõ\/^B3·“r…µH)“ôÕÊ‘â‚ZIë4DõÒ…´“¨^|ÔJÖI‚e–ȉ$‹è% éÄ„¨~‚”Iê"o ã¤û›µH^«$n-j-¤±Z5hV¤¸aŠˆn²’õ(GD'FÚ8YÒ8ÆÉËU¢DMrô²øu3$ÌÖ/W»1Š)ÚJ™¥JšÄ+Z% 뇈úËZÇ ë'JšdŠFŠ›ËÙ‰›J'Èšg‰ŪØ%®Õ²W´ V²Nו0ˆÓw/†½7ÌQ´Þ$iV ¤Ÿ.g“§ê”%d ä¡í³ZÅÖØ;UÆÐGJßGÙ6î.†±^c:žÙÒQ*ŽÉbÆ¡*©Òæ1@É.UÔ0RË-WÍ9[Ù-OÐ,IÅm£ q¢’ËF‡|9ÛLië$£5çD÷9Ëp ‡]—9'Ðküœè¥}îIH¿¼SèE=WúçŸöÏ?ÉgÐ ü‚3…§ Ï¢—öëÏýMo8¼á,w†l¼²ñdhÑùТ‹a›.„mº„çôÂæ /¹^|½ü/¹45ÑëýÒËèe~Ù•¿Éèò«ÑW ÑëýŠk±U×b+[¾'ÑkÿªVô’¿º 2¡¦½ØçÊÄڎĺvîLªëD/ü¹sÂL¯ý9¯÷Ó¶tÿ½ÿñ=æ6"ÈÚNú[½“²wà/ùw’8rw‘yB¯ôyÉßCå(ØK…ûè€óJŸ§i/ö ±@Áá6³yZx܆æ>°ñHÿ4EGÀ¦cƒÈñþ’cý¥GÿNçeþñÁi*8/óñ—öߣêÔuP}úÆ45gn‚Ú³·@͹ÿù~õ…Û€óÒ¾zŠšKwAíå{œ“sê®ÜŸ¦þêÐpíáwjly6·>žfKÛÐÔþ”ƒóqrÎÖŽgÓlë|¶^pp>NÎÙÑõÇäœ;»_"=/vu?ßÙƒ Þ»IÏ÷ï'>ØÑÂ>Fza-TFßí[-]- voOo[¥—ÐÛCe2؃Ý]=d³¿>lÜ ¤¦úÈT …AÿÇ¿ÿõÓ~žõÏÎú÷ϳ~úLüç·_gýsÖ¯sf“X}mdfln™¼‘ã)Bÿé®>{wчHt6…Êìc R{)} :±‹@줲èCä^z›I§wQ©ä¬ô2mUÏÖK:Ûît“Èè7åШØ(Æî¦þZ³6píJƒ¥êù|r_>4¯kžÀµyk¨«Vt-_|zîªF5¹e«V)ËüW>_')[.Lf–’hÄﮯÑO°ÿèüCÂv–°É51ùˆeË\ç®qÿ×J‡…â¾³ù„Ô"Zlòîÿ…IhEý´Ð`¡Ëq¯?Ö¹ÌZ`ºT*xžXà<©¨¹RѳE`\š:GÈ{ö:×,2[,î3OÐíO!ï?…ý—ÊÄ,’ŒŸµÈk™Bî\ñÄß×…/“üm¹¤‰?Ü4ï`Ïǰ;¯±ÇŸ°Ânøï ÇV*Û-–s+ìÿ‡€Ï3ü—¿ ª¸ÎY£¿RÊNÐܵfÏñÅ~YcºBÎk©´û Y¸¥ÞÅV*,’ö™'î&e”ôß5–°Ì­w°®ÿ"{XåñÆ)þSØg‰L¨€ŒãW©d.’L\­”µV­à_+eŒ*Š%þ¶:X\»€O>y±X(ŸB´œaöRqÿy®«d„4Â×(yó«º/‘±âÜÍ—Ë{,“X À¯ž"¬›µJ-nnü%¿ù²ž³EÜ„´²æ & (¯_«˧è»î¿ÅžÁžb y j† ëÆ­”KÓ)ÖL]!¨l‘ õÕŽ¹ó»?‚êŒo1£d »üå2~«ä‚E4ø•"TcÍrWÈ ÖU4ËPZ«qý ZkµBœIµBÖOÚ0IÊ ÑÈ£x©”'|uÿ &¢¢f›¶NÍ_H3HÎ4ž³!(_Æ0CR/]L;IÚ ^Õ*]B'ŽO9\Á²PÕ¾LP/KκX@7S͹FªðüŧM|Œ^YóEó41X˜f½Ä¬Â’ÖiÙrJÔÔrN|Š´{ŸÑò0•-7È› h¤H›æ©Ú—H𦠄i¸ÅÁb7ðÎâÑg솙yÄ(˜pŠ’4ö“6 zî©2¦Áœ™·>Ÿ_eëØuêžÊ¶ *n9"æ‰JÎRÖª.ëað¯ã‘¯ë•£í–ø_ ×uŠW³ˆ1qË{ð{€7’›oÑ|#Ï ópøø` »;‚Š%ÞÃ,CjáéÉÀ§Ü2¸6 j•×ËÚ¦À¡¸þSwŒ0tŒŸbU‹03ÏÌçø>Ú†Üþ‚¸L}J$tS”- ­·Ë›oP¶.Õ÷hÒvi@?Y°«Òq©³ Û7ðfêÝ l‘¯ã´ÑÈk“Uh¦K¡Žû&%Ë\}· ïZëBcjm‡"h áõÆÐ&t]ÒìÂʬƒk|+TìòMªUí d-Òµ\ŠLü«Œ}«l#¶À]b³€Zï274aä]ëµOÓ©ÌЫÎÀ³ÖÌ‹Sô^xú0ð¬ú5VÁ[a£î ‡ºncá[Ÿà»cîWæŸ~PÇ£@Ï»HÏ·žl¢öøÕ˜ÕšøWXÖ›ûV[TÚWX‡Wëúd‡eZFo´Ý£èX¡è\`WgRj\aе}À9DA¹:NÙñ|¶êº7è¸Õûg^´ Ûo¸Ë"h·¡w“møçØ£0ÇÔ‡×Ï´“–qÛt‚Ëì’w;$îÒõ)ƒÇ—¸ZhuPOæË/œÆ`’cà›ï•¾×$ Ä"8ÓT,‚Š´ÝóáštÒ9ñ’|Ò9ù¸sÊQ—Ô£œ ¸¥î)'§¥Gê)÷´¼òkÛRéÄŸ—{Î]ç³Taür6Þ£»íy'qí€yBæËeœáîüÃî|BÃݹ®*hØö†-à·y9† ”X&ê¹RÒÿ÷Õ. FKÄÖIÅ®’M[)—)¬¶a‰Xê:Å `Îêý Õÿžï)©š+­‘³J{ ]·é:6iÛo6óÚ­a]}ïæ¼_Ëj“•gƒ‰k¥K©’Y¦¥o‚I¦ÿ#×J}‡Ç &U“l×Э¦®%ª¦ib÷ß`&ÎyFÎùjYV~µÆîÖþuFnå)‡Ý¢vC 0­b‘í·ßؽLß¹¾5󪆙6þ[e ²mü·Ùîж+u:hêÞ¨m[n¸ËÄ£Ñ7ñ´žs†Mùã1,8ã’¦]‘¥W‘µÇzs—ÇÀS¯"—èF§ÈFÞ ö¡»Åt“=ãwÙ×YyÖ™:•º×;úW8†n± ©qM®TvH2öÙmqÎ1®Ù:z›iH½Mø.ヲž›9ýÔ9pcBÞ1SÏrûÐ-À¯ÆÄ«Â̧ÊÒ¿>Ú7ú&Ôu.rk‚i8QoÑv-±Û«Øh¾Ç1î¨MÈ>Ï:·¨¨§¼Ç¢ ]¢òoã„aÞ‰Çl7?ÃÆó!Ù;Ýã¶ØWÚ…×xÁãRÞ|¾}T¶CT6ç©ÍÊ/®?Ъâ7û'mƒKŒö̓*¢7{¥îqIhz0ŠyÆ7ø$Ô?ø„®Q^QåÞq›]#êƒS÷ÛÔ„eÌ>aåU”t(,í¨•We@ÜN¸A™®¡¥QY;‚S·‡çóK>–}Þ1tŸGìq÷˜S-ÎQ§Ýâ.ׄK.‰\Ϲ&ƒ3À=éðL¼4-½’.{$_ä‘É|¿4?(Eî•F*͘åÍ÷+߯8ò ªùä¤Ê£AÕ±Gß©úøcPsâÉ4µ'Ÿ‚ºSÏ@íi¤æÌßeíÙçugž×{Qödݹç5çáãóÚ /êÏ¿¨»øWÃ…¿ azêœúK//¾œš —_m¾ôªñÊë-—_On¾ú¦éÊ›-×Þn½úvj6µ¼ÛvíÝÖÖ÷Û[Þom}½­õ úÓþ­¶¶?ÚÞ†ÿ ÿö'Ss{ç“øŸðï„áýS˜ž:gg׳Ýð?ã|;9gW÷ó=]/öt½ÜÛùaoç§½#{ Ÿ÷¾ìëþ´¿ëá®×Í„'Í­7adNa?èé¦Ñz)”Žv*¡•Eï$ Ѻ»/ß¼É"‘ZÈäv«{Ó¦ ™/_^wtœ§Ó»V¯žßÓsíÎ~&ƒL"uܦ0¨W»;O.\ðOF_w‘”[¨lhs¦“qž@ÿˆa0ò‡µh´ “4ëçYð˜À 1ú™³`èÿïYdv7‰ÝÒÃ"$ç©h¹\l¹™p«…Nìêìež‡Ás ãƒ6KÒòÕÖ.¿i-5ðøIHi–èÊvË×ú¯]i¡³Ê>tQxð¿-f Ö(¸Xé4KÊZÈjÞ|=~áôßx½ÅÿTì5öò6óÕÚ¬sûu™ 8_àà>µÏföƒgÑ`f¥ dÿ]4@zø-°`ó|Aïe²±‹%cæ ¨Æ-pã¬8ð{þ {ô›Ïï& ”ðëJߥâÉ¿¬ŠX*™Ã'[4]쬹zOñ›þRQG)ÕôÕÂI‹VG Ë%p†[KÄmæ 8‹klš·:ÆíoñÑÔãwØJ1C8ARšnp«}ö[.i5w‘¨¦ßOKµ'_&9ƒ8Ö#TøWØÓO˜¸ª×óTÂü5¦Ò¡B è÷‚ (†¯’ ÓHÑH_)›0wm°´Þ†¥bq"ª¹+ÅâWŠÄˆ)gŠ*$=zƒ=}=|ƒ½þ‚½ÅVЏ(ë¥ ËG>z‹=ýŒîã0Ü… -óZ+›°F:CP¡HL­|±hÒ:å,>•$a”ßÖ¹ kg¯’,PÔ­WK\-é»õ ‘TJ—UO]+ô/ œ¿F.—O&JÕ4ãå(&¤,ªT8ž«¥Ýø¥=`CO>b’Z/ñŸ˜ÈhÆ>ùŒ‰(†JjƼœ8eÒšBÊ0 ë€Y\#dµ„ë üÇ((Ç0e“)Í'_Ð5‹UÓð‡Ÿ±¿`˜ícx4hÇϯ¤j¼¶E.ì5ùgŸÐŠzöE‹Dü ]D43$õrï”Íò–‰{ÊjG¼Âœ¤eÈù‹3šéⲑpÌa&ÿŒ'ôµë/1l+™m0r©Ó´.µðÞ Ï_šùfÎÅf.EÐz~@?û€:˜{–ª˜&ÃÑxøƒ}„Ç“ç_ÐO‘\‚J_⛀£ÌÜ×›{Á2èÇv/Pù:¶™öA•°"û1¦a™ ó] žâ'Î:’c˜K`£žu> PádA%¡b@סDÛ¡ØÜ§ÞÔ«þá(ú‘„‰GœÐwc˜•sžƒo)ìë vïz®‘;lkžãÍ úË[(ù5fï“ó/üŸ-|þx¹ï!Ë€ÓŠvez0ªm´ ÛmæqÀ%ø:•c˜ox9ãƹ@U!]«ï¾GÀ6 ÄÚo“Wlã}|×8O‘öa5–‘ÛÌÃ÷î6ñÝíuÂ5ü C@Ãí—¨žÑùV>è’Ï!›õjàéÆ9´ô9~êÍ= mý+Ý¢·9„6fì󈫇zÂCœor™_RÙ#¼wûÅ–ùFUº…”{„V{D6pœ¢¶¹%î±®sOÚ Ý£"²öÁÂ÷^¡³дÜÃ*£³ö[zlx‰÷Ê'ÐË>èàWZ¦wäÆWøuàî;t|±°¬S¡g½âŽ9…Íju;‹$œsM<ëšxÚ-ù”kÊ ×äSîÉg=“Îsƒq>/ç¼RÎïÔ³>iç8|ÓÏóä—qáoøg^äȺĘ}™§ œ+<ç^åÉ»Bó[þ^XA+Oá…mëÛA䆎 m/jc;ˆ.ê˜&fS'ˆ-&ü½¸’.ŽøÒnPÖóË{AR‘#¹’ÄSJ™§ÔjÊ Hi5d^K™&£Ž 2ëi/«áÿãí= ÚH¶¶]æÌ̱gÆã0ØäœD”D"‘„„BäœA"‘sc±ÁÙ㜳1Éçœs¶Ç9õÝ­žãïüvÛßÌ]ÿ½¬gíµ«ººººÕ¢ß]]U:Ž‹lþ Œ‚Ž“@á‚SßA¶ðäg  ŸÆ(Zr—â¥gq)Yv£´ë«®àR¹ò/ªV]ªW_û‚š5×Úµ7PÖ]«[{­aÍ÷h\{hZwhXÿ?4n¸ 4ýqëoÒ¼ñ6вéδn¾ ÌÛr£uëÿ¼m÷¶íäÜ›·ã/ÚvÞÚw=ÀÀ’Ÿsæï~ø{ ö>þ›tî{,Üÿô x,>ø\ÎÐÿ‹@ÿº³ôÿá»K@óÿŸ,µß{h{9XòsN¨}9Ÿ `Éå ÿû­8ú´»÷E÷‘×(G߬è{ÓÝÿº§ÿÅêþ'kÑ•v.ƒz:~ytøÄpïá;çO^9Þ?Ü»ãøÐÞÓ£ÿÛ^8u´XšìlG€áàŸ?Ù ~¸oç±£»Æúö:xùô¡óÇw]=·oÜ £#{†Fz%Esב±=½# »ÇFÏŒ8=¶wìDïðñàÿÿõ³Â¿~Tý?2Ö+ÿ…«ÝÇNÌ‘•ÚPv¸¶ïèåƒcGÏ=³õr{äÜþ=cÇÒü >EÅÍJÛ!ŤMµTt0ÿ8^7nÅ[‹KüÍZðïÙ ôlÅ zóUÙEjLÿÙŒ)“xÓõ£o>ýôA&˜¨ØG݆ÇÐ+D[Åy‰<}(x*üf€ š£gÿTþsÅÊ:dÌ™©e¯N`€ðÅ8ÓÀ{†1Wa–Ë,Sî}¯ŸgÛÀÓöö+DÃÜSèûL.Þ¦R” ¡“uBTˆé“tb& (Ŧ´ä³OÑ­ã•)³µC§Î Ÿ£“Î=87PÂ6sÌøT"õI2ПÊZÎ 9àÐߣÎÙº PwðœýE‰fNKV1 6 &ƒxº÷Æ´7t)*¡—$ „y ŸÖ}ëOô™«aÎ2²)ø=’O‚€}u)13 U-à ǘš¤i)Ò¶ÎÑ÷G·ˆ5=tšª6+|¶–ï³ÈýWˆ‘-ÇÌ‘Í8÷±pM1¢ˆuɲii*„|=JÉ ƒCÇìq¾ºÎ±zÎɳôSfèÄ©[Ñ81§ïÞ.h 8£9l<ŒºMš)­TÝ<êÔ¶ô·¤…X³Á?}±óŽ2¶ |* ºd&3@þAdæ€êá›B\D ro¼@˘:©˜ÐÊe!Á‘‹•×¶bXÑ7_ ÇÐÖr®z…žæÝ×l=yZ¦"GF¥½g>ý!ÂS`âjd—fEO {¦™»”ê .%z™)½ÆÛaá%£°³nÊo!2-ÊÝ/ïÖ}äÙkÄÍ? >S8œƒw<É%¢0ð ¬9÷ä/‰,D6î± ;ïË{ò|sÍ=‹¬šÍ<*­ Öð¯±ó+#zŠ-èñèé?Aœ}Â^ÊçìÛ9 iqo> ÝŸËã |…eXÐäè_@ ¬ðnrá6Ú0+,=Jš©ólý,™޼F{v)‘‘u»±â¡Î›ŸÀt¨ù ÈuŸ8^ V• +øî«Í\"0që!,sdåz†Ÿy€Ðy9¾"™=3Ó‡¾¡Eþgî Å„)Uäw¾Ohšk`öýò I½ýF¹Ñù^ü4÷ ”Çòú=…La&æûDd_}Ž`1àí÷ ŒKÑhè‹©_¨ø:„ ¤¼6ìˆ>¡ù^B7¡–ÆÏdÌs –ÁÍÉJn!úe¹‡æÝzö>ß QîíçháàÔ¿Èü»Ð/'¾ìî{4"ŽJ­gñ²Ÿ½'HHb‹'ï¾|Poôj·Õ±å{„n5¬¸NO~W`ä¨çþ[$<® ‚&øp#³š¢%-—Ÿ ­õ Ë÷ä‹ïÈÃ=fHz«¿„G%næÆ–ÄWÓ#Y=>I=Nüv¿Èåܘ.~l;zK¿AüÃ’ùñì*ùEÔÇän ŠëKYQr^TGXêjQêZWvCPRWhÚ²Ûò‘f>aE~¢¢gò{ 2­54±>>»3Yº . AAéA™KÜ#ë#‹Öž{‰xGÖ 3;ü"J¡UpÛ„$”Ed–cßSAb!Øïarexj Ú Q™W}„#™%Õî?œä¢ÆŒj,²Ji ˆo‘¶  jø™Ý(â€'é–Oîâå¬àç¬ÄE»êôÁy+1B¤«0„ù«q •­ù¢‚µa…ë0‹ÖãQ¼—È’?0¢J7Ñe›¾OLùf\b+¶`ÄUnâ«¶ýEõ–ï“P³H¬ÝöIuÛäúß'¥a'Fjã. ­i÷ß$½yѲ#³u.Yóöã"n;ð ö‰Ûö’ö}@öüý_ÓqÈ]pðûäuÂEºð0Fþ¢#€lqïÿJþ’Àlé `Y/Fa×Q\Š–÷áR¼¢£¤{(íü>e+‡0ÊW*Vc”¯Á§bí.•kþ¢jí(P½nì jÖj7œÀ¨Cûõ6žøLý&”†Í'Æ-§þ&M[OÍÛÎ|AËö³@ëŽs“y;Ïm».`ÌvŸÚöœÚ÷^ÀÀ’Ÿsæï»øû/ \þ›t¼,råðÍEòÎ`ñ¡{À’Ã÷¿`é´ÏYïC ,ù9§ëè#ŒÏ°¤¼óÿñоGÝ}÷ºûî vàþŠûÝC÷zלּ¾iøÚ¶c I‘ÃÇú._>~hïê[öíîº~®ïÔ±ýÀÕ³ƒC‡·9xvôÐà¡­é®öfȧg'‡öãn^¹rjðÒðÑ;§‡Îöo=ydݹá¿*(œ=±ÿܹ±\Y‘³÷žC'öE>!'GúÏî;?²çôÀÞ“{\’¿)(<¼töLÿþ3;/Œî<;²¿4»ØÕÚ¿w÷µ¾ƒè‹:|âøP§Žï;J¿:ªØƒøgN´XiÉœoîi¡L5eÕeEÉTPèRsËT°ì0ç9(èëÌNÒà¿–Ëû fÌñþ7T,iÏp…¬×ònaì‰|ù>¢Apxð}Ž+ëZ=~‡öb©9ÍÖ£‚ò|øQµ`ßûÏpÙ³OeS/Ø÷ê3„`ïûãT}¨äÜ=DÏ6 ôù½à)úucÕ, §jÇÎ4aÝø€>mgy(„ò”´â”ôEåÃx&ëSUI‚éºñ³´åúŸflÅ}!ïL†:çø¢âí1b㙥l4~.c®Y<=§éé;Äbc féSçš:>“‹C[5c;PÚ/ä§Œ à_•(Ñi¡Ú”`l ¿Š%×Ì%þ>œ”w.!ÀÀ&ؘ"¸û föLc[W,ü!X ž~@ëѲð0°õºñ­M‹<]+ÄÂ¥R—X¦n^¨n%µt¯¢Xß®XÏVfd®cMÇT–!)DÃDD¤%=cÕlèSŒu³ÍDôÉÖîa³õ±ÂXé[û™9¢¯?ÎßCÈôHÐÀº$_l+Ñ5„è*À|]Ó#( œ‹Kªÿ/=FóïÊê­—ˆ•+úFü«Ï?Ýÿ€ÐÈnl»bºD*3‰èƒ…—G‹$÷$z™ÕDô®³òª°gÕØúiÙ„ùG–>•ïHtñ…/ÂÇGÆôNx%¿IL©|¦ מ™dë™z¤#¤’ä™GdH¡î!mNœf «Ñ̽ŒèSCö«¢p*‰Ìlj@6V'œïÜûùR`¤ùFqbr 4ƒ»‹ WøÞ;„_HfDÜzƒ@Ðê”Me¥qª!2òÎòÍ¢sb±¯á£Ö› Ÿ)ÝyOþs? ²V”ÄàÇaß 'Õ“ŸûSy÷øÍ×è^¨  š6ý©\ü»FûEdºóÎ?ú›|Eéì°ôGòÏÈ›Ÿ·:Ü'èîŸ*+‰YȈ,p “]xƒ8„H½ê8Éåp¹ž½ù+{ô¹ûîÓ3yw÷ƒOÈùGV”c­ Šò%ïáèO?ÅV1#J°qøþq«mý;©‚Vz-¬‚—º”²ÜWØþT~ÑBc¤/åß,Ï Tav£r¢ó£²Ð ðµõ ÃÕÀÎr|¢DYÍžqÍžIK¼â—yE-å%®eEtr"›žÉïÛòÆ€ï”ʼnkåÆwû‰ Úï¼DÿÝʼn×xòš‚zâs·y [AÿC|÷!n‹Êjƒx îŸÈ´–ˆÔfwŽä–|°"+¶“ÒÎÍ\”ÓÅ—,;ó7n Îl‹·ßJý¸ìVDñÚs$>¯îɧ¿bIôn”W˜^Ðþâ³óà”á›.Ê̤<Å‘y ¼#*ƒR;K7ò³º‚²VðÅÝ þy’卸Ï] åvãÂÏëù+´#8¿#D¶aÁªïZ¸CT´#¬x-.á%ëp‰(]Y¶ˆ*ÿãûDWlÄ%¦rFlÕf ®zË_Ôlú>ñµ›„º-_X¿HjØö}’·c¤4íR›wþMÒZvé­»12æíÁ%³m/.Yíû¾lÚ ˆçï${¿ {Á> §sÿ÷É]x—¼E1¤‹˜¶ÿKJåä/;Ⱥc,?‚KáŠ^\Šºb÷ô%+û1J¿AÙªŒòÕƒ@Åš! üÛT¬=†Kå¨Z7 T¯ù‚š £@ícÿaäûÔmê7}¦n3Jý–ã@ÃÖ“Æm'¦í§¾ yÇi eçŒÖÿ óvžÚväÊÿ FÛž³@ûÞsXòsÎü}ç¿ cÿ`Á‹“΃—€…‡.Á¢ÃW€ÅG®Ê¹þÿƒþ_Ùw  ú¿{èöÊ¡ëËöî:q þ9ë¿telàÈú;—Þ¹tøØ‘íCGöœë¿|fdøè¾C‡¯ž»rv´0'fOD>½ºprèÒéá+(\Xš]êbØ»ëFß«CCÃc§ŽžCÞ|¼ÛôÔ¡ ¿ëe(V)¨KÆk§ü®bleü;“ù³]«ª]úmÕ˜´jzæê(̪×b»NÒ2šnd¦6eŠ×3ù£v²ªÇM÷koßóRC•ñá*´&(»NžKWÖõÒ&øéYø>x>UôœŸ½C©ºf,UC_ì)Í/à–ô$HÚû¦ÚxÆpbаNl/^-]çÆ©¶eˆ½‘ÅØ,¦£2#‚bŠ¡Í×#Á±ÍL^¡{`ö…è‚âª|R|„^)؇ò¸žÁÏß? ­äÚ3„SΠχ>{x¦p"‹žýgœ´Š!*cFÕ9‡”A ëÓH ®ô©¹ÿyÿ áðd¯åá0QÆmÍYiç•r_@E'Ìcs‹ßD# ?a ¦ÿ! ö _,>âÓɈoòˆ® LYêº2 bñ¹VŽÌyú½ÛüŒ ¸bìæôËåÇ—<–Ÿodf·+¨ñ‡ò€ÔS˜ç›Úá=ß-j±_Òêô-¬¨%þ¡õw^¡«(„Å?—Ÿ;¦,R¼Â;t?i¥wzŽpÿÅ6%¬÷6%tò“æó“[n½COœŸRœ\Œ Ö&Wø‹ ÐïÈ„—ÜžÓå^jÜ5ª1 }ñåO7c›¨„ŸÜ„^‚¬Œ’Ewåo+àÚb/’s»øÑõɒűéóØ¡ù/äß”¨´¢—òw‹É…­a’†ÛïÑ -íŽÌYåÙ’±ŽŸ±.(c?s/ë^Özžd=O>ÿ——ó.A¹¿lúƒŸ·C Ý„œ¿—Ù–ï ,ØŠZ¸ CT´—°â¸„—ìĈ(ÝD–íþ>Qå{p‰®Ø‹S¹ˆ­Úÿö~Ÿ¸ê}@|Íþ/H¨=$Öü>Iõ‡0’)Gþ&©M½@ZóQŒô–>\2ZûqÉœ7€O[FV{? ž?ð’ŽA {ÁÐ÷Éé<†KîÂaŒ¼E#€tñèwÈ]2œ»äFÞÒa@ºl#¿kÙò1\ VÇ(ì>õœÄ(鯧ŒR¶ò4P¾êÌgJWãP¶æ,.«ÿ¢rÍ9 jíù/¨^w¨Yñ/6œÿ>µ\ê6^jþ‹ÚM—€ºÍ—ÿ&õ[® [¯~Aã¶k@Óöë-ÿ­;nóvÞü-àߺû0oÏM ,ù9§mï­/À–÷Ÿ¿ÿÎßä[Ëþ£S}ÝG§úÊÁ’ŸsÐ ¿ÿ'èTß^tz/–üœƒNõ•ó¹–Ħý.ï{ÚÝû|eïstPßË}/—¼Z>ø¼gàIס«ÛFîÀìýý£ƒÇ®^<±ëåWN ž?}âìésgNݵc÷½;÷‡Ž öe%ån®îÞ}ûAá_#ÇF»zúò™Á‘Ë'FÆúwŸÙ7î'…㧆GΜÏ5’C¶¼µóÐõ·Ÿ‘‘3'džNŽ<:qÒ/ ÿR8q¢ÿÄñá¦Lüehèàñ‡FÇús¥56vÁ»÷=ÜsäÞÑ3GÎ^è=’åÖÀØðá+¿i§þ U>nvÎD ‰‚fì/³8žÓ‚Ëô£Êµ]‚&h8Ì¢fš5ŠºBEí@Ã,öö;´lŠ>MÙ4h–AâlÝįm“MB€¾UÐU×gh~&QTMùм¹æ¡sLE !g tlT "}R´–y¨®e(<^ŸCcŒütlLj,RÒö‡–?|ÌP蘥è[g¨ZÆM3V'Æ£jkæ”­nuïlãÐQ:ï C†¡¥ï‹÷èÈgm Ö•ªjÊз x(︛k.P·LÒ!Ë”rìëáLU‰¹Z”\uë ÛtEBšm‹Že¦EŠ)5“.†V©Vv%:fIÆTt‘Ÿ+¯­VÑíá´vÏÓ0Ô#ÇiYFas1Œìâ‰&öIj2䃀„LUB˜ =Ç‚štWÞŸib €I LíbÀ É"8ˆdrhx’KŠ)ÜÈ:6Ý|Ž˜PÂ09DvM€ˆ­ê#œx’›Ìˆ˜&×óˆ­Kœ•ˆê™cDI¶¢ÉHîe>"¦N…drS‡]Rìòä=bãëèeãäõò=òöâ䂎~umëæšn!GÏr’‹ø|ä6‘©GI"3òÿZ2ÈC¬ï”må[`˭ѧ•Zx×ÅDÿ¼[ò¸ÌÚ-ßÁ½ÚÁ­Ì…YDõLÁT;y'Qr÷¡ù¥£/)>"îl±•Sø#ù  /^ž-#ËңȔQEa7‘ýjlYÕî9f®iØK"s>Câèö§\’¹1á‡këÄ;±²-èñ®\´cöÆĉSfÏ.¥²Ë-….‚&¢O•Ûhɬ °ŒÝòéa-L …•MB§‹^}Œøð3}Y÷^ ²ÖÑ;Ö•ìž‹M)¥úÄcÛÆ=™),Gçt@hÆ)uã–=FClïÐ _a™=3ùöK´˜'§Î‘Qé#hµR™hìîÎÉòæ=“¿¶ó*€ïÈs(Øe N¹¿°ÿ ñUù +¼Åü¸f×éSy4Á «vçFÖ]”Çž\ƒ-»¢?µ=2{ÑSùø·øìNNdÖïžÒ÷áí?‘4éQBGbfWT•‘¿ {1–T†½Ž Œ/ ÏéÀ‚bÿØÖŒª=‚ôUAék±ŸæenáemB‘läI6p³7pr6æâÀÉÛüm6r¥[¸ÒM`yù›yù[Áɶɶ|mù[¿ƒ pFpÑvŒâ¸KvâZº CT¶+ßó}Â+öâQ¹#²j?U}à?ìÿ>Ñ5€˜Úƒ_[wˆ«?ü}âŽ`$4ö‰MGÿ&IÍ}@rK?FJë.©óqIk§}#}þ Ñ1ô™ ŽYÃßG¼pÉ¢QŒìÅc@Î’ãÿ£’¥£`³—å.Ëé:ž·ì8Xi׉Üå'¾¶ùËOæ­8þµ•­8%í>6¿çdA÷iÙÊS…=g {NuŸ)³Å=g‹Wž[²êLÉÊsèÊ?«ÎË—ú9_‚gK×\(E—ýùÒ~^¨|íy bÝ…/¨\¨Úp £ò‹ß§jã% zÓåÏTnFmÕ–+5›¯To½Z»åêß±5Û®Õm½V»ýzý¶ëÿmëvÜhØ~£~çÍÆ(MÛÿšwܰ•ä‹ÿÜÄhÙ} hÝsK~Ι·÷Î´í» ´ï¿÷7™à>ÐqðÁ,8ô@Wþ‘³àð݇ï K¹‹.Ô Üÿo»èè}tÁŸ¾èâ?}Àÿïœ%ýÑÅúb[?çÈ×ü|¼¬ÿq·\ü¯è}Ù}ôÕŠ¾WË^/xÑ3ðtUÿÝ5‡/?üˆ Ÿ½64:â|òx…qèx|øû øù§_†GO?söÌűÑSùÒ"š‹ûÛ7‡‡$l膭N_:´çÀõKçGž;3øÃ Ã'FŽ<ŸQÐ@v Þ~èÚÎCWAÿ¹06vbtl”?0ròØÑ¡#GFNœÄrŽ81,ί#RùÛÞÞÙwkïèùCçN_|ÿòeßé3›oLÔOž07Kmn¢¢R¸‚jˆ²r`ò¿Ýëp]&ëgé:ý¨ÑbÐ3›´a&¹s­DÍ#R›î®êl1‹®6Ýõ•¼£XÉ Haª<þî¼E¦kø+jrAÈAðä-rû*žAx_Œ>§5\!ùôƒ|2ìG"%uÃàÙz!S´Ã§&Í2IQPäÌ5O§íýOÈTm!ÄÞ$õй„”ÉšQ(&kš¥NTb« Õ ÁPHGP÷þDõáLu.šü„ŽF-Çš«t¶Fª^¨‘Uâ •€‡/#«xØdØgïÑ¡øª†Q ´ §çhGšÙJÔ ¢f©qÑI»5ƒ hðSùyAùG¯ódB²ºA‚¦iºªyúTƒXm›œúÑ”\“xrÆÝÈÓ·ˆ‘E HÙ—o‘7ïPAûì)bFR¢•Ì·> Øú™çž¡f›FªY¥«Y‰Õ,sT,óT,óåäARÍ$ƒ`[¤K™Z—sÖéèóhWù³·ÈçÉ9ëñ´×ÝÙ¯bºVÈ­7Á%O“œ¢IN2§K¯½B¾¶M ‰Q¤AJÔ²NÆ0œinêœcHN X'bgŠA°Ž7&Å“¢±9ËÚ¦Á–Ôxp¾A½A¯3:Ý•– 1°¥‰ÍlÑÝ¡Ud§,ŠkÄ;^ Í#9äXڥÎð¹C;¡Ì½—Å-ר&> ª„æ[cj“@a@Ó(ÌÑ=ÛÚ)æåG®Ù!bÀ˜D÷Ï… eÌì’¬]Ó°¹º×£Q Èž пbÇ,‡4P×·KF¹™GɧôÆ;ôL-è…ö>õ&R÷B;w Ú¤ˆ½{&ðÙ{õ‚%o>A¼yå4)Ù5ƒÄ( û–YûA…2³ÐŠ!µñ)À. µ·˜â—Cñ“Üy‡*@‚SÂ}ùÇêÄ©p©·p϶ó/táU\{`#Ä€Ó~¥kh-%°ØIPIö—ÙSyd)MPaᑎ…3v>b—À|l¦ª3WFff€E5ðGÄ[ A1|âœN8€§‚PúV‘Op+«¶ú…V?|‡`±ö½ðä?xƒú ŽÌƒ-E§W‚X£4@Xsë©üÄŸ!EìˆúÇòiOå"ùÉ'Ä‹_†MW÷ä•8úäŶ<•O’>‚2¨¢'·û\î¿ÅÛWD6²£šNÝAX‘Í~á.ìb~B;¿E¼K‚Âàkò\c>~¾m Oé¼úÍ Žlöᔾ”ÿ¯ð‰h Lê<ùÕÿ‰]´6—˜±íž‘-)K]ù-n!MØâ]ñóîDGàðãhðß¾0©õú3ùÛ÷¨ Œ¬á'Í HîôŽë`§v¹7pR—» ™‘­PáOˆ0k±#§@$Yvõ|ôQÌRÿèNlò/Ôpé!’ۜІ½L&µ‰RÚ°‹†!Jm Mj~&H ÄÈ> w_#ܸ¦äØ,'ª1.{¹ ¶õê#ôÄY!Õ¢øNìÿLt겄¬ž ·ÑÏå¾|"Ìù;Hšl)œ†$ úÿökôn+sö[ºŽ—±˜•´ ¹j§_âB¾xJÖ ž…+Y˜·.àŸÀ–®gç¯ýÚr 6r 7|m9kqá­ÇEPº—ò͸+¶àZ¹—°šm¸„×nÇ%²~'.Q »p‰iÚóˆmÞ‹K|ë~\æÀ%yþáÿ+¤.èýGd,êÇ%sñ.YKq/Â%»kH²Çæ®ÎéþÚJ{FóVâXÙªãù«G¿°²U£«O¬ûÚ­=U´öÄ×¶xÝiù{}iK7œ-Ýpúk[¾ñ,.eœÁaã©Ê-gp©ÚzØT±õÌ×¶zÛ¹ªíç¾¶µ;.Ôì¼ð7-P¿ë. »/ãò­òM{¯b4ï»´ì¿þ}ZÜÀ¥íЭÂù½À5°G¯w½ vAß­}7:ûowößĵ n-¸vÑàÝEƒ·1»xèÞâ¡;_Ø¥ƒ÷ºûöô=îîGY1€q¿gàÖ†‘›+öÀõ37nî?tòdßO?` ó !º*ÏO džúNž9{æÄØèPUe)™d ïÏŸ;52<fΘ‚•ÿËO?þ„zØ|Þ¡þã§ÏdåÊœé>GúOmÙqäÝäüùëCÇŽŸ={B€Ñ±Á‘ãrƆGÆFÉ9Ø×{òÜÅâªÑõàÀ¥Þ‘«[öŸ¾xiè òéõ±Û7¶_z:^'r‚b¬Îœ-õðñ& ºzÑå*ÁÕÊÞD]Wu]G÷”|½€èŸ-3¦:f©ûDªûxÌp7›â¬3‹©©ÅŸªÊžeñ“JàÊl%óÄÙ„¸ßTÐ…='©±5Ì#¦i²fé±'ªzþkš½²qÀ,}ß_”ïÉ׸V6âèYGÍÖçMQgM×LÒ¨ù«†HÉ<õ7ͰIº¿k„*›%(âU §ÌÑ$¥NT竚'Ì!ÄÎ2Ÿ®-бJœ©K•œbâZ8Í(b!Žè]®a“©IÉ 9F.2Ø ¾¥W© 1ÕÔUfd—aJÃiê-ËhS‡tc»dGßâëÏ‘ó÷'¿"SGtF3Õ'×Â9 ÓXuê¦qÖnEp ö’¹FQÞ•9C+Ä”šíèSW˜âYªGJ5sÈÒ%E[¹¦é6žh¤‰} ˆvK±¥s6|LvŒ2;1Tâè]mB‘@=ö^¥zäx×€ju³Sj&- ‚HËÕ!ÆX'Û3 mR( ųЈ’LcUéèسKÍÜ%ŽÜ *»\š*]×>U×>ì]¢iJ´;çZ{WØúVYy‘Ýó‰®ÙP§µ{žµÛÿø¶>ÅP§³]G´cÙ2dÎÜJcZÉ;ÏÊ+‡@Ï ° é!5Df.86~2 O‰%#$½µo>óë°¨2pX{—9Kaó,=óiüZh!ÙGæZçZcâšjÅ̲cçÜ’=Ãk8¥D¦Ô…_íTåÚ`á™Ca;ñ*M\3Ù‰ i(Ÿ ÕèY>ÑmP ´Ç…ƒÃ­·è5v¾ETÿNüBpX¥®¼jGÿ"wn%Õ[æÊ.sô- ˆhõ ªß…UÂà×@à`ã‘ãÚÈ o±ó’òâÀ.°£T»­wÔã.¨ õC…¡Ýd†T²ŒÆ­bŠš¡Œc@™»Ü_ >8PJz‡µ€õ8V@8åÁa=C\ƒ*XÅÁ‰‹  `ƒâÐJCS–ú‰š8ÑíöÌ|~|g`T4 |ÈgG·$tØsKA¥û'v(ÃB²»¹éKhÂFT³§„—±r‚ÊÙ) !ž ÉZÎK^äÕ %/ ú/_˜ÑÅ kdÅ´E欇ί¤.q© Hhw®ð‰kå¦/b%Íæ¬æôÐEu>qó^F—{x6—–èS*YÉMZ&îæ$,ˆÍ_õ8²KR˶òSs;bÛyI Á~v¸‰ü¤vüÁÉm19Ëxq­ Ò•q¹=÷ß#¼¸vaÊ"aònÌ|^lGXÚŠhñꈌ•ü¸¥áiküEí¬°ùñ¹„ÉËXM)…ë q寢ð¬¶èœfhÁcyŸ?_¼˜—µ,ªxƒo¤Ç/±3,½0w@²E¼VÎz žd}Pþ&Žì¯AÕ;¼ÂM¸ð‹·à"(Ý,ð_Úò­rÿ¥ *ÞT¼ákû­z‚˶—múÚ~«~4 ¨Úò5¢ê­¸üߊ¾¥óãZöáò-ŸØv—oéù”Ž#ÿˆ´Î£ÿˆÿïõÿ0.9ËGp‘oúˆpèyt€ƒ<:À¡pÍI\þ#|‰< À¡ô“¥àX Ê6žüÚ–o:]¾éÔ×¶fû…šíç¿¶u;/Õí¼ø÷mÃî+raÿ¥mÙC.Ôÿ®m=pÔ»ü7oÊÉûåß[í‡ï´¾ýµ•ÿªï¯í‚£÷½÷÷mgß]Œ…ý÷0 Ü>À¥£÷6°à茯wÿo÷ß[~ôáŠÞ‡`ùÒ@÷—÷Ý]Ñw³§÷òÞ³÷ž ÈöÞþ±óg.]=××»óÊ…Ñ gÇ.œ=qþÌñ=;·<¸{cdèèð`/+Iwq¤ È»³§FÏë;²ÿèá}PòÄÉáþ¡CƒC½§Ï;>´gßÎÇ9Ú[VVfB0ë;:tløò 9xp ¿ot`pddtpx¬oxletphìØ ÊHïðèÁcåµú椽G‡w88xräÜõ+Ã{?þyçð±c7~ÔäOÐIž;7bò,‚vü¯êQaº N?Ñ”4ù *,-e¾ù Žéï^fS|L9zs‚UTEÓÔ@«Çþ¤•ð£~ºÂì°q&9“¬d 3D ÊÑŠ„œñj‘¿h P ˜B¯Ã™`ÈÓtJþE軥_ú€Ü@–a *>ãux3-cæúOÐ ÖqÌü]‡?^=PÙ2v¶E䊌٦á4U‰ÑŠ&Âg{`Ý­·? ½pWÞ¡#¯!ÈBÄTÓÈŸ48úô<¨gœv"1þ]Á›d°°uºy´)išiül«t-‡üéf “c¦™ÆN3žf5É(|*!Jan º}öTBÜd£8MªtY2Õ8Yߥl–Eêt³¸‰†a¿é 4R§™‡ª;$©SS¦™EL4©RÄJÄŒ º±¿êÆM ¤ül¯ì(›a›=Å*M“V¨DN¯ò»®ÐÀ9犼ûÝÔU¬hbLMQ·ŠR±ŠÑqH›¬¢f4—˜"|¢N8^¦b%V±’Èùü @Ö˜V3ËŒ[rêÂŒm€ìÔv ·È#¶Ã=vÑר71“º¼—ù¤¬p‰˜ïµ€Ÿ·Ñ-ºý6ò×,{°ç_!×>"—Þ"¼ÌFt0w™w\£[x•_b+;u>(í€Ô…öÁuÞÉËÃÛ¡¶àüÍ~i=à@ý¾©Ý¡…Û fÿô•8ôK]î“´Ð/e‘G̼ ìZx=²E$Ûxé=â›´Œ“¹ .B`Æê°‚m~IÝ®aAâé‚s¶¤®ñŽ_$ÞÀÏÞ%½ù¥,‘®‰,ùƒ•ÞÉË^_½éÄŸÈÅ?{wÂ2ߤåÁ9›Â vp2Ör2Ö‡J·s2þ@Ißô_lËÎć#Þ‚ W²— œíxlämäáØ`éŽ`鶯­¨p¨p××6¼x_xñž¯mDÉþˆ’½_Û¨²ƒQeû¿¶1•øÄVøGÄUÄ%¡ö0.Iõ½¸$7Å%µ©—´æ\Ò[qÉœwì!nÁE2—ìŽ1\rÇ%oáI\¤‹Ná’¿ø4.²%gð8]²â.¥Ýqù溫¯âR³î.Õk¯ãqµvýõÀ†« ›n4lºöµmÜ|³qóõ¯mÓ–[M[n|m¡ªÚ —¿¶õ¯×o¼úµýÖq¿UóÖÛÍ[o~m[¶ÝiÙvë[¶uûÝÖí·ÁÎÛqG¾Lèù¢ w¿¶òeBï}måË„>øÚÊ}ˆgû ÷?úËŽ<ÇèêýcùÑß¡»ïeÏQtð6þgEßËî¾?{úž-Ý{có±‡W_ yÕ‹rKS2¤‰Ié¥Åe’ŒtIzJ‰,¯ª´('3M–#®)/©.+®(.ðóòxñäaFrB]eYCuEi´¤@ZW[™/ËΗf—WKÄéÕÕ•¹Ù9YYin¾£íì©‹›7íB>"%EµÅÕ…e²’ü¼²\9R9ù¹e¹eEeµÒò²D±„ìâÒ;vb{ïÑás—Ï]¼}r?òöÞñ¾¾±ëãô7K˜­.œ¬,P0Hú—f¬“q²Æ¯FÉ?ê'Ï0Ìš®¯¤3CMô»JØ͘ ©¿gý`˜¥ ›þ£™ôB®‚vŠ‚VÒïÆâ)†™¿©Çÿ¢9É8AAM0Ù4î'-’MšÂd×ߌB3 QPfþnö/Mîd³¨)fñ¿D((sT(âIúáuDµ„StC'ëgb¢&k› NL˜m>×4ú_3¼Ô,âfˆf†ƒ&ÿ·Nˆ‚¢¯6M:Á(BÝ1[AÉô«AØ4‹øŸµƒ3 Ÿmú‹¾hºeÂ8]‘’µdŠi²ÂlîŠäß:as(YãõBU©â)f±*öYœjž4Á(FÅ.o’IÒÃøiæãtb&'L6M€ U2”l§[Eÿj<“;“/?¨t1sQ¢îT2•,ù˜9Ó>WÑAúo£¸ ¦‰®…*Ž9znSÍbõhyãuøÊÄ„ßõ øçXÅ©“’§é‡8d›¸ÈT,R•M“  ”©Zä<9ùZä-R‘êE“ŒR§[dª;€ŠÎŸj–ªéT8Í"ÙˆQ¦æ Q$§hÑr I†Œ‚Ù6 3ˆ1ZÎ÷St¢4HbubÖ ƒ8ªŒàR¢KÉSµÌ°fÖ©X¤Ã&¢g5äèÛçÓ‹ Ü gX%¼Ëá*Ù¦|Jgãõ=òÕ²ôÜsÕÓÕ2¬y5š´ C¯´ CJÈ«íR ×GÝA…a çLCZ¡1³h®}º†³#|p¶AÍj9Ny–¬:mšLß½ØÜ¯FÝ1×* ~®ØÌ·Z‘œ¦K/4ö*‡bšÎR8q{ ”'sš”m3-ý+­|ò M\ÒÜ‚kÌè™Z:5 Tƒcä”Nñ+Ö²N${Úx;TZyX0Šu]ó-ükhðÙ'xWÂqõÜŠC`¾–K¾¾[¾•·Ì™[®gŸ kOòÊ%3óø©Kà@ì w±c`)äÐÕž¡õFN)ÂFçÀfŠwƒ¥[™½_ƒ½˜âSCõ¯õn·÷¯öΠ=¶>%d¦ pâT:²kHŒ‡€Z§ÀzFè|n#ßIïr6gNƒ_à%ê€L×yÄÀjû°y€§øì“øõàPÃÛÀêy؉ZÍØ•íÖrÑÊœ¹ÀÀ³€Ì­sŸoP9ö!- 2Þa+ªØã–Xpê(¡PÉ|çèE$~X‡ˆv¢vÌ¡Ç/³nqŒì¤†w¶ÂyPÆ5n)8Æ~î‰Ëa1¨v‡­.1‹aGfÚ*È$ šawp\䱚aÄMxÆ/Zù쬵Ð(9Þ‰]ŒÈyœä…~±m4AÙGÊN\1Ot«#·Œ›²2ÃsWyE4yGµ$t„ä¬öˆ[ì–° Ç/>û\é&[a 3­Ç!b¾gòr~ÁV² ‘™´Ôš]˜ÜîR˜ÔÁO_”¶(±t#5°*L꤇ÔpS–ðÓ»|¢Û‚Ò–yFÍñ˜û‡_ÖZì"¯Ôn¤.çèNNÞFìX>«|3WàÈ»˜‘¼8X¶Î3¡S¿ž—»†•ÑãÑ&þÁ‘¬óŒ_' À¥ðIéÊv0»½Vp%Cò·û¥­„ B aÁÖàüÂÂNá¬ÌeÌäÎñRÏÄ6nn—°`Mhþ&QÞfVb77mo\Wˆd#'u-7mÝ_+öKv|ApÖ6\B³wâ"ÊÙ…KXînòv~^Øÿ ¾µÎÿÿëõÿ¿àëÿï‹/Å'¡l?.‰åpIª8ˆKrå!\Rªã’Z}—Œº>\2ëûqÉjÀEÒ4ôø¼þÿ`Ëþÿ}¾õ»Ÿ×ÿÿì羦¨ó4.Å ÏàRØy—¢…§p)]r—²¥çp©\~ñQµâ.ÕÝq©[} —ú5—qiX{—ö-wp™¿õ..ÛîáÒ¹ãÁ?bá·ßaÑ®G‹w?ÆXº÷).Ëö=Ã¥kÿs\V|Ëò®8ø£ûПŸé9ü—/¶®<òòû¬êÅxÕ#€”?·Œ½íÚ}â“¢iáejëkO ôe…™Y9º2xÖŽLÀ…Á5%Ól}ÉÅÂÖÍÐÂÅ$ønI´w7µq1§Ò­œº–vNLž!‰æê'$9ûÛ¹ñz6ݼ{ˆ%5ÀÊM¡s‰DGÚ £8¸[:zŒIÎ.Lž³w펣ëvö½zpøò©Ã÷î<1rìÂÏúž ZÞçx©è‡ŒÓ W˜Ë›¥Á™¢ä;A;z¼Aº‚fÊ¿ô’@Ì× Ñûoý0µ`…¹|-Ñφ± *à Æk…ý®ú› g²*GY‡¯¨+š ©h•óƒŠhœVäÏá¿êE+ÓÇi‡M5MœlF3Ùã´¢§Ò ˜‚R¸Š¥ìgŨYzbmbñdõ¤ñ³£fëgÍÐNU7“þ¦­¬—9A)BÓ,wŠj¬ª±øå°¹DÉ4³Jîê¡¿ÆÍ´L~Ó™a‘¦l-QµË§¡åT8Ñ(~ªi2äü¬9×F:Ó"KÑ* ’“ŒãT(ÙãuD“MbT™a‘2Á vŽuÎt³´Õ•Hy*¶ãµãtœË4  ðL«ÄI&SL#çØ¦(’§[ÄÃéL7OMÌža.žlœ6Û&o6E:Á8y:DÖ¦™§ÂÉÎ&eü¦9›˜jL/T²LR³É0¤É¦èGh’2µH]›ÜßÕDÚäÜÙFÉZ¤\ «lu‹9yrò1Ô,ò5l =jáô]ËÕìòui%pô¹¶’™–©slij¬RthÒiæqjT±ºƒD•’9Ç,•àTJö¬Ó§È4‰Ù€†•Ä’^¥k#U·ëXçÁA•MRUÍ3!GÛ&OÍZ¢í\ á Õ§—¹ÚÎùsm³ôéEslÓ!:€+ G—zÌ¥¤Í"&(Y'¹„µÏ¥¤‚cäY‡¶K¶®k®5ï\ÓI¬Gσ­æ¾e°ÉÜ·|†e‚™O…²Mš‘G©žk¡¡{4Û„QiäQ®K+kàV Ÿˆ:5C÷+V¥†Sš6-Ó* TÝ1ÕÐ3×Ô§ÀØKªç&ÑqÍ2a‚z/6ðÈÑwÏ_ß%GÛZLñj¤ú´XÒ* )&ÔbG¿6ßyNþí–´*;f«-£Y—,ká\Kñn¶aÕzJR`%ðÙ'²+Œ½dFŒ| ¿Î* Ü¿’Nü#j³Ð–ÑHc/p è ÒkômdvÌfj‰¯¨al_ Ç‚|€êÓ G×%Km žü%6žõÇ"{Ÿz¢[¹™sƒ­-³‚ìYâȪe„´»r›HÅŒàN¬f¿F°:d±s@‹™s$a/ªo…YKç¶CÒ‚Vbã]Kå·AxØ Ú€Ï>X,,¢†Ì÷ˆ]n¬pvX±«­¹•ÔZ‚·”Õ Ž[ô<2§Œ™ØIáW™ûX;†ÖÛרU:ëH¥NáÍÖAU®Ñmd^¥Ž›¬OêR~µ½°žÈ)wŽhqë€2€U`c&/†òñ `“WÒ"·Â-v>ø`Úè1í.‘­Ç.¤ŠÁÑ=bÛñЯ„Ðh$D î1mÐϸùe Ÿ ú9t©+w!3tE`ìzÏàeœ¸ þ‘«Á ’·¸-vfw°¢ÖÀ&Ÿ°(Fãu¸EÎ÷NY¸F·Ÿ}fòB¯¤NjhgB‡Æ2ÐÒô˜yܬÕìøž˜Ü½Üøu¾á=¬¨Õ.‚%‘’½P§·¨;8ek”ä+r+g±h?e#+uìè›¶jØâŒÄPy ¤Û-¶ ’°’’®QÁù=ôè&¯ÄvÿôEÜìnVÆRïäN8Y¡l}hÁÿ´¥ìÌn~îZŽxe`V§Ñ’¿Ž#F ³³º|S;ƒóWq³—…—¬ãå.åK»Øâ…|é2®d±wì¼°œÕ‚ŒåQ_¤,K)ß‘»N$Y-Hï‘³ê¿ N[%ÊXŽGdÖz\¢Äp‰–üKlΦ؜?¾&.w#.ñy›pInÆ%1 .ÉÛ¾Á\R ·â’^²—ŒÒ¸d–íÂ%»j.9Õûq‘ÖÂ%¿þ0.²†#¸6ýG5÷áRÒ:€Ké¼A\ÊÚ†p©˜?ŒKeÇ.U Fq©]t—º%øÔ/=‰KÓò3ÿˆ–îs¸Ì[y—¶Uçqi_}—޵—pY°î2.ë¯àò­ú篹ˆË·Žû­úo¼ŽË’M7pYºù&°lË-Œ®­·1–o»ƒËŠíwqéÞq—•»àù÷Ví¾±zÏŒ5{~ö¿”ÁX»ïÑ·X½ÿÁêƒV¾·êЃžÃ»QàoxÒ³ÿæöc·õÞèÚÐ7|ú^×ÊÝGÆît¸ÖuôQÏà³ÿ¶kG_­?þfÉ·í»¯¯y¹¼ï1¶)d®{¾ñÜ»®Á‡+Gþ\süÕº“o÷>X>ø|ùÀ‹î¡W[Î# =YtøÙºÈÒÞW‹öÞßÜûxç¡û_ñð@ßómÙ}wö½ÇÞì ¶ôÃå±ýÈû'·úl9 Jeýlâñël›Ù*.J†¿ª{þ¦á¤hä=M-`–~„ãL"~3 œdì?Ù8`’k¢>ÀžfÈiÌU6š®í;UÕ}†:]EÇCCÏMEÓqš2u²šï4à™!S´y?)zj’b&iLÓ œe(øy¶çL¾ºU´ªEô8eŸ)Z|EÈiš!SÔC¦© '(ªÅ(éEÌÑPÔNS Ò0‰5&¥«è…ÍÑ UÒ Ñ2‰Ñ2‹ž¢0Y›5×, ꜪÃQ"OÓå*ó•L„ ÓUÌÃÕ‰¿ªø(›†(BW÷‡ÃM× 2qJ§ì5]Ÿ£IŽP"ðçš Ô¬„&ΉÿVv3¥¥C«`Ç©:\mëø_Uü-èÙJ&¡P¿Žm´§d¨eªF€Ijü b´1N™ š¦ÏÓ§&Î1S48$:&ëØÅhÙFÍ2â’½²5­ÂTLƒ ícT-Cfèù›:'ªZ–sŒšá–.†¶‰*&¡&ö)ÚVÑrbþË8-«M«(‚KÚD –Š…h¶‰@Õ2LÛ&Jß>Žà’b✬b!4sMS6 2 ÆFöñzä›85ÓPb”µ{6š¬b9$ºX• $ºfA¦…s:Õ[› ˜©S*ÑS ÕêRbt)qª–¡„šá܉ž™êÄP+ ¨ßÌ5ÅÔ5ÉÖ7ÛÈ)F‡¦O¤øIÀšº&@ÒÒ#…@‹×³0£':FÃ&^®]¸¶m¸¥{º¥{¦)-ÕÆ;×È1™ÄÈ¡øÊôìbm}òµ¬#)¾R{Ñ‘]dNO×¶‰Ð¶™¹ÅZ1 Ã\ùT¶xŽE€…Gÿ}ÿæÏ~âç_ÿûÿßÏýÐû?÷O~ü7þÕþøG?ü¹ïû©?@j?üÁÏþ_?ùû?ðï?…@¤‰CþÀÏþáÿü§âãú/~5úÃü¹OýÀÏüÁ¿üÙÿð£úÌÿügþÍÇþìûêPÙŸøøú±|þŸÿÛßÿÁŸûô|ð³?ôOÿØGþ€ç_ø³ð|ÿOýÞ÷ýäïü«÷ê_üÌïüàûÿàG>ôáù¿?†¬?õ¯?øG?þ‘ÏýÈû?ýÓŸøËúÙOýèþèûÿÝïýÈûÿøÇ?ò§ þ<ŸøðŸÿùÏ?ùáà§>ò…]ñÓý‹]ñ3ûËŸùØvâßÿÂ_ìŠ~â‹»âC¿ú·»âÿö¥]ñ‘O~yOüúßîÄGãK»â~ë+»âã¿ýÕ]ñ‹¿óÊ®ø¥ßý»]ñË¿÷ê®øÕ?<·+~í?¼q |òSo¿þÏïŠßøô…]ñ[|iWüögFvÅï|vtWü¿ÿù‰]ñé/?ý…ÂþÝÏü•ð™¿*ïßýì_‹Ÿýka§û¹¿‘?÷7ÒN÷ó_”?ÿEqß®ü§«ìŠ?û’z ü—sÞcÁß vÅßž„/_¬¾r© |u¤öh¼2Z?^oîúk ÂëÙæ[â|¡s¡8M¸Xšy4.”;¤ö› Þ§^—§_Sf —¬…ׄæGÌ1¥Q²Úãeo¼`œ›0_f^µî¾nÞýóìÔoù/‹s]˜û²zãï´[ÿi²sκ÷™‹ÕKÁꥫ_Un¼fßùëòÌ+æÕÏGÿ9×úŠvõ¯J³üŠvó¿Wþ|bú/òó¹v÷“­¾¢ß{ÓÛ8o,^.•çGKó£åYrÇJ1&ÊW€KÙNN¸|~¬· -hÎ=G™ì.Ýi—•Žß:§x­+²Û ¼NàΨfMð#=jºb«aÞš”f…è–æÍ—ÕZ¾ä—¥Šeφþ‚mÎ(b½\ðñ˨)ŠãUÃq%M  ÝmœÚÔMÝR¬¦lÖFsš[))tàjN{dR·ÃYÅj«n[ Z%¿®V§Ä áM/¼6YºP”ýÎe³Þ)»Ákc“²y­i-¬]Ì•õ fGÝkªvC±kÈË©LçE^uÎ §r‚3VÐD½4æc·~Y±êÀùqÁ Únµ#™¾á×Ý-*VÔšÍK–lE²U-©~cú¦dTU»åD3Ù’¥:´ ŠÞ˜½}e¼(ë^5’͆ 6+ÍÛntutÒÇ«\Ë • vCÔZvpE1;’ÞÏ{±6®C™³KsP0’S‚ÆlQñt¯ŽL¡@d‡Lá©uÐIÐmÐ=­Jýĉæà¿8¡Âc3›ý²Z1£©1A)9Ž?=ýZ6k6ðëµZÙu³šn5[JTQ+U£Þ*X®à…ZØ0ƒ9Ù˜,ÿ2Àü(3<~õºfÏÀƒz©Ö´îwœÆô„ª, ŽJ¨}SðüIÝ‚ð«£c^g@8Îf£}±¤I~“,«1'M4AÑ D¯Š³oäKÁÌü%A,»žFv«#¸£6%õ‚é{Só’_›Ôæt7oxe'‚Üöp>'HvD-žôÛþ7F Ð*úºëÕ¦'Jšá·$£.ê5Òa¬1ºÚ¾Q”C\ž¨L¶ä@™Pø#"¢…«¸Ø%£)hõœ¸•+)‚Ç æFs–W]ðkW)/¢åÅžöÜ"Âq8Ñeü0}´`bÂqJJ7´[™G1J ÷P$”¹£(.«7G%œB¸ê6GJJÑv .¸%Çý OÎ0Ѿh„ˆ" ÔJ½¤…¨,€ÊÌnƒK¹LmÀðân†È¸±Œ+ŠZ©HA ú¾;5…,” ¤¢×šyÓAÓPáòѼþ  ¨P#’B¤M¤YðbqóÁM7ܬPküUC[ !¼ŽöEÈzÝ ©9rœ nYÌïk:’…ªVÃÝL.;ô)]5³n£¬xã%ãºh Yä(ÙYÜ7gW‘²&˜YÑš4Ý2zJ¨ä (íTTÁU€”cÅjЀØð|;Ð hÛDܺÑuÑŸ‘¯‰%Ò<"àÂqõH'HJŠt¿ÂMB`ëð£Ÿ#WD³ ÄH‡ Sßtñ|0eÉQÅÓT_×C®hË8|$—¸š«%{Äíâ–nXêNw¯ø{»O–£ïŠ=ÿ⨻Ârµ]±µ“Æì•ÎA±W¾Ðò?.è–¼+Wü½ ™Ò®8¨~Šƒ7±¼+’MZvÁAûyraâ?®tlרû¹Ó)ì•ïãº?ôô.Ö.oy]³·=Ð}þ ˜`„%#´PTC0`U u%4ä@·jn^-âN‹ç¾d”ê­@ÇB9”.µÂ¬+úÅ‹Ui|Ú.ã°®d#atÞ—õ±Wáã¯]”–>9ïÛÆhMº8 ®›}eÎ-4Õñ»PG®Wµ x¾cækâxCζÔ\',?¯DÀ$A²€Ž›Ñ„ŽzÕ¬bŸ³ü‹ºsÎ /*櫎ew×Ö«¦·j벺‹¡]Dvnþ+Ó­’!¾2/\¼o—[z>4K––oVMpÚröBÝÖk–Ñ´¬@QÈW®Ö+ð7 œÿVÇWÆ_E M«ˆ¤òÒ²¯ƒU5Ø‚U8ŒêFÞ*]Bß@QµÉ ¯v*ÎLÍS c.$ý‡ðÐõʷͦÞÚEdôÀ$y®êj-åîÅ|(þ¾éIÝ7â¾½U—ý¬5AéI¸-L¬ÿ¸áö«Dމ7j±? ÜX¾ ‹)ô¶:ÃAÓ¤³£Ê1íŸH!»Ãx(è'4 •Ûvv'¼'êZñãæ©qŸ|}¹ËÝ‡Ü Ï™8ˆ›}š®î>ÊEc…öHd_ cŒ„ö‘ZÐKF=+0-@6ຖhÛÀöpeiÇxÔŽ±©xxJ¶-Ͳ,Û´lËh€Ñ3UÐÈ(Pü¤3KŽ­o¬¯‚½Z¦êXyäbÙ²íJU?Ò„jˆš’­ºíèñ‹ ?_òF­º0^~MTG=_œ *Žâ©‚- j1'—òQèzž#HåF3ü¼®ž ¼ U>7ÕR5Á1ÇU1ôòµJibìo.»8åX#Íz±ê.·"yr¢bZ!¨rÕÔP“ªš\ÕErŠsuðµx©Ý0ÚuËPÇ¡p¡ø¦¡dmc²Y5,=;Õ°óÙWgÚΆ®ˆÄiTUMu­ÉÙŽ¸¹|ö+¸î¶°Õv9zŘê¤T¾P DÄWÄ ªtqfÊ‚}d¨£¡WD ²p~ÄTÄK׿"M¸à™ãjé\-(Â\2¤KbþõV]e z©¡EÆ7‹hS¬rÅ*vÉ–Çk® —/Í·­: .;_u‹rá\ÅÉ…VV,¼:ÝÖkQ@Ö(ÌÇÌn©\xcºmÙ±¯ÖBuÏ^úª¯M,4¦S2 ç¦|±páoºP¤ËÛp-àŠH.Ò}¹ˆ¼ˆº?—ÌU²Ð™û8‘ð½ý#¾ÑMiˆ«œ@~b®¸ÿòþã›@lA¿µ‹ÈI—÷‰ä®XŽï3 šœÂãŶÛÒ§ZãnìÅî6âÞ•FO­K;ðP¥Äc«g·®¾=l²5x€*SÅ¿\+~ðq÷ùtŸ¶þö¬—ÿ™wE"½OÂEÛã‡ñØTU/%H†©ð5J{“ñ^Õ¶ekÿؽO¹»B$ q׌'0:ƒèñÔdìQ£1C*žhpmGYßXò\Û2Çžp,¶S(ƒ$G5·Ú–dNr}³Y+¸9£-de´¨àTË–[4¤ñ©Èlºz'tuWÛçH¢«•dåRT/W›bTrÅ¿“ÔKª1¡èã@sÊ(‰o:~nzÎVÍK‚ò†aN g2¦6\g¶®MèV¹øà)¼ÅÿcàY«g2ÿF¡tqv¾âr­a†MFu³U5I™P´lYu¨HŽ_°½|«cZn.A!F¬ê-m#Z%(¸¾()㕚¡tɆ5Wxn)^¬I”ÇT-{ùJ¥¯?Ój;’<æ¸eÉv{›Ìt·^ E¶Ø WÉ;rn®áÕÙ(·]/vª¦-g«Ž¨•FfŽ%MÒ¨ç”ýH”Õ $Ûl;È:ÓŸA]PN?D1älî 8ªêqÉ+zÕBuªìJÝ*Ám¹¢’=i¹@ÉÂ_3‹fñ"Å™ªh¡/8~ m@i¦]¼rµ”mR3ò¹ÂE/@}õéÙêxö Ï×5]4-µTÎI2Úº ܙٶ㙾LµÀ¯rYÈ#dn¾Ú^±,]lÁtÒÆà¯5õ’p Dvª> ¤ó BÓ´AÄßã¼TMHrT*Uotì|³UÁ)dd˜²¬”Çœo4 .u‚¨fÚ¸âê–ÕtG¢TÏgY‚Éœ\kê~\D÷Ëü·Ý-ºÕã>„É|$ô¢ƒ€ª³_ànð$ôP׊ñ ü?ú \ö°ñè-˜ÿòO¯ð”~ÃŠÅØBü¹v†teY¯Û‰½õcâO,܆ö[ý¿÷*8Ðû¦çéwmÏžõ.÷v=>qhOñÃ(EGkÉÃb{šÇÖ4ï7g×RÈÿEâŠtižOÌÿ“åfN¨¬-Äü¿ÇØ‚îKk›÷CÇô ÉrÆ]' “„ÔvÍ3ýÇ2ý'OÎ fNž“•̱LQ»øÞÿöL^8'*[M-°rS‘ìI£fþœ¯.DFP­ C¬ª%Ç”l/ïúNX‰\ß{ñ¥weÀY3ýCÇO½pæÂ¥‹") µv­ÊD®y¤/“»tþ…ÃC¥ñ‘@S"S¡«#=œ;+ <Ý4lÇËòq²}™Lß@¦¿/+%¡ŒðF«Y©Ö5C¯7ZcãÙLfÒüåEÕ¨›Z®f+o/1LXB(P 2y×G 󗯵§fKe¹ ª M‰2 nåËB¦oP1Ì0ªªš!Éhqw;Í-À¾‚kYÎpßPi,×ëÂDá¥ã§áv*MÇ×Ýh8Ó/f‹wnG'mIŸnvl+¶C ÓEÊÅ’ÿð¡#(ê‹¡ô­v9ʰO&ó¨^Üš**Yj¹átXÓó器4@,­[^Ítq*Òâ…™š*C'a%°] ú±] „ê÷õB­öŒ$ëÐÀÀàaÛ ƒ°†õ·Ö¨VjQ¡”Ÿ¿2§jI(ʪ„¶"n¢UiŽŽ4Û5Í”êÍŠ £j(Êô_o6ME;Bch2M·m'¸pq ùQ(Hed÷ȱê®à_ð#}x¾aéC‡îx¶iêʼnÉkS³Z¡X³ªeûª¦ 5ÛzøV¼5£|¬)^ïC ßÊEäxéúþçÿÄ™É5è<ì>Àҷ͸íqß>àªÌLõ €:Æ ck)o®¼µ‹ÈñûP{¿?_1y•<Èl|pó í@éÇ•Mßâæ°¶åam8ogTŠ.jÞÃýdç#@cSÑP…'‹dôé)“®/Ç×q+[O xÿ|úÓB2Ø¢õŒ%. ¿X[PîÞ©ö,"{4l›ˆý^îÖ0òÖ*KD•·oõ;»“ck"ÐÖÛg9Vºw«–j‚é^²Ý±F¼KkëyYŸ>ü¢Í[¸§(êºEñbj«Ü×—1Œ’o†#/Î6,WžP²çêV!ÆœÂyØM[ŠâUÁªçyࢆî(²™É ¹NµµKEY(«ÍFÇ0¬ÙÙYA(åòãà´‘&Μ::Õ ãÝuyû÷öÛöäMB¢Ù˾6›Íw½ëÝår¹Vk¨ª ê(Š¢2©iããYÇq\ׯכ/œzq2[,D†aèyNúÍV5EK¬˜,™\·ÝŽYwµÒÔ5[(+zçÍ7FDAµVm™†+‰HpÔ`¦bœéŽ*MY1ªõð¯85J6ÅÇ@ÞŽ9^ ªxt_™¹ »%°}MÉô2ƒ¶æÔ‚º©X®áMÕ;¯V˜ À›7îòbÔQ¤(¬÷÷ —ŠàíÖÌÌÜØè¤¢haX±m÷Ö­;ª¬4¼°áUä\f)È0+´¢0]m‰Ù<Üx«–’™NÅòË©U#I CD±\¯×Ûí6ÙkŠläseÇ9…FDPqˆ¬”Ùvt´`­‚„Ãw}ÓÙ‰‰1×3ãζæºvTñ S. YQ*ÔavrôÊÂl¥ …jµ*Á®1,t(¶^›j·f¡|ÈÇHÑFª&¢×ÁEÒ)ó3³íÑÑKHäôéS)• ¾ïŠÜªT¤BV-—[Õ°âÅ3×Lºx0Ë‚®¯ƒ¼³e×:À|¡8;ÃHöJÃé…î=p7áÿµcœùë;þÀÂØrr(oßÞÂMšXÞÿà<"dzŒ’UZ4Wêá©;éÙP[·P÷`ƒÿÚö†IÏ[uǰ?…:8ØCXóSSåÜDÅÃÃMÌdΜ8y Šãºœƒ ’£âk‡27®L?Ôwl8Nj¸?3ÕðJ¹óRiìô‰ÁLæå³'áæ³=[ÚMµPÌ43a« ½Ä’ò+*”V–Ç2™zÛ ªš¤æú3aÕDÝU£HJ<”9}æ¨,ä“}SEªÈ‹§ŽÀ­…r92f¨/“ld×=ž!ï}IÓS<žS†ÿÐPþoþo^¾táËí¦]‡þó†o’ @'¾Sì´¬xMAþ<©®é§Žõ[Zñôña¹”3Mö2J”‰C¨h¦Uyóµ/ž=y˜ÊÀVñ/´/”sæÄ!„ õg:mÙs&¢ ï;“béuKoÖ´¸-Ê£¾-tš>þUÎR¯€ í!£rþÑ‘‘C‰Ÿ99„Nyêp_g‘>ÔÞ—ôF˜$Aè´§ê’\œÌ¡ÉÞ¦mOÁŠçw¡#¥×e¼%Üxs•ÒÃóñÞÒ݉]çï•SeÛ/p9¤»Ó~ì2Ÿ|Ol³‚·…•'Ùü‡­xzkw« æ~${‹=jÿŸ‡w"caÿé'SReƽžüŸšíß{/*ï¹.à¡þ™‹õc©é¹U°˜ÐÝ>5 ,¹‹&KÊOâ–!ü”¸²ß¹ûŒ¹Ûí)AïÒž·DÙ;àýã­P>x+=ÛÁ=4|´Ôú5Z_¶_$Ke6Ü´›°Ë*3ʈr¤ÝóÙÌsÝ- a9æÿFU-ÅãÿÞÈŒ¨Î‹Z]«ØÙÙÌé¾þÿúpæ hÞp&Rò/ wÊÁÉÓù0ÌaC³mÛµ]§ÿÐ@®ÚoJ¹È–ᢄ–|áP_fº!úæHÍŸ¬yùª›wÔGkG*Å’&*¶àkEä‚ôO ÇšáHßá¾ØZ‘  YÊ”B†sC×âÕ™øMJ+juÏv¶Fæ!þì”â]d©Å÷á"²ý¨e8;QJV”äFáÁJ“ݑۧ‹öŠ;í ¶×(l÷íý"½VôIà@… ¬ïÿo¡vÅÔûâÿÛVn°J?Yo+>Œ[Q%Ø®lú.Ôg·˜É ý3Ûé¥ýbíO ¡Þ‘çïSÅ9¾ðŒö·F=Ç×€]6LxÌ v½=¿GóY6ÿÜæÿâ~\âÿ)ˆ»¡ÌÜžÍ=ÒäŸøùlWê®ß­ÚZ   ‹(mU“ëºâ'Äl¶ÖM¡¢ç=%Wµ•„þU3™R6w¨oàèðÐ@&sîEtŒV³*”sX}èÀS Ìš§¯‚ ÂÓ íŠ£"Fv< ~ß 1vr8]÷àÈ” cgOÆiøw¦U±´â^ö—­”L ¬4f† ˆÇcƈô]M8y¨§¼äCH¬y˜y34ÕÒøTÕ±•œ%O޼܄»×»þ˜ôV\ar¤ÓÅxPZ:>ØçʱLüùªÐ+MŽœ96äè"Ò-!}øá¢Êà¥R~yQj=­O6vu(Ð1%¸õŠ×6Äጥ ºR<<„Cy¨?Óª‡biÒwâÈkî35Q(f›µ€ý1p5xj‘M‰à¿H:DO84UrêX³j¢±’W!ã#¶ãO7‰ä¯ºc¡“äËeŒ—È=½X÷ÕØ ÐJı q’*X÷õádþÔñxà˜jVPT̳µZä"¤Óª&µ‹?1ÏpbFÁ0a¦JÕ•‘¾RIòµ@ïÉXðô2¥U»–ŠjêJ) åä%åE!;@•ŠŒ|«yô‚-s t4úNÙ^c2ûœIÂzÅÛ%ØëÙôˆøûu“NUî¹ìíŠzùøp}"8hyÔ­ÂÁÒß9`}凱W5ËûVH95$tòmèÿmA~j\ŽoðþÆñNà¡÷›Ö£¢=ü°Øïþá;žònO®÷È¥;ÆÕ]» jç°UHKwI~ÏÙcùÑsŽZ7‹·úóC™Œ*õÏM5Á²Lu×j8š7?>2ÛnDȬ0é[:ÈX§æƒŸƒ;jY)N¨¥,H]#°¦ëAnä œ''ºŽÄ+ràâ_ÄØ'/ƒá°Wõk®Õ }KÚQpbh@-æá÷4EÈŽßY¸ŒªŽ…È2^>yÜâ±âvÅE1`  È¥4q6Â^é'6Hü­Šg£‚ðƒÄ¢ÊÉ7°zèÁ³I¸ 3•B.HS`Ô0 Ë^éÈ ¤H™p‘·]‹&;Uõäå&ù:¶~âøaM£Ð –W©8yøÐÜB~B !Ö—°åÁرQž©ª•E+\žª½ûÌqR{b°ØÐIaì<}nÊg¦ÂLƒÉE‘ÒP#XO·®LSÓ Ú Ç†æ¦›c£TE¨×ÂìÄ2Êy” …D‘$±HÅ;uò¨®I°_@ÎÅ[÷M䂎¡•'Q¶]ó•oÈžk"…v«†¤lKC²H<ðm„äsã°:‡3¾gá,l!?F–àÒ­¤,Æaf¢Žû¸Ž88888888ž=¤æùï{ñO/G¶ Õ©¹`þ¶¦ƒÙêŠÙCƒM.<6 ˆ,…ü@&‰™ª—òã°x]N˜v ÖD»b#ÁÙf›!†8‰ŒphÉùwŸ9ZuU˜º=Ü—‘ £gŽ ò±Aðíþ9ÄÙËÌW‹9­”ŸmT…ìXÂöÍVè5w®YÓË1M½>Ûñ4¹îÅ9 }Tv¾¡RÈù6Cs®î•þpKGWĸ´*i@U~ñôq„ç&.Áý{ßt–Æ·#׬ºº”9u8‡ÒP d7]÷öJ¿]‹÷Ú싉n«:¦’ŒÞËôIƒê4æß¨ú†*…kWf@w‘;þ mdª¡ƒÈð;<€ÿ"òP?ì¿4qz¦{Ô÷ÚlC)ŽAÿ†z¡ mfÂ)´>€æ@”CÃþY˜¼ˆt^<1„òƒŸ£ < óä5„‡.-ApQT;V‹oÁT*t´Ä8Ê#}t”‡uù&i¢w! ÒF³@óR.LÊÐÈ?*KµªôåS‡`½BÿHà#ÏíˈÇÄÿªF ‡ðäÇ/€k£‚mÆû(eð:ØÄý¤rlp¶Ó%榛¦V]ìΔr yHG+Ç;ü'eÈ3Uuò£ç†“å/é;ÒŸ¡©ã`q ‡„p¯*·"lßK®* uôÜ«0|]EpûÊ¥p(™ÃÈ(…€ñÞ¼ÜçDÙ`ì¥OT ŒÄõ%€Øø@B}qJ,M$#Ï4”õìñÁäýEAvåì2vvM_(ŽƒÿãÐÌ âöÝE.Ç "k„€ç³Ù>piv ÚäŸfÅPáÒùצÛ5ü7”<´‡¶ƒn‰ÃŸ>Úâ!#{òÒkdâ¡™@˜0p(-ŽÂøðwˆyª‚øDËaà 6Êÿâ©#”)4€aýWïy ‡`æpQ ª (xhÅôß{ñ8™]pÑǨkíšoòN¤„ú"hÚó½xîå³'O'žÁÞDoD8ŒMôÃÃÉŠl4My&l dñˆÎÃÁÁÁÁÁÁÁñðÿ‘À·”îÚýÐÑ\Cè á¯xF¼¿Š«;ºˆÃÀV/O7WkÕ}Û µT¯8“ãçç¦ë¡§Ó!Îâ\])Ɖ;ªX ]©Y5}[0Õ\=Ò=«ŒCÇ(Žxy¦Rœ|óÊlµQ1¨Šã@ÅW\³¤ËY`ºåµjV5P÷Zæc©åÒäÈ|§^m!?O-°41Z,̶pÖ‹ÍŠ« 90É8ÜJ>Xì+ry´œ¿€ò È}¯ôk‘-–&,]ðlE•òÍš‡Ú9¦%D¾Ê¢úR9‹ê7ª.Âã"iÈ¥Œ\l½P µÈ“©Ö»¦ßnH\“ SÍ.4‰Œ =x`=!kÉ’ÚqØi„¨ÈL«‚AuàG•Ñ@r)‹S¶&ÀŠ&.6"ÍŠ, Cè3?qåY˜«]|ãogÚ>ÔŽêÏOG¨»X¼4× 'Ç^CK¡´PZ €¼~¥ u¡´¥ÜyT TD6ÕÊ@ÚnU=hª ãð£·@ó“£o*åIê?횯KØ#HY“&}Ï.÷ÈWÇވt®Ì4)ìÈPÂÄ¥s¨&j÷¼t J°´â­kSRiš ©äHœ¯‰ãààààààx^—½?.þÚÎ\õM¸àr Õ sàW   ½ÄK¯ÌµÀQË…1PV$EœFxL­8Õð@éAê@ÁäA5AGÁ<‰Ã ÿÄ)ÐQð@EÄ!xf»n#æÄÈßÈÊä^UFQÁ9AÿÀBQ<°DÔ1F Èçl» ^ŠJ¡.à“Ê€Q䎼’¥¯{Ùe#ù„¨>€j¢â•ÀDíÀÕQÁÂä%’ €Š˜m×]Ôkªá ŽY=ÄBw‡ñßjh‘‰º…éÎ+€2Â!²À!Ú¥˜½„ªM7#T ì €£‚h&©8ú¢)ÆW5Ðsã¯C“Ð'ø?‘a¨„µ†ÂI۠ʈ€Ò¢ðhœ‡‡ ꋆÚlJú‡ÂAø‘o²Å« Í#÷rnôÞÍ+h°ôø›YI£(ÂD£bQ£CEèP>¬<”a¯|ñGTŠú$š¶L€Ñó¯Þ¸2 »M|â%+5¦[ÁL;|ý•¿D Èõ%Ûeæ7Žç‹ÿƒO‚jæÇ/\¿ÜsõÂa=´AM ß÷uYÎŽž›šª˜¦ˆÃJÅÖ´R»Á-•ÆUµØéT]KßÙ‡¯»©£ñpÐ3pHc {(9Ø "tšñŽ4ˆò 8ƒÅíUßxÈW-_kÓNA4øLcþ¨Q5dfTÊT J‚?¢H  à¢°8àß+}°}Ô®Xsnš–%¹®Šš¢úP''/¢ú@詨/UD]2ÕkOûʼn7넬çiÐ$Ñõ2BÊå èY#ýj²†Ù0 ¨¨oaââT=@5qöK{ÝÀEØ2€ÊŽ]xmv*Ò¤ITuD1PYØ>7Zpilª€儆A¶¡s„ EÈ"ÃáLÛ' EQGEð_Ði˜ù‰s0+ȰB¾`ã”/J‚®Ã@sà0H>›‹âÁø ‡r;’BOx‹|M‰£ã¡›ªÁ¾@Ó(/ä‚VÆY4näŪ¦·KèiÔ¾0møƒƒƒƒƒƒƒóÿGóÿŠg(åI-¸ ؈¢e"H)Ø)x)<`¿`Å`­pIÊÃ.hµBðUðX¸¦VßË¿ÊÆúˆ=È$¨>H2ød!ûQƒ° ┩æp .(â^ï;h,¶±M‚%‚¢Ìñœ¹xyºƈȮ)-$Ë‚^ÐÀønÊQÔ«^÷P/ó 0Pqpu0öÙÙÎ’'Š,QœÔäø6H5fÔ”ñç]Ó‡Æ`1áÇôÞQ¥@&²@^”)”qˆ`ƒi£^d‘¡Ö4ºŽæÇV…¸7Zma¶×·ãá}€f"¡¾É×Ð àü°¿P¶Ë3•rþŠŠbÓP< Ë#2Ÿ#L6Ø5d&ÐY˜uHœò¿ÒÚÄùáBáD©èE¨;½HB±AÑiEjVM$‚¤ìùÆF Mß‚)Ãð¡ÙDH‡è¥è®ì]©¾È‰‡^1ð;ŸÿC° ¹Û]›¬E®&—h¡«k©ž­í ¢úû‡gKOÊq°ôŸt}š~Lq‚'­ÿ']ž§­¾_/ØFÙwdK/™Z1òÁÌ¥ÀUdab/žOóÌë§\ \ °tÁwÔzÅ[Y¼í˜ È?è}%°áÒ^.»ˆè¾Ýƒóó·mßîð€x?™ú¾­ôãZøÖ~ÝwOºØ:ПaVÀ®ØþÙ¯ûèÔž~쿦o¯¾MŸå²÷RÑ.ÏÓV_ޝ  ¦AÝ[ÍúâýÛÝîj·»¼«w™ÿSð›ÿã·üwåÂX5´šÊúÚR½š†’$ÛCX{c#Aw¿îæ3îv»O¶¾Ý»›ûvßý<Ùòìë3 4ÈÒäÀ5LMLÈ™L£êªP U*¶ê!Î~ìÃïÿÞü=[C4×»ÝÅ„ÿk;ùÿÃÖÆÆ&çÿ\¸páÂ… .\¸|}øÿfŠÿgþot»¦É×wô©fåðPüÀ!l×RaÀ ø­_ÿ•ü¿þ/ð·çÿ\¸páÂ… .\¸<»üßPDÇTJùqÐþÁ¾ÌÉcñ>¡‡3 =³ØÍZð‰_úè?øŸþûFÕçãÿ\¸páÂ… .\¸<ÓüªQU¥âé“GÀùiðŸpôP¹0qõòôäøÅ|ðg¿ç»¾ü_òœÿsáÂ… .\¸páòìòU,5kˆ}஥jr‰Fþ=[³t©09 Úÿ‡¿÷›ïû¶ÿÑøø?.\¸páÂ… .Ï4ÿï4k ù³L])×+H~ä[¼¾0[ lþѧ~ï;ÿá?@œÿsáÂ… .\¸páòìò±˜ç7T¡Qõ‹¹±«—§mCŠÙ™©z)?¥K¿ð‘|Çû¾5ôÌäçÿ\¸páÂ… .\¸<«üßÒdšØï˜ ©œs-µ¹´Ûg§U|ëW~ñ#ßýß®+eœâüŸ .\¸páÂ… —§_ÖÖÖ˜Ÿø¿¢(¿û»¿ýÉ_ùÅO~âã;ñk¿ò Ÿø¥þÒ/|è—?þá?ü½ßüŽ÷}«mÈ¡grþÏ… .\¸pá…˳"ËËËÄÿ!a–ËE[WèË_= ·ª_ ìóç^ùgÿä{MMÔäçÿ\¸páÂ… .\¸<+rïÞ=ÆÿëõúÚÚJws­Û]݉ե;Ýåµå»÷ï\ÿŸÿÉwç·[ºÄ×ÿráÂ… .\¸páòLÈÊÊJw{üxxüßqœnwÃ5µdV/Ú¨UרW¼¾ÿ§ÿçoýZ Àù?.\¸páÂ… .O¿,--u“Å¿Äÿ5MÛØXÛ‹ÿ›šh¨‚,äa|ôC?÷=ßõ¾£óýÿ¹páÂ… .\¸py&d}}<ËËË}}}0,ËÚÜ\ß‹ÿ®áÙš&—Àÿõ—?öOÿ·ïFÿþ/.\¸páÂ… .Ïœ!ÉdÀÿmÛîv7Cu@æwÀwt~U*Zºôñþüwý£÷!~Îÿ¹páÂåmÊæ[ .\¸py¬²¸¸HžþD4M‹çÿÇ£ýòÈÇÿÁüCÏç‡ÿ“Ÿøø?úöoól¯ÿåò” ÛçöîÝ»4çíþýû\-\‹¬®®¦=IgÛØX6º›kñ+×$`}}7ÄÍõø¶¸r÷~ !+kËwîÅQ—WáÞ»yîÆÚæêêúÖÍôÙZqFžÍDÖ¹}û6…§¦ÑGjØsŠ®\R5E»wïû a/µ÷ºl$Ú¿qãË ÷–RFkS–#â¤S¦Û%…²ÁCÁáÍ›7YRI'Õ#ì.ÄÒénoÇ;UOä;wîPú”ìÖ³us3%Õ“)*NºbñY!©R¬$»Ö+}·¤`:k.\¸Œ-CÀw¶æýê/ ü?pd_PÎÿ¹<½‚§ã$`x®sáò5‘%âlY”›1vðÿ͘àols?ü{Ak+ëe‡ÿiùÎâ–³»xîÒâÚ·ž«òêÕ«éCâ½ å¸Z™°°°fû,œ,¢©H„–yK!ª¼sàòåËŒ“K˜2¢©0ôG¤C¼š1v21ð»óÿ´Ü¾sî‰èžÄ²ˆbmMõ‰Yßrúþ93{eu­»þ\Ü>wÎoa×é¶VÙhÿNÂO,”MÈÁYb°»&Û#W®\aÖGÏ©¹¹9ò€·3JLBvýcô>Í¢{hüNn¿«ýÈ sõêUšDÄÌ“‰³)F,ë´ECÿe敇L“ø™–Ò•‚J÷ª+«½—áÂ… çÿœÿsyš…Íõí¦Þ}?~œk†Ë×"lš4#¢ f¸‘î5ÿL,~_°Ñ½zín†«Éþz‚;‹KäY^ßà¹y÷ÞúöÙ»KË+›ä¿wé9Pݵk׫„Æ:Äü‰·Æ·Ù 3¬*vŠlhþðáÃDnÙXz:ÎN¡ËŸì5ºP²Ä™ÙÍy®_¿>;;›žîB¦GÏè7â#õ6Ûðرc=eîš…š"Efý„™3i®NY³©ûDæ‡>Y l”>ý”ï1RPHŠÆª¿W½(ªÆ&5ñÁ.\8ÿçüŸË³"x’¦Ÿãæ \¸¼¥¤gk³¡QÜE÷âÿt§%ÎòÊE¸·¾¹ØÝ‹©ºvoq%ñw××€8ðþ=D[Ž¿¸þìOJÏÞ§p\ŒDbÙUÉ.Uï`§°È  !kFz)>"-àóôPYx¨Ïœ9Ã8-"åNÏ«¡LFÈâ@h¥0b¦ù0{q@EJúãdhhˆ¨õ{Þó6;‘mS€ÔÒëŽ-1`þ‚S°†(!T5ü—Ì(ön~蟽࠺P•÷ªR`í‚=b†.\8ÿçüŸËSÕÏÙCO4z®;vl“ —¯Aˆ2±ZbM»ÿ'÷>âiðÎ_½væåweúû3ýƒ™C‡3GöŸ<™Ê zéåÌPì†Ïœ‰=Gd޾zï.¨ØÍû÷Wמµ—Ìb‚çøñã ÁPÝ‹/¾HÌœ'Ü^x¢Ñ&ÕiBNÑN:Þ åÓŒ>Æ÷<æh–;kGJ'MÔÙä®n2×…Þ>9r„ž£G’˦èƒTSÝsX!QPëÁÁA¢Ù³³³l¤w'(„¨>•„²c²£2 •DSÑÒoH¸õ1µP„dŠÚƒj¾üòËàülœg½pøÒK/Qú´ ºûÈu\¸páüŸó.O‰Ð¦yl$m›§qáò„q!ô+°Ð½øl#¬­.-ÇóûAÂúbb4¡úC1ç?~IÌ¡éýBÓŸØJ fVìU¯žBö¬ŒàÂ… çÿœÿsyú»:=¼ðÐ|Ë÷ò\¸¼Ý~•fþ„øÞOY_^º¿¸ â‹»äìÍàüóKK·ºÝháÚìÊjgqijqifu9¸¶p£ÛY^Ìœ<Þ¹}#3ØfvkeùîÊÒÊÆú³Îÿ‰À“Kœóøñãl¬›NZÊJƒÕÌL ³Œ½ƒ!³÷/lþ?›$“fÂé¥iJÎÈ-ÚŽÑæîöÐ÷NþŸ¶h$Þ#À^@aÒ›ù³2³;»Û3”Ø7NŸ>MU€è¿Dã^%ÀC7+” !”T¼{ìÊʉ'ÒÌœù‘ íL…¤Ò˨a2ù€ᇟíçóæM¶ƒŠAˇO:EC(éÝP—°)[éµ°³´Þ!mâÑR ¦ÃÕDñ݇'qÕ³ÙkØ 5½áíÚʾžÀêØ³Žû Bó»Ò@ѵlÚXϦXL±ì/éùr= LÒ‹ÁÙ¼lyËÎz=¢ÔFÝÔ>·| YÎÿ¹páüŸË7ÿßz°±¹ö8Я»¹°º’Š®]Ç·³´:³¾´V–¯u»þ«™CCók+·»›àÿ÷67–77ן¯¯³Q}¦?yò$ øÿ¤¹(`­ íp‡Ío!*ÒÝЦasZJŒ˜gÏžEÈ­[·Ò›ý²Í3ÙTPäB~$H‰£ï}ï{á9sæ Bú´>d‰FøQNÊŽ *ñíááa”1)\ðgb\Tž7n ç°O ¬¸´ÌJøÒK/\‘y’žE«iƒâ³#Ð$(–ÊDêÈO©ÁƒR‘ŸÞt âT`–ÍB QT6ý ‡ô‚ÇÛP¶–ú©(açNDl6Ô;Ð]éSq[³øöM_YQ™ÁÛ³Bd'?hÊÔµzL ¨Ž" eÊ‘åKËCÒ‹VzÖ°ÐZ9ú0Ù­Ì‚èùG!ÿhSˆ5î~¶ÆâÂù?.œÿsy¶úÕö].Åÿ“üW–âG$¨íìë™ãG;·oÔo^ǃ03|¤³ºY¿¿ÒXYªK÷[ë«™#C7ºÝê­ë­;72'Žâ/kÉ-ô±ó®w^ å Æ›^ÍJž+W®€„ý *#&«;Ûº3M$ˆâ;¥pöÁ_FÛØ€$k> OÉw·×ÀBÒßóJ¾ç¸”5ÛDˆ}¹¸Ýn1£÷Nûê÷h£ç[ÑL+-Ûá“;Å/SÅé隦¿ ƲØù–$í¡˜é-†`OõìMú¸„¶ÆJ³b¶Ð›Ú(MnéB{1Þ²ÝíÑljôG_Œ´|›üÔÏwö[$ÒÓ½”¨;¥¿×ÓÕ©@]Loì¿=ùâTÏžw=´DåõzKaŸó`íË…ó.\8ÿçò|óÓÃ\-Òïv+ׯ6îÞgNœ®/¯U—WÚÊJæÔ‰æújõÞíèÆU<,3Cý4óŸÈís 7×e|;=~ËÆÀ‰Æ[ õ‚®mH SHúCW=;^‚Ð2v´”EH-§Û‘‘™ô·>mzOvý¥gü´µÂˆwšbQʬ‘2-§evJš´§g¼€wQgçÞ›D Ya(qÚªˆ ö1ÆýØG¨ =…g ÒkÛÙ†BiÛêq £©éï¤é=ÙGlÏRÈ¢íçÓEzf"½¥ ’îl¬¡{¾Aùö¦Tí|ë±s6QzïkÖ[ØÍŠõ4$•þND7õÖ€^Bídø;ëõè‹õ _pþÏù?Îÿ¹p9ÿ_º?¯‚?­­f†ÌN³³|?俳8³ÑÍ>>Ý홣GÚÝàÞpÖöÊ}³ÓFä;kË7nÝD"÷ïÞ{Ö•FlœÅÕ«Wƒb£ÖÐqÚ—†½¡[úKÎÓBã“lI,Û¬†™Œ–§¹›“ÌN1^G9‰Úõ Õ…fò¤Ï2+†¤Z­’'ý¦ »=ŸåÞ3–‹|Ól“€¨>JH¶q*réÓ`i¶Æ>-×ó‰4éecÚŒ"G6ÄÍx ûò®vÍ×(,)t6á„Ô‚Ò²™*éãV«ÅÈæ–¿c]— ¨}j€µ`§ÓIóa”™V¸ï4vö/ÔÐèô2ˆ±k”]/ÌÜc§ÆY–õÎMn¡pÖIÒ½šº(ëØ;ëõ¡6baÍÇ…ó.\8ÿçòÜóÚÛ»뙣‡nw»Í{·­+sµnxw Ì&@æÈ1˜þý{­5}a®~ÿv<þäÐâú*X[YeëžiýHS‹ô^&F׳¶—v[Ea㜌ç0úÔ3•¬†â0ªÏöºì¦æ-PóálzHŸí™ÃRK¦²·=qØêÔÕ³ÊU˜ššÚIÙëƒô0;Ó L”Ù5éÙ#éá_¤€Ée1Ó›ÝÄâôD º›¬fnx¼£¸H­ç­Õ7]öž‚}€€l.j…wrñï®mº9gªK¯Æeµ&êþXŒ֔݇'öÌÌÌ0+©»ã- ]wlÅzÚØdÔ#K!ýòG×ë£÷PT¾,çÿ\¸pþÏå9çÿ[üs5&¢ ·n-'Szj·®¶WîãáZ¿¿2µÞ­Ü_É!s┿´ÜênV–î_IÆÿë7¯gû׈|®­#‘gÿ3®Bd|€ñ :$šM*…†)¼‡sÒ@zšñ‚Q°qc:ËFk™‡ÍÞg¯hp»gú}zŠ~Ï|ƇÓ3U(ý‹hlÚ|Ú@@8›þM«˜Ó -Ùß)2¥LòŒmÒzÌ´„S!=Èl¡tÈX`¼¤kÚ³±Ûæ…i›ÊFÜòIlÊJEª ±7/l·™4yfÅxg¾JFú'å¡‘ð·4…ØËŠ™^«Kõtßî¬jÖdì WO_êYtÀ:mº°+l}zºó³7 éW0»ÖkWAÓ¤[ªËgqþÏ… çÿ\¾‘ø|ûënâ1ygsüvõ~kùN}ñng}£vo%sôDei%Z^Ê?.-¶6ÖªKw[Ë÷çV–Àÿ‰Î­w·’z¦•*rç{‘ìQïÉI[ë>|á÷—S{&=BL³ÝÙÄÖ´"’¢ |ºÛS‰ˆ±°On휔žñÞMÍØgõPj´{3!rT¶µN75Gbqq™ž-a`…OStf˜t·SëîØ¶‘ÎÒÎü§OŸf1QÇôVŒ\ÑéX(<]e6…5¤^¶#‹ÏÖ°"=Æù?ìM Ó˜ê‰'¨vTf3ÒâSö‘‚ü¤…Y—´3Õ£ß;P7`Ó“X-˜áÉvjÚ9KŸ‚èªNÍG;>½ð ÔWÙþT¨4ýråC‡TêZ=Ÿ½ §oÛQ²{Õë-õ†ŒØ6¿ü+œÿsáòðÿž½Az–D±1:»ÿ­¸<«ý*}ËÛè2òw•õµû›kKñž?™…îJtçJgc±¹t/søP„y±Õ]wïÞʼûeua¶¶|¯±x÷Fy˜6ÿARk‹ëÏ4ÿg1AÝ[‚»º®®m>`eô£m}sy}#ž%•†[‹÷VÖ¶f=-/.‘‡æA­Ó«ñ²ˆTW—Wè/g^8½¹¾àpñÞ}¸·oÞz¸6ÉCg;·n#þ‚¼âì667ÖP¬uð«Õõ5°%úŽ[lª¬¬R-2}÷—)Ék×o³ä——W{x~÷á‹pÇHﺃû }׬»½Ò¹g÷„Ðí Ú¥Ÿ±ú´Ù’~A©Ñè}üŠÔîéñ|ö4Äg$Y.”,émK³›šÁEË«™uÈ%<ìm»a2Þ‹øéÍüÓûšvSŸ$Kï¡Ú}øMAÏ©îÓs˜¥CUNä§‚™{éËÞA0öŽÔóÅ_d÷vÆ«)£žÕi‹†}:œSéÅì´O75cÑYö",ݲhˆS§NÑ:¤Ï^$1Q´þþ~ZDþ¦M¡W”S;Ù€éæK¿A@ÿï1X˜}î-´Å(ëWlr3Õù÷79ÿçÂå9àÿÝíi–ìÆH7ÉôÃ…yo{œ‡Ë³ÊÿSˆ§¿‚Ь¯Ü\[Ê´f›è S«÷2‡/w7;ë+õ•ûÍåúÚb¸x;ó÷ßxy±}çNf`OèÅ¥õçcð%ÁZò6ãúxü<“<~üd7þÖIîõ„üÇßG̬l׸/™ÄA<âÝ`x0ùØ.‰dmÅÐÀ ¹qízL9’ø1_[#?Î?~<~mlÄ„?Iyxx¸/yƦA’ÅŒ›lu…Pމ 7üÊÆ&¬•õmµˆÙ>B“2ß¼u‡†!xÙ÷Ú ®ù!>ŒSì=Ñ]ÚØ?ým/t³žw™”¡¢¯•±AiÄG5Y^ì/ô…6 £gZ8Qbö3fYÐil™} ?¢»9{ö,Ë ÄÑQú¥ ¥ƒ¿°=”Xíè:bó£èS ´’…ìùÆtˆZ0JϾ ìH¥´d8ý}–5)}éŒ}éÂ>šÆ®ë……TùÝï~7ûäEÕX⸥£ÛÐw+XFtÈè44Iï Ø"öÍ •Ò¤öñ;ú 5"¢¥Ç”˜Eôœ3gÎ å+W®°¦‡mBF Ùô°£wli|úª¼zõ*kÁä æÝôW'ÈB¡ìP6›Ž—ÔˆîŠÔHÏÝí‰C‰°ž“6ñ¸pþυ˳ËÿÓcntû¥e7õ…J€[ø§O¾!úÕ®&@Âxo/ÝOæÿgnv×§of÷7ãáænpíŠ>×¹Öí֖ﺷ®z72‡¯v7nÅ›…ÒøÿêÊæsÀÿoÜ»‡«âò4~¾¾¾ÙŸ¸}óN_¦Ÿ®š…kWœ8¾–Ø»rõ2ͧêìKè÷Æêê2Øùòò"\„?yìÚµŠ³v0ü“ÇVâã_䟟Ÿ…»²²Dÿº·Nµ±º¾ÒߟÍqôèaJaáÚ•LÂþ~æÅÓHq(_J?fbëÝmÃds{˜tppøÖ­; ‹^¤ÏcÇN€üÓ³µ»½r–h9±,ôð7ð¢žwˆŒƒk± Ki%&9ÓgŽi¨rG‚dD@ظ4üßüÍßÌl„4GeÿlºTzüœ½è¦fkœ:uЏ}VD<“&iÆÈ¾ÅÌr$Ÿ6Ø^4” ™S‘Ò7gÔýرc ·Ë‰¤ËO¥ÅA\i:z¡AÙ±õªL?LÕéC6Ÿ^ÂjAíE‡dA!Côy¸_‹FŽì ei«Š²€™À¸4uŒîß`¦4©ØdG¤_j9@ŸrN¿¬Á!j¾A‘*Xt$´ +3kAd5ÒÇé¨S¡HiK¾‘G¥eûµÕgÂ’eýmG“v¾¥/œÿsþÏ…Ëó1þß3•n×tëNÏ¿åëž¾±úÕÃäe-ž1rme¹» nß¼~93œ¹ÓÝ™æfÛ·n‚3y ó3+sݵùîzíöÌð`ty$&-ßèÞ»»üðÿµm,-¯®¬Äf o'†b~O;y÷ÎêæFÿðë›kp9§‡"{éù¯^_ …/­,®¬-“mclþ›·oÀ=vâ(ÜåÕ%ûžÔ“..ßGšðܽ'2ÚúƵëéÆÅ!û’U 4‹iû>°å¡=EçææÞûÞ÷²é-ifuš—R×¢~Õ³ºñ)2Lí¦§aãÅÃd)‰Ã|ùå—‰õõìçI4•hc¼D&Ù8<£²Œè‚Ó7}ÝèÀiÙE‘f¼ ®¸2†ßó:#-4ªLÛEÒ ³'"´é/)ž3gÎÐfPi»ƒ®SvaBÕ´Ol÷á¹ë¨EzCNÿgzªL…Lkƒ^‚°8ì½ —fƒ?ìÓÕìµKšÃSíèÓÏÝ߆K¯WgqºÛ“”è+ÕLW,h€¶Ï¢ÿ¦G¢Òï}z^3Q™ŸŸ§2@{éïâu^«Â”Àžtéš²¶ÆßYïâÂù?.Ï.ÿg³鹉[åÙ³gÙYdĆڸ|#ô«ž…«é;áâòÒÊÆz<¬=É f¿øÜ̡ÙÁ³ï}ofpðÚúš;7Ó¸}sfyqz1~*Ïãñ}äèíÅ•xÂÉò3󌕰ºrëÿgïM¸âHÒlA± !$åR•]}ºç™ÿÿæÌ¼wÎôë®®ªÌÊ”!-(Xc÷ˆ°¹î—¸y1H !’Y†"ss3sóÏî·×)übæÇdLOàïÛ%þß}ûß4¢(ôµ€÷Ðt6·8_Ü.ŽÛõÛSãøi|zª>SóÓøžY˜›¼ÊÅ÷Ä­V¯úª3{o—6ŠQÖg#ͼuÒÔx¶ðàÞ~ýgÊ›ÿß)»Zt5šøð'ñû½» Îâ½Â©ÝÁv79Q˜|<|øP@H†(ß}÷ÈÂì쬬G€š€£(^v’(ºé­²ÔÍÏÏSŒvÌ%óWιúTYØt ·ÆMÉ]Ò¹ÏW\Ñ--6Å9k@'\‹úœRùÿ¢Yœç*%ÇD™¿7ÅùájáüPí%CÙ$ÿOø?•T¾ù¿‹S¸!‚bßté‡g«Låk]WÙØ­^içSåCÀÚÆ É;s3Ùø­ò3‘Ý/>·Ç)ưÉÎLgã6ññâ Î’²MZ˜Üp ØêÍã^¯+ßÛãýƒn½‰Ía÷õ›“3‡GV»4 ïóÓíuŽê‡… O)ØÇ‡âúÚþûv·¥jø€eàÁöÎu¸•­zaøzh߬ƒËY2Ôç]¨2ÀçàhŸ7Â%ý~ò^óàˆ½ÅE–†¼ðËîµ;ûµ½v«Qz(ž8`£˽º%…æÊqŸ\\BÌ,·VECõ @_žn€Äí¸\î½r%–TVHþÏ[È¿XÊJE€”ÒA†÷aèØë¢é`ÊPâUä‘=Ä7SVs‰±S‚­Î{œyú 8¦W©z¢9QÔP‰hÜ…ÖïHÙµûYKÊ3ñ„(¼ûðÊó—«:)X,}ï€ÂïH_CX®ÔØž¨bccÃõL„ͬ^8Ð< œ.O ‡®ÆçAãÕd‘úCZŒ—ë{\TSëjkk‹ž¿b'Õ¸lÒÐCl‘W–²-•„ÿSIKý³â¥+¥àË’Ídñ/•¯ÿÓ¹5bø9nn¡üiïèðÖÄx¹HržÜyÿ[éqè&âÓ.?Âk@xýæÝÍÏý…—("owê½~»˜¹Cã$QZñ)¦i÷½¦¬WøláÃhJ×\ÝÆè¿y³3 ±Ô?::8ÇKÖj5Bé#Àš8_¾yÝ<ï0l?ë7›uð ÞÝPz¨µÂG ~¤öÑÈ „ôE—šíâÿí.>8ÀE3õ"As¿Ð rŒ¨q¸WF{ý=ì'ýméý*üãšAÅcøTµ(§¼;¿i5z6(…î ]“çQß(DQƒpÀì„”wïÞ•[k’—Q?Z3õÿTr©ª¸Q£ãUb4XÝãü3ѳ|~Õ¦`*º¡±+ˆ=9Ýš¸Ô32p”uÚÃ(áX5}óÜÊ®wØÜÜdÇ”“Ú9µ(LïÄU3F¦ÉUþ ¢ä¾0Tø@eZF[²*žÇ-œ;‹buò'õJy}€b¯Zeaù#'ðŸð*©|ø?Šì]Ò…ü¸õÄÄýªª´4•¯ÿ‹èör|Šè÷ÇEÐnÍXƒ²F§Uì‰EHœããN ûƒ>vö÷ØÚA½1(mæoøœ•¾@þ €ïúñþ³0Àµ9Yõ£ãA¯ßiµÒ³;„å!  a|»Dû’`µ~ û½~¯Dþø—¨~¯¶ë²©ÖPËüð|½àYŠ?ѱ®¤4ïÁ§W"ÿ~¯ÝÈ[õùòúA­ n°`ÅÝÕTGB¹»:Ê¢eøÈ„\ÞS•9\÷ã0*/­0¤ò‚ œó[â\ÏÅõ_ÉÅ<ŸštŠ@×]AhõÙ'Íù‚ˆUQh×&DSð[ðÞË3þx,ŽF@],U8—ÌBôttL¤­vx^)§ÉPp>Å7U²ÏS…ÈXH¡V5 ÅóÞ¦â‹ê J•£'¨á«•µy¡8;-Hf«5ÍOÊÿûàÿ¼WܦÕiããøŸï¬ršè œö”Tú a]Ÿ%‡z¾Q‚9 øÚöŒða˜*Å›UnqM‘¤",XB@uR?ñ}W6sWþª{Ší¦”4ÿ®”Ù‘½ O»jÓïuó^÷Z|X^ôJŸnq¦ßí19T^j òÒ踴ÿÉþO%•T¾5ü_¼nš­UtÝ ÃŒêaè"„M2Ù´Çû §5wØþܩ۟´“ØŠ¸"Œ-}ÙÜÜœäÕà‚ÅoTVøâp:c»úãaÙ¤=Q£¢v«%ò÷–=v]kIèˆn+ÙâË—/È£¼±¸)¯â½4:š,:\wù¿†VÕ“ª‡KKK¨ãÊMvRw!ÿ%F@“ N„Q#xS&S†ÊÂ-âȸÂi•Í¥ÛÉVüé}•BwÄ„È# Rî¤òUâÿ`‘᧢Ĺ¯ÌWÛïtÁf†Yk™–î¢çH¾õæºkäÍ)¥}Π{°_cX~šKÑä©Uù´GùP|ÁOoØÏ¶ygHM³w°ocì%ù*©¤òmâÿV«ã[ØQý¸HÎr+S^ A(cü(aÑ"·c¤KRnÔQ¶Aà(ÅLc=…œòXÁН¥!3.ý÷es¨úrÉgø¬B”74Ρ<\RkF`ã1£œM”Å}?Ñx j¯1==vÙÀ#€1ñsÁ`,œ`á¹ø'ºÇ^Š…&pÛÚÏ0-SŠaVgÀeÚD†lŸà߃ë Ü꼂 Ëü[Xà6røÒ®ÎAáM¹ˆØŽPZÎl&òSðÁ²ÛÊÌ‚ÞjÈ  þƒÔ‡ÍÍÍj#át‚Ô'¢ð¸al¡šcÑ‘Ð,ž ÆÎÖðȨk ¯§DŠâköY“óðáÃ(—Í5Çÿê*üSê†À·Òt¦øŸ_7þËnEÂz—ÿ5t+xæÛÃD¥KKK|‹ã{ÒÆ`öx¾ä®i×íf+ Nreã·Ÿ¾Þy?lwÛ›ÝîËŸ^ñéøÙîô^uº×äƒÎ¼Èø}Ë{›Ý¢o;íîÛV{kï`ra#êúâýŠ‘¦’J*©|cø;X«´ü‰âÿ…ƒ°$LŠ‚(2k†€4B\Ï îDÅQÞsÓ(H,²›ÝÙÙÇœ€w c²§¡â€Ùº™pÄ7PY±š)'&ÜÚÚR‡Ñ%²ÎD CÌÎÎÒw@£@kè‰8¢GÉÔ7šžž¦=³“ã*:/¨‡átIe'ôdÜžOœÕ¢hBé˜ß»wO‹GŒcÜU3¡+“ 8àçÅÀËüùÏSs¹öÌŸ[þ¯5­[¦³á¬zôŒT¾fü¯à1%É“ÝÈ›÷»…coÉdLt[~Zv³{B'ó~ï9__c4;¼a³VÆü/‚Ì÷òÆ Ÿ¿Ís¼óëíÖj§ó¬ÛyÖÉËOŸÕNŽó×䃎-w{O»=|?+:–¯·;/›­Fë];ÏnO0Xk½Ñ*hìÈ|Ð1rC õ®7ÈÆ' §€ßwÖðþÝnzMRI%•o ÿé{ƒv™Úfpþ®ßî¶Âélƒ„I#už¤,÷Ä“e[…÷Üð|Þï9åÛ­ ]ƒ§õÈ¢Ê H~°@Ä VI´¬È9ŽîØf¸*ã½°yŒÊâä–+Q°òƒã€r{5î[¢¨;‹2ê¬Oç…(ÆN0Ñ:ïâ¼™Ãé ¾aÁØŸò®^ѯ N‡–3¾Ý!œ¶Šáƒ¸\+Åÿù&ð¿Éÿƒ™•aî ’ÅåG3ЮN¿Ç8'¤l0¼l”믻JÑÀì†-ª>:\íz· J‘ML??¯¬â¡’(üà EîÕPÿ—8„7oÞÌÌÌÈ/ãª^sœvéþ¿2Žr6VšOù¿¾nüÊÿwpŠ R^Ñh¨/Å ïfÞ”ßxÍ£4šÊ“Â÷+J¶dZK7Iø_NE½7ºEŽcâÿ7ýÁ³úñÓúÑÆ`ð[ýx#|~>:´~O:Ížõ;8xÚm>n××Ãï矇Þ§±ÂÿÞ}ý2 Öºíåfýå ÷óÞûÇGïÐTmw½×Ýèçÿ¨Î¿ì×v v£³OÇËcÔùÛ»78~®]ë´VZ ôçY»‰š8~ÑëâçÑΓfãI»³Ú “ëý€>£ÎZ³±Ñngw&ÊA5Ѩ’µ_*©¤’ðÿ‡äÿ­ NkEúË‚P¦†-¯Ói°ªü_‚ÿþñ Ý y3o ån7©0eø«««á´´?Tl“>ª°A&U¼t!!“x Ó†Ó.¯H!\N+5ܵ3•¯ÿŸ]¤šï´Wþò¢{¢ ¡Ô²Q§Æu£ñî¸ES(pȇ%þß¼?:z Ýim³vûnl¼+€ú~6=MO¾ áiýàeÈ×óÖ««ï¬÷ÛÙÝ™lf"›žà7Îl‡þón3›ŸÉæ¦_ ò­^'»7_ü95‘Ý_x²ÿ7*ާ&–÷Vë‡Åñâ]žûÓ÷'¿.Ìewgy¯ëã½ÝõV=ûþ¡Îì–ªŠ¿¾}‹Ý›*z˜ð*©¤’ðÿ§àI|¦˜u@G ´yð¾:½#ÚA™,ø¹L²ÂÑ̪sS\®Ü(ÚÄ#›¢O‘«{³Ñ/k )—=Ÿ}ƒø?XäOëyÑdffæY¹T¾‚uÅ@ÁØÏÎÎ’;Ý‹2}øË‹k¿ù?·¼ê^’ñ…Åõ½½Ý0X®í­ÕëÏ[ÍÍÐÆ^i4ÿö¶°žÏîÎÿ²÷çWÛÍ_vß=ï¶k;p´Ù˼߇ðÛá~67[\r|”MM>)Z €âÛîÊÞ>žíd“S›­vñÓÌ,μl¶p€ïœ¹·ˆŸžì¾Ïæïþuãå^yù«nþ¢Þ@û[íÎ/;¯³‹š““}µó²?(Ú™š~ÖjÔÊ“øi«Õ/Ó"òï—æ^ÉÖ/•TRIøÿÃð¿;µ…RÙ}T?‰J‚'º<4Ë0˽!w0܆C}ïà…\À>®ñR¸·¹¹Y¤*1ð€$ÆÀÕŒöé Ô.üÓP«Hp×­¾ü/ÏÅAÕOµZÍ3§ò-ã½ÂxGîÝ»‡KÞ¿ÿ—¿ü…¡ðÊSsÄôŒ©9ѳÜlü?z—Îèô»ÚQ61UÄÏŸœÌææ³Åû/;gõãÕFóE§[œ™š¤ßÁ‹N‰üžìoõ{8ÈfŠ_ñŸÀ €;È,½îõ×ÁL?}_Ãqviý¸^r«‡'ùî-òÌß·¶³» àŠÊ“S€ýÅA‰ÿÁ’޽% €3…ÀnþuÛt¦[ôpvæq­övþ¹óz§ÙdüŸ^éâ\ °3tI%•TRIøÿlü¯þhw+¼ÛÊ Ž;­6ñ~P/X€~ hK—ºN¿NáÝ›·¿‡Ý¸9…b=B ŸˆÛiüó9"O²Ûd1”´ô[ÃÿzFr‚ Sàa—ÐISùÖð¿¸c¼Œcccø~ðà3yiå(÷Üßߟžžæµ /öàìîA» á% ÝoY&^µZÿØÚÌÞ áo¯^#ÀÁÓýC y í—yoå¸þ/7AeÀ~zfùèpæéáQ­”É¿êöñÉîLï䃭vŽ~^÷ÂËfßÙÒ£F{³ÕÅI@z ÷láþÓ÷ûk‡õñþ¼\;XÙ;Ìæï¡Ž1㿽}_ ÿÉ™¢¥GëÍöòÁÑ›нÍ.™ÜƒÐh¼nø?§¤ê$ÒÓP3J*©¤’ðÿÙø? ;O×7¯™7§Øï:ݼÑ!ÈÏ;…Ç\³×=îåùPAPß;ºAøß1?7ôׯ_‡¡Ó¨ÌÈ=°ÏÇ6èÈ¿Êh|Jqi?;ù ÊÿÙ>Ú¼{÷.žšò/ó'¦ºV޶T¾eüe x°xÍ™Äóe(Š”IÑ5@-ƒ*Þxü?Œ…š7{zgváþ¯«ëÙÄ7íö~)`ÿuw÷->øe÷=`vöè»~Ý?x‘÷ gÞ÷µÝòÏÿ~ó6›¿‹ [!<9:ÆÉ¿½}‡Ë×ö_õ×§~ó®°ä™bÏæváÉÞAi®3ýËÛÝÒÚgž7ZÙÝ{í.*à'ÜâMY}@SÙâÒ¯»µìû·ò>`?ÚDS¨ðß;¯²™™_Þ¾-Œ‚îL¼ëõÞÖ›ÙØDcì&üŸJ*©$üÿö?صE†2ÔƒG‹oÝ]z”ec·Ç&gfæ²l|îÞb66žÝ¿½°e·ÆîÝ¿wÁ Ü(zËl_ÜÊžiSÈÛý…{‘ƒ¾DãÄ—n™/¨–ñ¤®3ùÜñ?£ÌÈÑüÓhffæ:«HRùÜëÊ9züêß¾}{bbBi2”#[ø+‡¿~þ¿ÄÿƒF—À¸ÿOL½Ü}?ùÝ£ “pïîz«¾=ÈךÿÜÙÎf¦0øÒxö]áuÛÿÛn ÿ¨í Â÷?â|ñYzø¤Þüõð'W;y¶ø ›žD/¡þlñY|¸ZoŸOÎNþëÿ‘Ý{ðÏÝýì»?áÏõV¾|ØàO/»ƒÇ{GÅñ½ÙÔ\¶°¤«²Ù…Íß}½Õï‚gyÑ8Þn5²ñqÚÿ†«c§ŸìÿSI%•„ÿ?ÿW÷Óìöí­Vc£ÓÜl7·òËÏV«øs£ÛZÏ[Ø,^tšÛíÖ«ãzvgº;ݼ¥îâ>Ë”^ʦ—;²î˽Õq,wDnJhÅ?Ùa6¢œ­QØëI¾ööö„Ãõ}ppÀk]ÎO´Ö D3㌀‡ôt# wd¦°c$œv‰sÂÔÅñžîîvÝ©|›ëŠõUMéðøòÊ‚N&dÌÄ=77'' ò7:ÿ× ×/$ÿƒÐÊ{"ÏÀ‡óÞܽÞÜD?ªm„ü·ú~aöÓ<*“‚åøÍÏÚçýtÊO Ÿçåg=o¾Ä6Ô8Êv[ ²NÞmwøO%•Tþ¿ þ¿½Ñi¬æMâüòƒãµ¼ù¬ßZ´VzMü ^`³^Ï&§[¼QiJsYBè*î}ýúuußdúZb{GÚÒݳcoß¾—›gÕÁ–ñ•¨—…1iêÃ[ÈcTÃ÷úì9°X ¨û¢u€_‰‰EÅȰÏáüã¶ ðÏåäAþþOëªZð&NOO+l”ιãµÕq­VsNavv¯¶‡JS.õ›RŽu:¼><Èæg^þúþÍ/ï_†ýGµ•N};„ÿz÷êy¿»úËy«øt;øý¬ÛyÖý¬ßü4øYí6Ö:õõN}'äÙäXüÿ÷Ô)åG*©¤’ðÿ…ñ?Ðþr¯½š·×º'Ÿ•^gž„Îc|Åñó¼³ÑhfS³Mú]•eï郉•¨›Hx¯,UÔͽ•*x…m'–F;8I€onÍhÄÕôÙǽÝà=§î[d4èõìÑ&§ ˜Ÿ‘ £:+Á°ó‚8¾YB„ÿQÞ¿ÿäRIø?­+ÒRwq§ÈO‡ï¬òkèe÷Ü8‹²¼_¾z·}”·[…åO†We£s¼5è<9ÞûeïíVèm„.põ«~Þ·ZbìÕNëº|ŸúÔþ‰ÿ·zMàl-µNc¿Ý8j7“í*©¤’ðÿ§àÿµ¼ù¤_€ü•’ øìÿ5tðù-´ñ+ðÿzówüOd®f_¾|mlÑ}±í'SÌ.É„Ö°ë ·ibxìé‘Ý~°°ðÜñkµ+ƒ›Pý0T%DæýTxÐó0ŒªfN‘Áq4ûsVj¡„Ó>½ Af@ &ÅMø?­+/ÒEÒí—Þ¾cccø^ZZò$Ñ4DDñññ©©)yKÉ+F¾ò×tÒ˜·%ïÔûÝ"òçD¶¶¿»Ý©?;¨­Ö@—_v›¿¾û& мÀÇ›y{3omw¯Éwôiñ³Ým=?ªeK xÀÍ"1ýIšÊf»•^“TRI%áÿ‹Êÿð»Ë½îJÞ]Í‹o?tEWCþÛ øs½›o4ÚÙä|k:Ýž0³¶K@2ÙÐ4Î…q2çççq¼°°€ ?9&Ǧ,³4E=Ñ>·o…ìk”wîÜÑ‹›;XÜ…BûÅÅEtL½e‰BÇp~€p<99†šüùã?òB©*p<==?1 TSä™dÿéøŸÏT¬%fX‘‘þOëÊ”0àï&I ¨ßhþ‰ïÙÙY&ãûÞ½{<ÀÁ÷ßÏè@ÌÀâ6„7¢lnn„b#(R·`.Ææ§‹nÓwn-ÞÍ&ÆŠPúŒ?8M¾ï’ÆŠÏüL63õ¶~€AuýF«YÄÊ;é5I%•Tþ¿0þøç‚#x\â0øi£›oÞæ;ƒÐî.ºÂÌ’Œmmmýë¿þ« Ê„Ùx€ ;o8­M½{÷.BÎîæ‰«¢vFqpI Ø Œ÷èèÔG¨2“þð¹„R[À9aJ_g7N¢$e™‡ £¤t‘h„“IþåfÙ ßüOŸ 4p[‘z(áÿ´®¼pUÐz? #ÿ‹,Pn€“äÖ¥KB}Ê |ñ šÛ1Þ¨Ò¿û/#d8îåÇýØæŽ}mJѯՇ)èÕÉöðƒãÝÃÓj¥_6FÚí$ù*©¤’ðÿñÿ‹N˜­ûû‡*€'!Çøõe'ß>ngóÝaótƒ¥T>XVÜèàà@xœyš˜mÇk²3Ïl“Û.6eêßñ+À9vglß#ñ¿,…4:¶v³À ß4Úgœp\<ïuİ©»wïú4â't’?¹‘€'œv¹·;æFV ÿ§uÒ¾› æIú€e#µ!½ûÈ»äððœ~e—þ>7dÊB¿ÓÆ|…"Rsÿø°˜f»U¤ÌœøÌÖ£Ãf§Ýçž1èôÝüº|:ý^7à“—ŸnÎO¿Ý+4½ÁÐ3kÐï6'ÃL>©¤’JÂÿ‹ÿÓ>ÁÿÏ;'Z=äø¬”?mµ;¯Ž›ÙÄl¯l[çøø¸,pO;XnM 5i6Cƒ[N/‘²@|¿YŸ›8uôJßCËœ·oßJ¡xÀš$Ý»wl­xöq"2&k ;’)PDqp: L$ëâ`ÉÂé¡ §]J§éa]“ü?­«‘•)RPÌa½ìaƇËÉ“ëÞƒPàÍ•¨Ÿ<&êT…\üHÜk6ÝÎ 66xœH7;''Ëz[ù®ÝG›?‚þ Ÿ÷ŠÑ=è÷{íVÂÿ©¤’JÂÿÄÿÝÖZ¯ó<Ï #ÿN½Û/²äýÕþv¸ÿ2„6êÇË[¯üðçfë£í-=[æAÌ\½^÷€—¸ÏŠkO¯ÕjtHåfá´RL— £¹:ã)•M*ß캺¿pxxˆ577's b~† ÔsúÆy6]JžÁ-ã:7ƒ^7ºÎÞ9>ßçTʃúѱ~-4ƒÐj4ùgÞéF°ßé@·,ÅT—‘ÿ‹«úƒ«Y„Ÿ5Ï£D^bK¯ ?Ÿ;?f*©¤ÍëFâÿî`-¬‡ð¿ß¿Û a¹qøl¯Ö!»µ}óæ ¾acrrrkkˉÞO?ý„Ž=yòärç_ÈŸÞ¾tñKñÆáÿPJq ÃèHNñlÂÿi]}J}%õ§c~r‘z‰ œQz‘›¦^$_€Ë#Õäç.´ŸKòÅõbÕþx†Ñêóã'¨‘«I†Ž®*X\?ö²¹3hò^¹šþàr4ÂåA˜/»nSI%áÿ«ÄÿëíÆ³nkµÓYkwÖ[ùZ;_m÷–»½—!¼áY/Z?x~xк(þ'qýH®¥¦—¬ìO^ºñŒì‹Ð~’`Ühü Çô)áÿ´®>¥>H/'Q¢¬@¬Á‡Dô%mqàJ²5âveFDÊ¢®xij«/gõG“œ)ð‡LøUŽ‹b÷¿tTÌ4ÓΓ~îþø%lŠÍ~Áu›J* ÿ_½üÿY¿³ÖËKÀ‰üÿYoðŸµÚJ?_îv^…Á«Nûm£üŸ÷>š`´ í¤",®pŒ¤@—.zâxAÙ¾Íü¼7ÿ»ÙZVÊé„ÿÓºú”ú7ÀÌÈÁœÑ ΧÔ0?a•z";^Y®fÞt/wMú‚ed8crÍCYôùr$Šq¾H˜e<Ù?\ (.˜bÄiF²½šþЪªÊ>|‘u›J* ÿ_yüŸf™ù‹.À=|Ö:ý•¼¿Âÿzýj#„_vŸÖvky>>3süÏB©H ûÀM–êKZɵö…N)ƒzßTnþGyôè €ïS ÿ§uõ)õ™ìƒù¿Ê€AäþïÁ²(X¥²0¤!©Ö§ò•_×-pSÅ>ú‚Vgõ‡žØRøüsÙÌ\6;{ëÿúÙìtöÝýlr¢ÈÉr!ûÀoÒYo’˜ðO—¶°_.>—(eGGGGÉ èÆáeò3båþOëêÂõ¹®È ŒÀí²(JÀóçÏ?ª·Š ìII¢î]àšá—#xùâ9ýqTù!¦/ºD¼läCää—»Ãe‹ÄÝ5ÃQÔëÏÝŸè*oð‹¬ÛTRIøÿêñÿf¯³òõAÿE¿¿Ñ /úa½VáYÿÏëíÍVÚÇkGûý>îÝÍû›:+IŒ3¥_ºp^¼†d©Ü8ü/Û Œ¨Hø?­« ×Çúé§Ÿ¤vT´Oü(´,éhTïŒBhÉ.p_’5A\¥¿š¢Û±Wã*û±ýQneþZ«ÕΉ¶ä Úxpe tuu•¨˜&7—Þ>µRŽÿá¸.±?4þáÊg³_vݦ’JÂÿW‰ÿ×:§yk¹ÛyÖí¬vr|žuzO»½_Ú­íþº_ÛÝín{ëø•óp‘pËnêOZG‚£ü_Ÿ#<…o%QX³TnþŸœœT‚9Wß$üŸÖÕ§Ô§üŸ—PŒLkêjÌÃ?¤Ä`Jqf~~žPŠ¿Ò®ã Rò²·$¢Cg¾ÔC<«?®|™™™ `úB 82åš¹‚¸F¸Ë;w$¼b.— `X<ÏeyŽ´ê²ú£yzh÷¥Öm*©$üõøÿy·¹Ük¯äÝÒ ‡Ïj·¿œ÷ŸðaþßæËnk»~œMÞéNð?é{IDÃcÑü‰T'XÒ^¦æQÇ\:†ÄÜ£iÌ?rS®ªAÉkxÆ(Fö“pO’ßGä/Ì.iÒTYþ§j¼ª¼¦wûÌþóÖ×(ØÈÎÎŽZæ­o«r)ø_`žOJO¿šù7 $†úï¾ûîÊìF–Ș-bR>küð„ÿ?¶>ýʃÙ(¹ž —¢‡¯‘¹µl§5Å1º!€±¨WãĄ߄‹øV>t& žC%tQ3ô–ƒÅöÜÁ¼O8ßV®­mž$Y&Ä¥ˆh_4Yåð^ŒßnCÑN>£6qæ'&&ÀM°·rh¥;­ïüSO\‚…?ó¾bå–––<œDâš- ´/ºÄjÕ'Îç"D%Ê!ûn¥þˆµd€ aaaA³ä=÷c¶¯'¨Í+ò©êâ%E‘/å1úô P?’­yîTRI›×õÇÿOú¿ãÿÕno%?ÁÿOBþ¤ãÿãF½Šð£ˆy2…Ù”¼Bþ›ö ßsssjÁ'Í÷\‚H·‚EX1Ú&Dü¹E.ƨÆÎWi©È¦Z@ÚÕ½öwʈ Âülœb®ÅÅE‘JªnGê>”á›ÂÿÕ(>|¨G·Am»Û:§ð‹¯ô“ý玞ðÿÅêã×ÙÙY!=½ÂxÞøú ; ä «˜ÿκ^=þ÷&’¥JÒ»wï*Ý9sµàO jL Ý¢IÇ@¾è"===Ý(‹²r‹ÐÉÐo%Á!ê }N2y.4èîo+Žñ+“,WS)Àx_a˜~jjê$ÿW©^‘×6)æŸÝ;‹œzªwbZ4®³$§oŒ[K‚'±Z|zÙC Ÿ~â<À-´ÇñF†œ¹/1™¼»ËŽt¼½½nxòN)‹¢É‡…$”ÜGªôè,˜4t†Õp-îÎ:’Åጄ-øÆä€ýáµ ßÄî‰;À]Ð&:bU•K%m^7ÿ¯å#ðÿ“^ÿÉÿ¯ôšÝÖfãÿ7Û­`öؤê.KÚqò.œÆ_ÝLÙÈ ð'P%â>Ç-XSÌîîjâ$72´êâwö–t]uá­Ò€²( ‚t¦ŠVM:Ï{in¥Æ}õê•KB$»¡¶<înõ­áŸd>b ÊWùÜ%¸Sà;JÛeáfôÅ']ôPW?<áÿ ÔçûHhØÓ§cÁâÜ»wÏ1¶ Y<€Fü‰:€a¼öKÉÿÑ[³Éžhù þI»ú v¤é¢#bhSP*¼‰ ™’º«}‚v6H>]”˜ zœ| ÉQpæßլÒðƒV'È$)ÀU‹¨%Ÿ‹§˜=}à$u'×Ã^ñ›-€ u³e© ý oT/‹¯ÍÀúúº3\ÀÉZÚ@5 Îz…rat•$—»º$”)5É\à<™8þä1¢Œèþýû:ƒ™wîX\†ÆŽ ž{ƒå(P™*3]NA_rµK%•›…ÿ—{Ý‚8ÿÂÿ½A_t†¤Ô`®,}xD2‰DØõ§(á²È˜çAx#ƒU÷BÚÛÛcS“““¢ÆÚ¹Ø%ÑInÙ4:’°È£üé è9ï"´/ï?¯‰v°i<ÿã?ò wC y0!>t«`—üÚs¾5‡èru)ø_“ ±Å€üI-ëŽ,¾õkóú²“†ý¢ Ÿ)~xÂÿŸ‚ÿ¥Äb£h”+ŠB2“ì¹ÈÚYN Éã²hM~ü_5ÁÑÿ`†ˆÑŒ Q§†£ÿì-fC¦Mô‰É…óÝ­˜An\K1(0šå1Ù+Ðv4È™{,)¤äEè6­’@œÉ•PÏjKKKátP ‘ÞícPlh™9ˆ¹93è\ò—¿ü…·Àå”&‰ qVýáäW_IéÑIÐ72›|@.‹è!ñ6¹0>;ʈð´11ž Hñ›ÅV‚õÉ Ûx‚šmŠÚXGô–·ÀI¼ÿžs‹° ‘ ÉÇÈY¥®?9Ù¥’Ê׉ÿ§ît†þ¿¤“   h 4”‡äû £aˆbp&É¢˜‚gha ’NBÇv$Wá-´M€B*í#uÁNíYY¤ÛYHÑ,‘núèÑ#ô{6)¢}y4(m]¢8u8IBM„Qà 턈þíßþM®IBt\c²ð×»,•"_j1( KÞ_PþeFX+[óº:èŽd´õq¦J<9R Ч”l…&\ÛzC]tÃäYÆä³ÍÅÅEÉsóáÇ8Cjöñ^Óš…Z Î0/GÞ¼yCB†IÄx!Ÿ‚›è¸Ü†¬„ˆ9›â¯-jtÍ{„Õ•BKÈ'™¤Lóàâô°\ˆ>s#cgÅE 9™´ÿáÕF\ë]eSÚÙÊÖ8Ã;Nºá?Ü…Cc7¢e€7BѱøM¥ Öf,îŽiOQƒRI›×MÄÿ+yoùð? uˆ®ûãB 9¸HBj;µyt#ÒP±âÖFæ²× POª[à€ö9jG’î†Ü‹Iýøh@ÁÐÉÈ•žÂj(]=$ÙÄ@ÀA |ËíW¡H¢ˆ¹Ä\¨‰Îã''•¼ÝHÏ‚oÿs*¸QbJÁqwãSÖ4º/îèÆ _Pþï.¢ò_©H)5¯þ— _|·'¡Ù¹ç¢â1ñ¼LÑÐÉ=Öª{<}Aù¿ç5vU¦ ¼ENñâpÒøÐ=°$TÇ`£´é2qqE­ ½Uó©ç"T,—ä`6Kª£Ö(ñѹÅß²ÈæGb¾,<,[渤Ñí$pÓ™[¹û¶Â±³¾‡ÙQ}¬ÖÁRnzöG“ƒËkµšÛK¶ RÓ*‹Ô£2Át©îëfåJ¡tùMË0Õ£.„aþ5šgänþ(‰[*©$üsñÿÁÑIøŒˆ‚€ZRJ W/JÉ(ßÓ“êS(!¨?%$á%¤*Ò ›€_é—$“]—íûtÀÍx"g+ƒ‚ ¹ú’Æ<ì±:;Œc úÔ`0õ1꣑é²`’zš!‘b†­@ ²}º‰‘Ö.ÿk‡ÒöñàÁ0SüӈǞₑÂuJ AxÉgý¹ã‡'üúÀ6÷ïßw"0ï@>\K·þãñÑÎÈ@p#ùþˆøà¦\¢_ÿ¶éOôSáÅôŠáäúúz¨øj9ÞÃI½V ¤#Z'NAvàjDŽ¥òÍç¯ÿãF‚(Ü}dÓõ‡O-9¬@p)Êá ¦Î÷Ya?)€hË„ŸR2ë€ÿQGñ?…Ǭ5Bªójt^ \UP/,0v^h…ÜÎõvó@C‹ ÅÔMp®K<’óYtÃ/¬¦çPnŠ/õÁÈ­DáèEˆ"»¦Hbï\ƒÓýª÷ÑÅ8~ %|Q–g΀¯ štª®@gUÎW0$?¯©Ðª–ˆÞ¥gΚ)1ŠØ7)M"*T£d+ÿõHžEü ¯1ý$†Âs´yŠ2VŽ<û8(zmDÃÔTè;š@׃xn- Z4ùt±ŸxX)K* ÿg·ž OBkµQÙé¼*aÿr?ËÁ‹^xÂìín„°>èd·'DkFæs¿)v$­»»»ny‰åcó¹_ÃB‚,í¹DR$ÚxÜŽˆ.KþïætB<·{}vØY97¦º²ÕˆþȆM‚DM H\¶™Ê—•ÿ?xð€~’íOMM‘¸yþ£0´*üðòúõëÿ÷g|g:®fÞ¤Js‹×;k@O¥`Ö,‚‹Uv A&ß¾˜GÒ …úí?Ñr&Ê´¨Zž—9Êœ(c˜H«+ǾwüÓ=­x\«Õ”ÆQùe¤=qT,r‡úìÃÈ÷hV3&ïfTÕqEÉ.éV±$èW£¥²- >u42yÍÔx© ³€Æ=¿ ]<4Xñ¿œ W@¸¾@ÝóhW ٭Ǫ!G«(€h­êBò:O4ÚaÙ%zâ‹“¢H”¥Ž}{ùòeÄïD¦\©¤ò âÿ•As-ôVwºùoÇÿ±W{Â/ýÞ?ë ÿïÆ&¾ÿÞ:~\ß_üÓO ! ¸‘:x$ ×ÕÏ‘˜®ë£Œ0?E~^… 7HÚàêc>>š@“GÏôåÿnÍKÊ<;;{‰öMD;,=)dFéâÕð_©1ËOf¢Xß©|qü¿¹¹©´J´ä™œœÄÃø;G@¯¥Û_F^DòÊ’"IØ.Ê ¼äYÈ#ÑnôâBÐCbfzIJsÊ?¹ÚÙld]ãtƒïµÛjªWJø¥«$8zõê•SQ'¡t"ðÛ–E=ôœà¢P‹ˆG]â åG–CkÝWmʉ@¦b¶äCGƒgKT42刜‘=a†‘jž^Å΋Å@ç« GÅLò÷”гZÉ/Ø+=Gqy(‚ÖÁô›Õ¬š/^¼ð ¯-— 6Ë´n ¥üy‚ó'=ñÈp œÚ~Yô^ˆ]JÊRIø?›¸ýs£ö·F Tf¶áq«ý ø¿ÓyÞé¿ Ÿ'íÖZË“m1Zö_j]YÜΰ-«ND›µ‡LåËÊÿ=\ ¡ˆ‘GsÒóý¨Ì Z»IRãȨÃ)^ÕÑž •¯ž3Ë.»  Xïå®Ã>’nx>5 Sg‡—~dß‚™šó)”­š¤ín@¢ñrNئà1ÚÔê¾BÄãÜÝx£gÏž¹>‚šÑ¸\ô„ùA ¸Êmü¦JÙMšÇRƒ‘ÜÓbÓõ …ûÐ% UÏ‘!U«¦bKŠŒ€Ç;bãÌ×ãK½“Îèy‘)“ @}…•Û±KŠzäo/hºœTþ¿¶ø?ûײ¹‰ìÞýl|2›œÍ¦¦³ÙÙlf6›[Ì&f³¥ï²iœ™ÌîÝÍÆ&ý$Ýð·û:ç9¢ÊÕE—kŒá"kF–Àþrþnu §H$šÃ!s';UG¬[?ÿËçZQaÏWʸ«¼y¡ç¸2ý nA€Ä˜?ñ}Sš¡”ü÷:àgÌå"Já*W”‚ü_Ìø_né4Z¾z§‰5¨Å (’ J¨Dã”Z÷£Q4GÂŒ)ðy݈¨oJŸë……:ŽMLLø>‚žóîºD¾¨ ¼ÌŽÍÍÍQ“«÷fWÁGèññq`"ãßø“Oó¿(l5›rŽ^l]$¯æ­e9r\øVjƒh%»#¶Æ(’ ù2öGAªe®IÎN Ø]ž5á‘/Xbh)80Õ=Bû¨ìØ+E"íìŽOYg¨sYÄ(½¥¨¾©¦ïa¨mYZJ¨B] Ÿ‹‹vÉÌÆÆF•\¤’Ê7ŠÿÇoÿ|øîçãÚþ ¼xS«õÂz³½Òiƒ†¾jöŸ½®½ÉÃÓÃü¹ƒ·olâø°ÎÖ’ö:ò¿¶P‡ýÅøLù ¹ïßÄxh‘…;U¹É¥/ƒË’ÿ‡¡²$ùç?Zÿj#c¸lÝÚí®¯ }1;g$$”²~ggÇèלÊç–ÿK^E˜‘€T>­—b-à …?+e“ò 333œFfæx#øêqøb{° œ{O·?‹nð*á[ºÆËß“/)€¥Çÿtž:Š?5³ÒQª2ùÛ¢BÕdųkÉÊEéWDs$îà*ªf'ŒòÏSN.£ÅÊ;k\Þí0tI`VÊpZ-ÂQ{`=—0(ŸO*._$¨×œÓÜ{%£ ¯Œ:KKK \U-¹·ó)‡##9Ž•W‚AqùôÝS›7Å]øÒU™ ÎüÈ AÎázäX1w:´99a¥’ðÿoǵw!,o½:lvÁ×­½_>8¨µ _«ïj/Z­åfýE»‘Ý:‘ÿ‡Q~CrR@ËkŽü£­ùŸ»£Ö(æM)Ü:9ºu; f/qYø_Ò§ˆÈŸÿ¹ú†E¯aOáz5K‘‚>¥±ˆ²yI^×ÿGøÇ¹u´ðYhl¡ñ¼t WS¢{‘y>DQ§(l)@xt†i Ø0™áâ€òþýû´0?‡n82§ üìì,À¡ €3Ûòõ§IŒRÐRu´)ÊšlÜ 3á²)sÃ%Ü¿ŒS'eýô94\ÞœuØ– /:ƒK”·…]BMt[o7êÿðÃ@¤Ú‚§£ûÀYã¢ÐßBÂÎ…aMbâî¸Ð³¢»\]ã»ï¾Ã@Ë™[Y‹œBuIðÉw2…«ðÄñ« ®äÿ2??N> Cãe±lÖ©Ÿ7YI?¸l»‰¬Õ¨C©~¤ ¥M¦Wì˜R J!|5i˜ _ð¬Àq’,¥@©$üÿrÐùÛ»lj&»u'›Ì&¦²»  GÙ­ò3=ŸÍÌ>9ÞRâÿz½'\Q‡ñô®'þw‰Üç0URH盈üÃiËOÒLQfbƒËÂÿ .¡ÈŸÒm$ÞÞSYuÐ[uþŠ.ø¦W£m‡Óùw¸& ùeñ¿݇a”{׃cÀ@¹+~Tñ À’Wÿ‡¢QÑ­7aìˆÆ£ŠÎÑi øU\€¤%._=‹n(i—†¯¸^Œ éÝ# Æ×_vº ì†Lq‚e“†Tè-¶à‘ü•–5òIj„êÅ™ÅRaÄ0ÊãÆˆ—ÀÀ¼…,vˆ*ãÍ*ø’û pZFŽ ™’1’›á^ÔCa>SN¶4ž*eww—ÃÁ…e!ðÒGX«ºÇ›g˜µ<Ô[…*âp´ÎÑ,ZÃ%n…?=L(Y\\Ô£G·ÅÓ¡¦æ<․6«âyº¥QÉ%G ^O““ª‡‘¯D*©|›øÿy·¹Þnec·²;@øÙí PϬ¤LLŒÏðϵNãe·v€ÍSÛ(§' f@ÂW TkffF~:nMú쉀@Î;2eô­“¤©ªÁŒp¬‡†‹ö©èÅWeš‹xÃL÷!’¾’¨¤„Ü/ÎmJ}»tÿ¸(€³ü)dµèýÇ™:”3Ò¶ƒ2ËÀU#ú°¥²’¦Á¹Ü)˜É¨g>ú¨¢Ç`âÉ èep-÷)öœÓBËü(ò¹Ç™_L‹D@BϺZp;ŠÈ„ú|ÁW÷Ùè• §­²åšê6¾pð•(–ÊÀû‡º‰@]ûÆ©ã›ë™¹"MM ª©Ne Ä'u=¸Ý˜'”6’¸‚8(€¿_ï2ÓçñZ 2\Ëc¬^ŠèYYSú!ü5eòžç¼†æa"Ȧ1ü#fž¦JÂuoÞ¼¢#]Ekð¤ÛRJnþ'~æ^”(]­ýU,d|¢³1Í€Ü(ðRË&J¤Æw³ø%V ‰ÿÕ[m²lP­q68¥RÊëÙiyœC—DÞÅñÉ£¼:.]pëí!þàíîFàP ê…Š’*êÕ«úۂ€ŒË‰ B캑‡D±XÍ…yúxÑ ÌY•{(lïkʶÐE»nÊšò] ”Fá©qÆ#°PïhÔøcǧ"›zpžÄ}«É©#}z‚G†]ì¬þS–%¯É‘ú `zv—B¹…²Ð,­Êõpµx`=]~ë+-þø03ø^ZZúC½ ^%<>Šþð”9·x4¾ÀإĚ@ýÉ'BQ³Çÿä­¢< r}J”GI1N5uXœåÓ"œ†Ì?jr¤TP뇖iÀ÷”Fõ¨§ã‚€P ‹o"y´©8«˜¾8xYdpBŸ2]åÞ¸[[[´ÿ f à oÐYö?xÖ’Õh6ÔŒg0pb`W}J—DÁ—( oÇâãâ"¡û€Â]žoÿƒÉ'‘’DŸeÿ£õ,"/[|³)¾Q(=ðçŸþô'^å2¥*]ò<žìÓYãâ[#W_´£×MìŸugÙGá —=¹?^øðáC¶ƒðÄÑ=LØ9>`Š0ÃŒaE¿rú#A8žSI囯ÿÙÄxÿÇ ü?†oü›¾=Yü91îøŸ"VÒÒ ß/@`¥%”©!IÎ@áOj$YÁí-}?ŠÀÄ>ªƒÖh½CkRÊrq@+Ç`æ¼d¦,vÒöA1K°èm>]F‘¦q ¤$”Éð<åB"ª£!›U{è6ÑQÔ©¨€%À I{ˆ9áRîY±. ¢Œ¢|„¡/P(×ÇËíussSÀõSì[о‚W_ÌîZ FlŹհu.nòSɵР‘tdQ\t—’ågí¿Dþxâ2––üÇÙt ØWºÉðüu¥<­|…çæG.!Œ/r)¡$f#ÿ™B|zÑJvm&ƒ‘JjQ/Kx“Ñ&%—Pz‹‘!vÏ/ôÞ>®^BJ%õ7‚t•»‰uåS©9üñy £ªÿ¯â ©?œ.%M`o}Þ$ýVŠ+ߌ<”Mdû'}®Ç"¿f×XiÆÎòÿÕ’fP1‘ªrÔ_݇÷,ºä Ñ¢×ð¬q)n³Ûdz}|K{–´›r)d“r=«Aî¹ ¯­±øØy/ Íü§ê<'¤šÊ·ŒÿOìJü ø?Ë 9ÏØÓøølrPìžu¼ž`ÉI!e¾Hñ8^Xðì êh8Ÿ9Ó±K\ƘVúDi6ÁGô2 n᎜ÓѲ÷•Ž›м‰ÄD\ŒN›ƒ†Ó®»J†.›Ríà/¤cò:IY  §eÁƒŒ3eµN îÎ ¸×ââ"~%ØÓÁšÜ+#ëqê Å%#òt€ßÚ…™_’3é>¿â›<5¤`ÕÓUÅ®Š?ªÈ´À³Éî ëÐáíµ¢Œóž»G^f|âX]gõ?ÚÐÑ&¯=+ΞnêÃäs÷š‚ž,IŠŠ»¿Ê¢ù$fÐÛ}ÎsÃ`û¨9ÝK鿆sŠñèy£"n‚zˆ”ZÓ¥÷šûÊý +MdÁé¿àMÒ§CDŠ  ¿ó |g?„¢¸˜Z²TÒr*C®Ø[ó/šÀ:¤E|:|ƒÐ7œØSgΊÿAeáÒ³8t7ûä’à|*p/{·{÷u82þ§è€,a<\g5þg¤ÔPèÚ0´¥/­?>’&[©³è’Þ5UÐûxָĀˆTJÎFܹ&z¿´ hŽå©993¾éD>&\ΧD )ðÈh¡tþ<§’Ê7ŒÿÛ1þ¿UèyïdÙìØDñçøøZ§Äÿ㓽pHà\qÚøáBtÃWpSéy†{¨»óøåÁ\º"ŠD1ìÈ(j~ ñ*“#@,‰ÆÛ·oÙ²©ÎÂí‘ÔQmVç…@àb‚Îâ#x‰|feQO£S%JZRBÝš:yŸ‘š±q÷ÚdfìòC‘ô¥¥%êÁ©B¥’… mnÁñahÂîU÷±åÍ›7’k} ¾¢åíf£Ô3¾±Ÿ íSŽˆ8'¨×ˆxïpF¾ üD>…Šu±ÃÂzîÜiáÞ1_e¼Ñ$looŸƒÿ=;ÕH"—‡‘KOzfXÉ™µ–Üxûê£úÿËî;> =’éq£}A)±ä¡ò'¾DÑ\´h%Š „Ùñ¤¯aÏ™H(ë|:/œ_MÐæÙ²ô–Ìÿ…6yùA³qÉ„ù>F|½¸uæêÒ{­Ê£G£ªyÍ¢hnÏÊÿ¥ öžYÀÉ—†ïÚ|vžB÷,º$U©r²óTªŽ‹%ç)42wÚsyþ¬ühR.àAæ]$ÉÁˆ"ÖÞCmDP¤~ª:Ï©¤ò-ãÿµNaÛ3^$#þ/ÃÁ ÿOŒÿ¯ç­ìö4^Ô^ÿd×ð£Eè£GˆÛnCÅJùÁƒ4ŸÖZí×’ë*bà0ÌJ©\ᔎRM †B&4NÜdäÃv_çææfggIÖД6†3ìvxo‡ ×VNuβ#B;47’´¦ˆŽw¡†"T"¼Éõ 2§kÏ+[°˜6qä B¸Ï§NÄ_²;Ò0ø£J„Ì%úØžóª¾ÇäT‚HÌ Œ#íƒlo8"=qVÿ}÷j’´­š/ƒ?E; þtˆ+€!Ÿq¼&ÏŸ?w6ík•ÿûêrp糊`8VéO±Ö33§]æ ÒÇEèÅÑ—l-µà* €òUјMQåÅ–†Ó®ñ”Üò špJê’0´ˆÓ¯çˆRݱÚ3í Jæìö'Q,V"ÉÕ  Xº×'½‰b÷Ü)XŒž HDäŠÅ.qÓÑ‚µ!aegRØùœº[“‡Á—1î‡(Nµ¯Rra(r¢60¢„þÔ|JÏ¢KUú©µqθ\kÉ•io£¸Ž•wwÆD¹y©ö4ɺ‘³¥®"!çÎJç;ržSIå[Æÿk§ñÿ-Ãÿs·~ÇÿÏ{­l|º3”ÿƒÔH1Çwxž¢ ר ½xHvÖa&)‰ (XˆŒIØ”øzf‰Š`§ =ºŽ§^Rg´ÍQš'š9ÒoWûÕÖ,uâ"}¢–UÔ*?b‰}"I Ç儎"/vL¶0QT·*á ä,]X2,w¿h³pãÝ”;;öQÑûÏ‚îôÔþý…K,Ñ”ë_‚Ùýj€>~ ™±§’w©Ôʳ#E¦š/#zÐU±l%Ã#_)á‘âu|Ý$4Š-ïA<ªÅ¸ÜP?ZÏš´(uE¾ØÑ ž ¥¼ž!DDd\ÈqÒ‰ˆ¶È\$T’¤(\§/l=Ÿùs6'qj\¿üÝ$8*KÔš²;ÕÕÊÞ\—÷r2%ã@Y­«r$…»•ÂrJœé€Ü°JT]7U¸<ù7)·rUiâ3Ëï+Ú $FðiKëÈIà’ЫtÉ׆ºêŒUu\®üˆ­?)7ÄÒ¼ÉúKo¥X¹¸µ¿ìZ#¥•̺"·ŽH¢uÖ<§’Ê·*ÿoøÿöDÿ¿ÿöÿ·ðߨñÉâ~ãëziÿ3“÷‘gÿ¹‡èƒò­«r&% c.Û‰˜ÜáËGA#RoøKí—h7”í%!=ÝL@Ö€Õ¸ÕpCPu,ºtVQ¬S³ÈÈVjVf’Ų™™™!͌쓽‡Qœ7µp1úÆž0ªO¤àv¾ÀgFN¯œmôüñ#¶èÂÁ™«† ‘ÿ¯Çÿ”½M¤Ñp2‡OÇíó‡àOÁÜ…J¾Œ(d–¿Ôž„Ó&¾ahýî—PßýU_i’6œƒÿܾ}[qÀèïã1¾\> à38pó!Nµ¢°ºŠ¢D^Ïì‘c8³IÒWޏ¹¸¹«Dõ,´†EÆGJ!ªª·`6çê¡Ì«¼Ï¥.ˆpyÉØËJ_ÎþN|Âi¯[5Eƒè!*’/ôäÝQÎ2O»æ„N#,tŽ@$Z=Tƒ„‹ž2 0EŸÖ ÈZ†d”'Djß`)?¤)Ð0}Iº‰cݰEæñ±WSQGyœµÈåÿ«ù—C¾!RpÆó¼Œá5‡Š~à\*©|•øÿÙAm7„¼yõ:ïRl6—ßí­îm÷ kµ—­úÆñá›úQv;»þ—hšbùH‚ÿ+ÀWxŽ‘ Ï}Ö¤düLÉ€ªúÙ³æ3áÿ‹‰”£Xv¾2©:¿2«ïíím¹¨(àyMèbÁ‘¾büïHLáÅÞ¿ÏhÀRÑ0˜¾<Ê(Äšàh1HÛ9+Öº®\«"i5z*u”Šw$ ãââªBJ´ŽæšudXå)k%èæ¯¸Ð™Ö0ô‰B KQ+Kr°M SW›FdÙ-?eÂ$"Œ pª€ZŠÏ/˜-Çœ†Iç%FF5ö6ŠèNÛÃÐ/;ÒVˆ‹” Þµ‚åhЙ—0TѪ3胖½ôé쬢íõ»ÀÿûÇGpÓmÇee"J3ÕèפD&ŽÚ×$,b” ·›½¬2Ò?ëœùLøÿÂø_Ú( E5¥’³]¥×'ÃCEwŒLX/–ù+Æÿ|ˆ 8,ÚeÕëxš?b{Ya¹R.´ÿ§¨özNr)zò/7Ô§­¦‚s+×®±(`Žü.y^¾TátÎAÇ¢‘;­K{PsnnNšÔ=ºÓÊû5J8ÌJÄ£. ·K•,>BªRg¥±6„¨%§Ûš;¬…ÓB{Wqêdh$¯ÛÈÚP¬ ƒW³w ÃÀ¡riA—dð㌆™óeÚø+s"ø–z§,ÎÓ)R+;&«~Q?ùs¤|âô“MX.•T¾Vü?þÓÙÌD¶t?›œÌ&g³‰éìÎt65Ý]Ȧ§³‡KÙÔD69žÍMgãYþñòÿHÐä6„Z¾žÎ8ޫȃ)RŒ^ºžôü¸‘Ñ|&ü±Âˆîè¹KöüQºÎ˜ŒFÆ·oßp—ǽD‹_w °ZW. ¦S?S9,--á5‰2h+ñ¨\ªÅ&`=𵚚šøa J¹#C^[£Ð(‰ ÝU Žð0åùŽØ=ØB0 ¹¯L)…Åk0\•gÐÃX Ê,J7—öÈÔJOP4M=‘FÀ#ÿ€ SM´ðÝwß—%"žj0 !¥E¹B///‹p®ô½_«¼óSâÄÒçÁù)^ŽQ¸k‰»Ê:7§ÓsÕi]_ ¶B!¼O(J凌 C¸ÍÍÍ`ÎáH5˜J*ß&þzTûù¸¶›^õÃZ½ùjVíÕ¼»Yž\iï„|³qx1üObâžAnK/±Ë5´ÿ‰“ƒ%——¼1Šr)å¬ü,gÍgÂÿ+J¬¦‡+³[í˜dìïÿò/ÿr¹ú³ŠÜNG® Mòõ4>ÿ‚ëŠõÁ1))¹ROOOÓ칪nÔI¢ ÆéÒ«ú?*hصµ‹r&"ÅÁíÛ·…½ÃiI2Çè:ò5Ì'ÌšÓ¢ù$OªÐ‚èZ·Š º°° x×çîÝ»lE×ÒŸBΛÔàð*êh¦EV=DeŒˆá¦54r>”¼]„ì¾ÐmšÖ+¦0ÑŠ8‡óîZ!˜ ܽe"iùŒWY ÇùsssQ0g](ÖɃ9ká³DûÔ3‹_™&!:Ö3hàOœ§²Ä Ç|:ž4,s0?èdÿŸJ*_+þ_Ï›¡ÿ´q¼ÑÏŸþünw+„güLJk!üߛ렿ËÇ{k‡ïïþôc3ôŸ6t!i¢9îµ}”Þ·HH5RÄtY pd~öóç3áÿ-Ä .fв¯hVñ_AÈMñza*i’”ÀTkò«Ê}Ժ¯ÊîÊ4r¨T)P8Ä`ŒÁ%¼àBõ˜|Gø¨FP-¼t ©Cý“çËH}¦™ÓKñ ¡0?ãš2› eÎt©æ|šú•™æë"Sóóóx^J ÆØûÌWîü&|rrÒsW¢£2ЩšuO z1 {âb\ÏL(T‚(ŰÞ±9Ê¥HV‚­E–B´#gá6TRé$yL~‹t0€›sCUÐN[²0 jM¨à˜\82’¿xL£Ç=#YÃÎ6[GÀ¬=žÐ$X"4E>K1aT¤TRIåëÀÿÏ»ÍgƒîÓVóyžêo Â67ÜË—CÇÿ¹÷ºP ôšÙÄXçBö?«««a ¡êk¦Àk×Ö˜›>§Ni?ì—%|ž`,"ÔÜ.IêϚτÿ/V¢­6Š+JËÆŠ¹‚θ¯0’Ç3¡cã·à‘w1ù?­A~øá® P)‰ª„‹µ¨wM©‚pRéhUP92w¿V% ±N™°²„{â g ˜ …s‚càmŠôyƆ¡ íë€Ô*e,}ízÝÈh3²Ž=zDŠÊo@q\ÆD¢ò;wî°e_Q®Iô„vS”8OôSW 3öŽ|~Ulù#¼ûrPhÕQ8"r@Êð.;+éAÈk0; ø7ù£“8#ÏÃHFUù(É 9Pg¼}n˜¨(;Qás;Ày>+—b*©¤òuàÿ•æÑ¯­ãÍ~>Øßá·ãÆoÍÖÓAÿiÿè´VBxš·×÷·:ÍìÎíöÇãÆØ—A}Ù'AŸ)„Î¥ÈcAu=L„¢…£ÿãe‰ò|z‘mm°|Otš9Ÿ ÿ_¬`wÞKÛªP “¨'~eòvÅÊ–Y5Ï ø&žð¿Ïß ¾&ÿÄH2½ ”[1ÿ•j\´)Â¥,—ì9U–AK¸Ôx¿—UdF6–˜18yüROÅ9Á$`Æ@[pÕí²È.…žÎî«K R}§)øí‹ÓšS*Î?q ´ì’ÌcÙã<¸ØOÜšO„}Púl6K›r N·­T»0nMû.$i$ñf5ÙØPŠÎc* Ð&N²ÿ8fM1éº;Fjø•–Nê­Z¦-ûÉå†YHØ5«·^l]döï9Ñ8ùôÿå’v"¦ Ôæ†¹ãÃ0: Óâ(=ÍuÖΧ’JÂÿŸ"ÿ_îµWònùé­äý'½þã~ÿ×P|~tŸôÛÏ{­æq6}§YÞH²/EvˆËˆd"!ƒö (dÕ¬\ð‘ôÕ±n8Ÿ×ýÈ´õÈ2ßOjŸrç5ïðÔÂízÂøe6ô¼š]1Üä`å±C%65¥pnø!ócꦙ,X٪ٯþ?§á Q$GŽ-A‚ÐÚÇæ¡]½k¬"<ù!ùþHœµˆÒ*Ž(Éàç[„RyXÔhàçЇ(+e´Å|ˆ4@[êÅÚù"r³êóJ¯g* ÿ_Kü_€ÿåÿÿ6øü3ôÿJüŸw6šõlzª…kÃ@B‰)€‡1@Êpdêr¦D¡_Õýû÷ñ§d/·Ê‚6=Ð .ì”%Ï.PÂU.ŠMr¤ýáÝqžn\=r©Šë årEöDÑ3è6Å".À èææ¶úÜ…q^b®jh>)sYd›Šã?ÿùÏ‘£™þ”f–—»Wr/á´sЇöú„ÿþ¿‰àßp¸P‚E™¬Ë|aaÄücóPÉ.=mIÇ3õÎW±i8$ÅŠ–ï«%òด‚ÎGAÁõpr\¼ó‡Ê_Eö ùõUþØv¾T9ÿy¥’JÂÿ×ÿ·—{ÿ'øÿq?üsä‚ÿ†øªÀÿƒÒ¸š/500Hè-Ð5çã'b`jHÃéÜ®W%åW5ý)_ª`.{ G@`Om,¾Ù2îN~AÑ*h"²>u7.·e®ˆ¢.“7áUàÖÖÖx^fŸ¯^½bP ÙOjëaϹDZ‡ö$ÝÜyRáJÔ²³0tÖ“§~å´kP´O öÿŠÍBn4NÃS¦€á”(&ùÂÿ7·(ç,Áð§ø)Ðw€Tć|ÄÇæ¡`ð¢9¼ç‹‰wÎÐ5NÑ{$çÞ!þMõ8ä³,îp^"îó'!Òê²(±ÂÈú.½‘ÁǶó¥Ê9Ï+•Tþ¿&øÿEGÂÇÿ¡ÄÿøôºÂÿòÿ€„Ò:`œgP€û÷ï»™àz°$Š»BLz.HÎB©jòåýÊhº»4 ÊØÅËêÁ­DieÈhà$z¨Û)I=CaáE;dv¢ÌPä>hÃþc8t/ -® áyü9>>ÆŠýÇíè„H‡.î@§•8IöA¶š’]pÓqÖS5¼RÂÿ ÿ߸"ˆî).æZ¥86Q¾àÍCArJ’i$Á_È@èü—Ë*iÉɰ ™9|'G'=ųgÏ8Þ Êz0²ø¦öÄ™2sæÇstv¾Z}^é M%áÿë†ÿW»=|Jü"üÿ¤ß]Ï;/¿ã}Æp\î$%$La…{Ò…¡¸; žìÑÕ@åÈ÷j¯Ṙ¡ann·v§6µéÑ•u’fKTˆÝð¤N‘¾‡§Ž’±¢K3eѯè-çdaaôY›#9Þ}fàT¦’Êüü<3cúXè Æ“TX°0¼ #K(„5Ãåa_ðÄÁ §ýá¦|÷î]7ЊJø?áÿWèœåb𠃮‘¸W?}x aT²!àP¤•p¸þ‡¦D²uÑÛê;‚ÌK”Þ÷×áHEåÒ œ3ÕNÒó|ëŸX%üº@;_ªœó¼RI%áÿë€ÿ7ÚEª¯µno­Ó_í†Ñø¿›¿l4³ÉéîàDþ¥}GËÀ¨” 2ÏNæ+‰rJFr*7L}õê•0|¿{÷Ž}ÆÆ!ªŽf#m,Å õ²ÈÉ×¼ 8÷þ° )9öº0‡º×(ðN¢šö2üéƒÒù(u¬¡8NÉÂD=Ÿ?®dêã¹8©­P¦È Ã,öÞ²*á´³ŠGðpCß„ÿþ¿qEK”óÍ›7¤ÛÎYv/ÈCÁž(ÂC8m*ƒwMÖ;çK-¤¢%éFÜI9\jøµ¨Tí hrq1Øÿð1±t)bkkKû×ÚùRå¬ç•J* ÿ_üOðOü¿ÒþŽÿ7ëÍìÎ þ”%ÍdïÓÓÓœîïï.c«ž0wssS{–Lz\¤ÍÂwiþªûò€'å±1 @Ú˜Šï¿ÿ^!µárïÌý-œÎYã{ßÛ·o=†(³GÒqËÎÕÖè2 øN¡˜„~S|(©aN4cdš.]öµâ4Mµ7±l ÿ'üCYQE¹¿@;#ý^?6…‡Sðj*‹‹‹333þœ†]JYë þŠŸ"?)·,#@Ä>(¾=·ÏÊ*Q¿× f}Në”ðWiwS~ŸH¢â¹ìƒX>dO´9F[!þt)`©úF/T¬ä9,´ ÔhxvË»^eÜæ›ŽÓ0Kô¡ c‰RþOøÿ‘G/-Ý ÌÛYq/ÃÇç¡ a$³ ëUR³ ¿óóó$æç»ÐÊÖ(JÔ¥ˆÜk.WÈ|VTØïôüüç"âÿ‡ª תx^¶mçË.Å‘Ï+•Tþ¿.öÿíÆ³ngµÓYkçå§÷¬Ó[îö~iµ·Cøë~mcÐÛî¶·Ž²±‰þà‚óP eN縶ÏQô¿êÀn;‹q¹þMÔqhrHKϙτÓ.Vð@çææÀ`AFÚ+ùWò_KëꚉH¯Þ¾}‹åMñ •Y&!|TŽeþ¢V7Xv]¹&á ®â]hàqNF yY‚yKÑkÌ™ë0Ô“¢e€yÆXþB)ºÂÐÿ‹þS ¹à‘Ð|Í0xšÈ8‡†“ÙIT| þª|p8ƈx,Êà!˜ê—ÑM9Ly·¡,--á[r0ϷŨºŠâôO Ýàã@ãL7©qžþ€ê¸ù“’oµ=ïÎ'®çî‘´93”tá¦|é8éÇX›½eÿ9.¹¤9 ƒšþQ“‰Ï”KèÁƒŒûÍ„tâ“ üh×›ó}QÖo^('Dù!¢K  ¡Ì€|‚Š[ÈùÁpÇ/•T¾&ü¿Ùë¬òýþF¯¿™‡^xÑ ëýð<„ÿ¹³½³ÖñóÃClccÝü"@tÌ;Q0j‰M®'¸BÏA¥³PW)Š'¡h–årCOˆš¡eW»ÿá|&œö±ÏWA¨Â(IÂÿi]Ý B¤Ç©#6cþ_À6`7¡d 1?<‚:‚yE`À1“ž°2q»èöþþ>[8ËN†w¤Ê€”ŠØÕa0Pˆ§R(⾨ @èv/ q,vVâxÅX£Ñ¾È#G­_Ci·‰ÉÁí€úÀ"ñF‹‹‹â&ijpùa~¤à&øtLÈÜ.èÅIÑjÑúŽáOvÀ”²1;⿼ny…‰õ°® »‡HK*uC‰†¥a§6•1Ÿì†,G«ø“˜ö„NjœCÅýà7fOV|Ä_þò|ó)ƒÐGgð§p8õa˜L †à6Hdgð+1?ùþûïÓ/ŒŠd±$©¤òÕàÿæJ!€ºÏ;=|Ö:ý•¼¿Âÿzý ”ôŸû»Ëïw÷ó||f&ï]ÿàí«ÆW'ñ!®¾¶ÉA'¥û“#³ï)’>],Èö9EÌ(9; QÒÈùL8íbE;;g8"õ ÿ§uuƒ ÅõÁrcQrŒ';üÉ ºiÝAy,Ö¿Ì'€‹pÕ‹/TMJ<Ts£÷³âd†¡&ðhk>P­lÆ_ÙC6èBWþIlOaÂHn¬BžÎ¼!;tT0w:–‰ÔXY¼"š&PãŒáF²’X˜l‘"3ãO´£Ž:#{Ù™ðFè† È€èŒS­”î MFÌ[ÚN–Z8ÃÊJ(錆ãHž6T|džës°¨ÉnPà/ƇíÓæGˆš3‰«ŒÂg‡_Ñ21ÇÅç¾°°à-Gî*äÃé˜l*hJ /D.ˆê•B”-3(îŇ"šÏ¡i|Rdˆ!„3ÀøÞ‰¼¤ò•áÿnëY¿³ÖËŸçùz·ÏóîàYoðŸµÚJ?_îv¶Ã`»Û~ þ}lìø?Ú @c=P$оæÏ4rO“øcüygÂé°¢ Y²ŒœÏ„Ó.Ì™bÇÄF\ÍFšðZW7±ÈäÆA‘å% ÃÔ±45ÍqŸ#…w lßU <éóPÆQ¾Q'þúîÝ;ò׺ã6ëŒâ0ð$M+½ó›››á´žUæp8¢w%Žw61¼#§"Š¥€úJ.FEød÷@~u†³áñd33rƒÃ¯À®Î11I–Óö`6'Ø}(ŒªîG‚¦£±YqŠͱ£|ëmÂ1»êÊzdËMÛbœ‡‘áµ£KÙâÂPª_ ^êfc|¸ ŠÆì R#Cœ––ÜtQ¯¡±{èA¹GFóÀ]Ð+v€c—'‘—T¾&ü¿Þn,ç-¹¯vrúÿ¾ … X€'ƒµ£¼Ã¶ÿáŽà.´’« lmmUãØ\Ÿ"Â(È|^ú•Ûâ¥SqIrd;>Nû”„Ï9ÄmÓ ÿ§uuƒŠÂ” á0©¢â°y:EVãO<¦S@K- cdQL îÒu´vND yq²‘ÃãXÊÙJ–*΀¨óba¤ˆ0¶ò¸²C˜Ö—–‡Y¬¥ÆDA¤ÙúÆñ#âwt-ªC£©÷ʉ6ÎDÛ†Œ±‹!rRO¥¹s äìS-Ó­É6Zsä!»)~GÿÙ¸²³Eb.>JYºFŒ¤g%–îI5ÅëÉŘÏTнúC<‘*pžy²š¨1úF}Êÿ§¦¦x‰/oñGÌ[ÝW{}Ä 9wœJ*_þäÿÏóþZ>Xé VCøÿjï6CxÚ<\Ù¯á­Æ½/€~¨"tî;±?ýô:öäÉ“kû(¥Z%ÃñàÁÅõ¬Ç—«ñ?©¶æñññsæ3á´‹bôY»R’ÿ§uus £¦ªl Ô…·üSÖæÝÔPÇ$J.º™/ ”ÂgÒ+¾hü•·#ˆU(éjW#·Îhh2¿D›ɾD*y€ÖÜo+â/”ÕE}PßhøÄoœÔ%¼t"<ðDÌQBINÉeHvœu’Ë6Ÿ”û|ù³ÖT°Á(ñnXÕgF¶¬JL£ ¸–Ï+X„möœc'CÇ#‚©ÜÓZKüÉ¿¹ä0Ll(B‘² )[\$~ÇLJÿ¢}¹º~ÐþøÔ¦‡”œÍõ/šj1V‰¶¤ò•áÿõ¼µÒï<ëå% ð;þ_ á¯Gû!¼ áEãøñ«íûú±Þî|,«GÃÅHsªxqîö‡©$¯¾r{†`ÎYtC#t¬† »”MÜ W*ÇGÎgÂi+JÄ>W%“ ÿ§uu'Mp…vBΞ?ÅÑ©ã禒ڈÜIÐábÞsòDçƒÙ稫JO0¦˜Bº(9L8ªy[T"̯9Q›Õ\“š%]‚öI{I\äâ ”›€ºã*WÞig¢Ø×ê’°7[-"™"LÕ´(]¦&@ZI:¸a•¶*þéó9ÞFyj|\ßAÁ{0k¿K´<4^m^ÑN§»HÎ&gó*ǧÞÒíš zñ>œ1wµ•?£`Ú = tCO$Ñ–T¾>üÿ¼Û\îµWòné\$[íö—óþÓ>ùrç›/»­íúq6y‡ù©7 §Ã)Ë))X’,¹áèO—KÁ%Ó•0Ξ'WTB1“Ã0:4_|0ìí`S»S¼Ètù™™™¡³CT;¡S>_:Ñ­‰ôGRŠ?,÷"Ÿí(ÿþ¤O–3˜t “C'#÷ÛQâ±bÒd˜J ƒò¡©ÈÖQî~ §}HQÀ=ß1¹0áIø“ðÿ(ÂKÂ?ž PÑà%eu« Ň –üÎ%·ÂùnNçdò•ˆtK‚!'z¥DêátŒe-žzôž‘É“›Êhý¸€§*f¥_’€øÚˆ5%½gü:ît’œ‡Óùë]L‘j–ývl„Âíˆgá¶(©]ܲ(ºPù\õp–üM3)&Å#í\ís*©$üÿ)øÿIÿwü¿Úí­ä'øÿIÈŸôcüÜ8 w¦”¤ù@Ålvv–$šÞô “ŠÇ¥äÚãƒE¦Ÿ¾+ãD¥‰ÇÄY€"á* hª2yÀŒ“(úÓŸÔ¾nBjVeæªO— 0†Ã„’#ˆ)øoa’°iÔ¤ê”xqqу±27eMÖ6,üŠÙPWÅ#`ÒpI5°jÂiçb!mܧ.q ÿ߈+dÑ œñ894 "íì'øŒ\ƒåÅ9+FùJööö"ªÖpGÙf»ÔÝåÏGûä’Iªîªôþ¿þv£3ÕínJ4µãZ Úá³®wµÅ/U5‡ÄìRd¸°ÚÓÓ£Ž,vXSrx6‚NòÀc:¹… )eQ×½°ûP!ûàÁƒªaªªqOgºÂÑ‹"wUSö]u± 7àäOxgA‡Å˜(Iá=1*Û—P1)¶ß‚—ûRf…¹@÷è¥̯Ö}²x TÃ$s«¢ÓX*Y7qª—––˜*‹ºs¨Kʧ ½ÌÓxá–ª=‹Wˆ<‰ý1cDòLŒËDÊVu4£êYºQ¬çK%•Tn.þ¯ÆÿTüŸ³â:ÂTÒÉ„°Š¤5 A’.⛾%U;¯»(Ž™„*£‡ö¶32˜›,=,sdüNg÷ü¿¾½†aÚÁj:æ×å4È™ì˜l‹ŸTR5ËœìÞC9a©'Î%]™±úW`ÿYJx¹W'ãÿ„ÿoʼ1é­¯j…_§è-ã0óˆZÔ ³Íj¨l˜VÆùQ”Ñj¾^HSyÕ!Öu©`¹d8 €†ñÐ"¸^#*fãÎq„Óù‹ƒEKpj_½¡/úC«$QWîãê$Á³¶9œAýÿŸ½7mŽɲ!.Á] %åÖÕ]eeÖf=óÿ?·{f¯^WUWee¦$J‘÷=v>8Œ“—ŽˆR™I‘⽆@‡ÃqýÜÝ®P€ß²/èN•t.˜tLÆ»IånõQYa)ä­f^ŒKë‹Rs ´///S³Dÿ¢p=OÄàäQ?q Î+èrþº99Ý]ülÿ6ï®§Ù&>Ý>ëi-í¿ á½ßÙ a½ÓÜj4öêõù‡Êp®ku@¬¢›Y lŽ5ƺFå¹3*³bËsà/›]3˜:)l:ÀfB‹JCÊB­JÄ{xòAŠÿÃu7{ÖÁ ×Ëkª„¢MÔLT›6-j\zQ  ÐZ"¸@°nGkDu|§}4òXÐma#æÿ™››SpŸëÿÿß!©V£'4ù3¦ñ³gϬUž*Ä“L¤Lý?Εz‡,„EéE3¾.{b‹Åà,LQFhºåˆuO•¤G¯ª+¨B­àüRw³…Qü§°%U à— =ˆè±… ŸNP‘PÜ åg1™]Lææÿïÿ Ü*™«÷Õ?Ïý+Ž*&@[*Y«üm¨©L ƒP&¢ñª/½-Gbѯ ÓO&ŠŠ¿ü)ö–‰‚žd.åÿÃKØàe¬\ÓZÅ„m-H à™yOÌ6’;8µ.GArï±¢éøøø—Žã4u^€ÁjÒ$]ÚðI¯ÿëøÿö“­Û ÆKtÁRÛ¯·Ú&CÞÝݵŤȈž?.oÿ ¥Ú™Ï‘§àºÑr .ͳ’ì~.:äoè¹ø¤-^¦¬kcø­¸4ÓÍYÍÀaæÕ¡QƒWáÁ7[Ë8Œ¨Q+W«hˆ¸Ó¶0ªÿ«««\Tçw¼En¯Âdáz¥³¡ýQo²;&¶F4«ŒÊJ%mY·Ýf­VÜ–ùf(®<ùqäøø_9¯* ¿Å®¿`cUi×…´R³'ê?ó‘rÛV´áP ó|kò5>ŽÓ>’0àTõÓ>Åñ—Ë„Gº9þ¿$˦T46»ÂÐJ»òቲ- ¦ZxËËËd>Õ𮡦$6[õ Còmu°È’kWÁWkk¶ãrÊ®Yå·rþÔøHsÕ¨Ö¶J!« æO,‰@¡ÇẟkИþ‡ë"n?t¨‡ž5´?t²¢J_‹à|IÚÃÕMÛ:©º%ÔÉé Àÿ€÷«ýt=Ï7²ü]ÚÇg= kyØ á‡Vc;„Í^÷]³±×l&“S­VG@%Ý#¥(ù*õ$tþaH,Åé^¢s«ÅªT…úúÏÛ\göŠbæÚ–’gqŠŠ¤‹¢LDQþÏH{C–hËÜky ƒ”DÑ:‚öµ´Éº¹i¿-giº]eþ4Up4ÆŒã´ñz3ûžê‘)§‡0^òÆçÕ7òi­•¥_æ¶´ºårø—¸|É:O*¾t¡â—>þS” /Õ¶*¹S ÆWEu½•Öž;Ê#Ôò[û"ËbU1¼(›âµ %Ž]õ4Îê¶\:قʲÛc¸Tÿ·¶¶‚ñbú`1G=&Upfàó¨þ„¹Gõ 8þJšZ½\¤íwå¿“Ó]Çÿo»ÍWYûMÚ]íâ“á󦛯¤ù_/Îþÿvv²ÂNÚùq{ëé·ßŠå)÷&Q}”„'\/Ën®ÓzDÆ(m(36(ˆI Ù(þfˆìöPeU÷`þ´#+CõÐú_Vgey¸.‡ÛQ jܦ3²òHTÞ±”µØ†Âsy¢aE·¯:›ÌŒªøßQãã8íƒÄ‡…E·-ÂÇ`...)áß29ù¼ºCø?T4ÞV}Á¿¢®ñ¯š Åg"]G•È#c±}ŸÓòÿH ˆ|MmÜqõŽt¹Qü–G-û‹–Ʉ٫ˆ-Wo (:úW<û«žQÖÕÏ­ößþõ1ÉœÇëªý±uª­ÉdƒAç«£[XÙý!œî4þßìu_‡ìm¿·ŽO/àó¶Vûa3„¿œ¿êgߟ½:?Àµ»½~'íZ»g¨Xu•Œð•öD°nëÉÈ‚ÈO"Wubjß…ÿ#‡œ¡šÛÈ‘>ÄNÁgggq˜tVxšŒ“RO¨:&äfP•œ6i¼Vf†Qú™¡G=µjúSf§|òäI˜vÃlùNã4-Œ%Ô§(<›ÛÊÉçÕ-§Qþ?Á8uH« ‹ }☃èԗ“b› ‰Š4çCÉúÌDZw¾zT¶H$÷2pD&6¨FÜÃѸ Kx å·Q=G,=DÎôú³*ë¨m鸢 eÜx#º_Ù…åçÃá þ¨þKì²+Âxik¼lµ?VÖ@ç¹xñÛ’ÄáºC{FÉNNNwÿ¿îÔL›/ºí—öJ»‹Ï‹Núc7ý?Co=„¯\žä)® ÒÍR1+:XŽ’·Wõí`núÓŸøÇÈù IêêÕlãLªoy—øž²ì²„ŠznK.Jv°%m--±Óƒƒ.6‘—òB¨ú˜ôKÖsÞŽa0ÁŶ¦˜D 8¶â@$#¨¸Œ“““ãÿ»ŽÿûäcS%Â…Š±gssóÏþ3PSµ˜;ÎÞ–âŪVÔŽTÖUõÝ»wÜ)oœ1õâ…À­à ò%–±£Ã w… >ž››#Ì&&· a[AÒ´Š¼3‰¨òLÒíX~‹®Î”¤ä‘RýÁ¿´kh bãªeLÂ-KŠáµÔˆµ8ÓRL‡LUìR#ìW 04ÈÎèÞwâ^0Jd)lÙëä:99þ¿Cþ?Âÿ¯óÖfz…ÿ»À®üö©É|Eƒää‡ÊNO~HVOä Îo°„ådãRÉ—Æfα©rÂÀ¿%ª«y¼p¡!JGq]àäçÏŸGäÇç1£¡—#¦^$Ø>uGº ý×ý—:Ãòª ¦úŒÝŒ ÐÆiQ• ž©ÒýE·éë¸ãÿÛ?ŸU¬ø–L`ooI ÂõÌÿ ¥—‹­vÆBx/ÏFJ…‰ ¶ÏëÍ›7aàw„J¨vŒÔéÊ&ÄBöªq¬b‡=”=7”úvA}+w òg+³+Or0ÆÙ¡N•tŒ§‰ë—Ž¡MÖZ@Tð—ê t&’/ø¯\^œœÿß6üÿ²×)Áºš^áÿ—ùþ‡\@ü¿ü?SàÿÓó³`ò‰#qM{¤rI ô²Æ"/}ttDGU³µ°ª^’”T,®û]Ð ŸØL.—²Y«ÖaäUP—Zµ¾¾ŒaÚšÆCDŽ“ùÓ]Ó ã¯¨˜_.pê›´d8ÑfcÃYvýb­1Y xˑɛq^lS–}vCªl[øØqÚ(²5ãT&•nCóÁ:gsü‡DZ[ÀúéÓ§6Û¼ÅíØÇ3ÞžHÛbäáɇBÕ:‹[‘™%àÉéÒ1ª—eÁÖŽ<…( ‘fË#Ôro\ûiȈ˜¶Ø %c—9I’åîîîþñä›.«Çä6O% R„é`ôã i #@Ñày2œÿßJü¿–^Ãÿ¥Pàÿ—ýÞËÿ¯f­wüŸö‹ Yì*¯iiHÀ¥mäY.÷ qÉ9ÌÖfl¦K„]U˜~ÔJgÓG¤&ô¥Â¢C•ícÍÚ ¢´6 ]i«d0ýKΦÓik¶*d‰ ‰ì³²}J¢‘¢ ›ËÎqÚ‰Csc|=8'ŸW·ŸÈµX"Dü™Úi†,EI̤— ¬6¶ˆÞ5`›* ¦YÔêDÉrm¨ìdIÿŒÀÓÄO9Ò,,,ÐÄ ì-3vò_Ú4®¥¦‚¡„ 2*†Îm¥*¸TpG+‘n®~Ûòš¶Wê¤zŽ«`œ­QS>Õh i"¹Èúeøÿ(Ÿ&uŒÖÄãÊÇÿ·ŸÀlÐS”ÚQÊ›ÇjE4òò™“Qo¾ù†BÙKäW-SL®%Õ·|[ú|+>Dñ¿Ê‡Œì': Œ4– Ò¸ŒËÙ¿”ÀŸ{lŒ3¥$œurrÂNŠ‘âxNaôYÔg% &ªËf%rA''Çÿwÿ—"À5üÿ6kmwÆÿýëµÈ•²^Œ7r¨¶…Bh`Uèn”9 |-^±[!{EiÔ…Í/¦¿¸Q÷¥ÊæZ}ðƧh ð¶·#³²¼g-É‘gYY†ú1Þ,—[ -˜ÔºŠ¼€x×ܶewp¿üKµd©vÌqÚPÂ*¯ÉÆ¡cÖt=5¥(wrü'ˆ¹úÃu/‰´œäQ^5• –#˜*xAðš0"àÒV·`«w)«¼öðrCCéѾ^=^K§[Í’8¼šªâH‹‹Åäº+Y‹GÆJ Ì{Iɶ"0M:´‰ÑÚ8¦§§µ„‰½{¶|''Çÿ·±þo·µšuÞ¦µnºÑM׺ò7yïu/Ã_v:­÷‹¤VËû=«x,±«”3\k´šXe]âÃõœuܦeAþÿVIÎÄnÁެꎵ€£ö­Ök«¹´òYYö"6¥–}©"˜ Ñ%V"MqÂ` µÖÀju6;=_:2èdmtGjœAòÍ“ £ÚÇT‰`Ûê—ÈœUî6â®ê˜x6>…˜nY ÜÊ/Ò†yòO''Çÿ·ÿON&µ©dvºøÔfÊÏ\23—ÌÎ%‹‹É£Åäñb2;•Ô&’ùZò ‰T%L˜L®M¥n±Yt¤Õ ×ÕïV«Ãê3ÚétmGºnËÆÙ­;4 ÂiÅ©öе¥YRš ›=CV›ÕSBÔòge"Ê#²hT—Î1–b£Å‘âÌÐñqœæäøÿÙ”õ$¯ f[Ú’ˆoãEcR¶ð,EuI²_û"÷³ÙÛÀ¦Äc-Ò–ò„)S¨¢šS¶ÿQñbnV5†ZeÎ>¬dA¸¡ÁÁ½ó`eO ÆqT¤z¾aà,j¥-,päpøÁ¨.Ú ¬Ó—}ƒØ+ÆÁE¢Äœœœîþßi77»Í­Nk»OŸÍNaøéòòï‡ûkik?ôö;Í×;›ÿþÇÿh·›b5b24ƒJÙ ïd/ Û´\Q9|"/z4Å5ÅêíÃuGzÏr[ÉHú©KóD]W¤¬ƒY­ÞnWLk%Tn«j€Êè*êƒÄ›˜(ÒùkùÐJÇQ=Gkµ]ûdš· †Žã4'Çÿ÷„,/•“$™ªÅ®ÖïŦî!Ç Ÿ!c‰ôrà·È2LCÕ²ø¤/y×ÞÞž4;†#Ù%1:¡w:±‚Mé94ÍŽì¡hÖêC¤ÉQ¤ô3U>YØfT- 2×…ë&õ‡!l /ªB}+ãØÅHQf¬´«URs¢ÜGaXº¼àeÍœî1þßn77º­ÍNg«OŠÏF'_ë¦!¼j76Co/ô_6B?yÐ!GÜ£šEÜ/JÅÃSèÕc-Á˜g”Çò1û—´¶3²S3ÃîšëŽÕŸK6ÁàQËU‹‘u×A¤?µÁ„†Eµ8Ù×G•˜ÇN¹îc@‘ÿR!©¤—ˆtü¨ñqœæäøÿ^‘5¶*)\O¡|ÈQ¥B£ª·¶KœÎ6‰cUè<LÉz6ªAk%Oˆ’-(«ƒN' ¶YvÛFåî’u«`7N±^ú’äYÕbâÃU½ú)íM4bªç¥e°”yû2Ô*¡D¨ä²Ö㳩¤«ÄÀ ëÍhÛÑ”çR£¤p=ÁG999Ý#ü?5¹Õi­¥.>i¡ù/Àáÿÿc³õ}ãòMž½n7ÿ¾µ |Œk÷¶Ak þ‘všž0ÊÌl™¿”'ROY%<#O´9´Á<€ÛD7ØÐµl¡öªœ"k,ÕSŠ;SÒ¼Èj %€ÙØsë´OŸ%ÚT‡K+Äu%eØ¡ˆtG9Ô³EX~n»“ ÝB\¹5Z³‚å“bkÖ.@w—H×T yÙ>`@’\åÃt”R2güU-žÙ i””4IgZ2„Ï%ïhéÑ(áñÉJþÁGom+Z1#\®P¶M—íãvrrº'ø½Ó|“vW»Ý·l½½íä«|%Í_æ½ÕÞ„þ»Ð?û !™œêä½V§msÇII"Ë2UîrþĽ?zôˆmmmÉâ)“kµ»ì°v™ˆX“r¸Y!BêéçK‹Sl6qEZZÕ+Ë ™½ù›o¾¹,‰;mIGìŒVYÕY Ò¦¼³¶ìªGà¿v©R"¿Y¯Ä%˜’zbbbÔø8NsrüI¹‚Á"˜÷|˜z(í§… CK·(©åNhЬ®H˜Ûà]6Qƒ¼Y$hHI¥ƒ°?Xž,*X`‡0¨„>77‡{dý2v^šsM$ƒ Z““““cø0,Súãx[ £ª,£áº÷‘ä…`|A#¡‰Q`è§Íçf7x ZËÂõ,Faí£Ñ²¨’vùPÅŒ_+/Ràätñÿf/[ ½õ^ØÀ'/>o{áu/záU«_þÏÅÙzÖ]o\&ó ÝòBTïÈ)½ }‰“ÅŽpû6™g0IøÁUA†^7Z‰TMÆŽ$I\´ è¢öž+$ù¸*hާHM„~ª= >¢qì‰?Úávñ 6 ‹Øßß×*¦b¾VôP†ŽªåüÔ&Ùë’uÇiNŽÿïÉñC¡µQ-]K`ÑÖÆª¬ž >ª¢MêF˜]?r¿—ªÇbfëWiñ° ®’È)¬‰Ç³)ª¸å!)¯[³ôüùsý”?¼Ä“‹¢ÙÅÅÅQ|˜9™Uä×v[µ‰µRàtk±±cÜO™ˆÏÈÞ>%ÁŽâÝÄÿ?¦¤£Æœ—À ¥Ç¤ñ¤|D-dÞ…ƒ'§{ˆÿW»íy¶’æoºøôWºýWiø)ïÿ˜÷_†°ÂZo:­ÕÆE2= –—¼ ¬ƒeÉ=–––¨Oº×RaGr3Ã"\}XÌÑ*°¸°È£…»Ñ¯ˆÃˆÒ©¾ ã ‡šw7??mË®Ñ`j2²þ/ÏÂúBE ƒ†l»gåîT!Hþ”íXc"ƒ¬MjDáˆgÍÌÌè ì£G°`$Uí—õ.9‘T.S㌥ 5j|§99þ¿WãFÞ&Cvˆ –òÍ7ßE€#YôdH§UÔ<|ø|‰â8 íäÌâ?z"R8È‘ÆêO"ݲêí²^¼mdzd€Ø¹ºŠU(ð'H©!ÀØÉ yDÔZ€p{¥ÆykÕjêÀP>Ì=Xh̵:"¬Öë•¶lÞ”­S©K³4°ª ó.x]ÜHXj(¶¨ö1“ìáZ`ò*¸Y%j¨p–âÑ”Ä6%õX?[^ÝøÙÈ2''§û€ÿߦéË^¾’õ^㓆•¬ø¼ÈÀÿ_;­{ù›ÐÿþüìÜizº]âr*•_s³ê&pN-Öü8’Oî÷d˜Ò±Œ;…íWG5ˆxdxQõMAÀru°ñóóóh-àP`›Zeã§ÂõB½è§²FKÑDþO|Ž»ã-cqá¿ÔÀ“‰:—T‰*6X@¥§007àH.%ø©{!Ûç]ÇiNŽÿï YS#í˜ddDŠÛ’ˆB´¹éÓBÆB"Æ%†Lܨt”TeT#¶€Z©±•êêa豉 ´ëüÆU¸^¨{Q7¤“GŸ•Z·ižL¨9Q°-{"›…]">,†í`ÊŸã#DÖ 2X9SŽ¥v¸`É[ÕJ@hM¡ ;F‰gɇ‡#?”0†|zGp­/*Lb 6z‚KÜL±x''ÇÿwÿƒÎÏÏ“åJéM%ñ¿X(/‡EDŒNœGE„­RE —Ëèi|tŒÍD­Ø ÖÍ…LÉâp¢|”¨Ÿªûñ’Ænbi®YÈR,CÑÇÉ-ñæ*08TëbnðBׯ\ǃ#ÉUž¦ìüꫯ”Ў”BÂÀÞÜ)ž?J¿Ä ܲ .®……€צG®Ê)¶Ãè ?g7Ð¥{]ÕDJfÙ`¨5­ `å¬m,¬Z_¬Î'|¨ž{´JlÕ«§²6Sœœîþÿ¥þ?ç‚ÐopffÆšnŸ={fÝx„®Éÿ­¢¼î»ï¾S– ²hù´cûéÓ§jŠFO6ˆëŠ‘Ê²ÉHØ™’”MîFOž™l^p] à ]”jލŽõíÁ¨´áþ²[8² ê½É«ã­LAn9*¿4Ë…a½auY:"ÝK¨ä)ÕŠ¦ Ù…Fvçjù6«¨®¨Û*RPµg© d$¹PNᚢ`çÈlQ%¹¹ÚÄqcú£wŠÖ“¨F““Ó}ÀÿŸVÿK jeH Í‘å{)V nÆ#m+X©)ò:qËH‡¯¼páz&‡ªæ‡?ÅÍ(((zˆÎh°š|$TFW£r]aDý»@`•‰ÒЇÓ\ŸVB±¦.pV-¦#yb5iVPÆñ¿Ó#›‘¯Ýœ>ÄlÍ`rcZ‹_1nTxxmm-b8Õê$£˜®%ï#ËQÙ%Ú ä)~¢DÇèØú’8†½²k®.¤»¶ux«uÊÄÌ¥Ìy÷î½;-F*ž¥•.粃«b»Žá=…ñ +š)¼Z‹ÝxÿÿèùªHå¨þà6­ PÕ5999}áørr»ÝÜè¶6;­6>)>¥4¿j76Co/ô_6B?ypå¢ÉeX…Õ9ËQ]/Ë£®«z»<žøVˆš<Ê¢wñO9ÃPãm—o•Òüh5± +»fY¿˜~Í*‚x£ê×ËÊl Ǫÿ«þXÃ+]¡˜¬/*.eb"5šô<ÒŒEЦ›Tæ¸ÿÓoNz Ta| +@7ýéòòï‡ûkik?ôö;Í×;›ÿþÇÿè. WCyÚëŠbkÌJ§¿"ŒÊ`ÙÞÊ¢J—æCŽnJvjÞ¸1q<µIç%&ÿ4ÑC0ðȆ+yD Ö´Ò±A\‚Ǩh¯M+j×ëx©(—ÖDJ‘Ø"qÃúÁòAܘ3§ëÿ~sÔÑ€*‰;ýRR…,jÝå©(8ʈ$ >Yy–ž!ZGØ;Tœ[†*¥ÕHÄrUÑ2aE‡…Ò„J^­œfŠ{"6ÿŽå‚"د=ê0ÁjTxŒ¸+8¹/Bk4eë‡eY›—Ðy㸄U©ö–Ä.-glœñe‘°ó‘‘\´ö2«†¤†ñý± ¢’Á:99Ý ü?5™ÌL%sÓÉìt23S~æ’Ù¹dn.YZL-&O“¹©¤6‘Ì×’?WQ×ꔤKX˜ªš]*}ûÓ¦&P>:á[«'̶ʨ¨e(ï„ݯDêÕÔ¸V@êa”@;˜CoœÿjðåŒZ5@iW…Ü)/'ÿÕHÏc5rv5ù˜¸æß ÿ'NN¿‚èÎYL#Ƽ1¾²|2‰iÓ»Rl‡¨O/¯¸\ôR[¾$Ðh9ÞŠÒGW³\Q6F¾g¾D“ÚÞKd4áÁøóˆWë*Ê&§hÕüÿ#†¬%I—Pê ×5™Œ™ "²Èd3^β=á‡ö'Šû•Ð ''§/ÿ¿ÍZ/ú•¼ó:KWñIó×Yþ²—¿ì÷^†ìe¯³šµÞ¥­­æE2SKû½v÷J·,§táp‹WÃõkÖpYÕáx‰ÚágËó©½×aR+龸GŠcŒûf1ã*€ïHE/‰ŽQ+eÍâ‘¿=ïÂÖšWˆ™.‰b¿Z^¥±‘ëTÕ Ý—LÕñqrrº?$ö¥úçy²M2óA«áYä6Õ2"“¢g¼P@§˦¨œ…ÏÃÀl pÛæ&÷¶L˜~þc4'v‰Q@®´ý¼Åü¶®‚b¦ƒåác Þ¦G–2iè,9sZ Îí¡ý ÆsÉ tÖÉÊ& °¢ÄG"ÿ¡áU¡CÏŠ>« û`œH´(Gb¦6 ےU»ÏCÉkö‰[O]]qÔü±²°õæµ G9¦8DQ0c5¢“ãÿσÿ§'_ç­BçE?}ÙKWò€ÿ½üÇÐÃû!l¦íwÍ:ð?^¼n–Ê8km¸QÂO2m¾û|ë#t¹©0š ˜j_xYø‚ß*ÍZ¦Ç„ŸVÁnµñ:KUôÂ2—8»Ä^)Í‚, V °‹pl(“«OUߥp +ØP,%Uf{ äNv Æ)ÔòÞQããäätHSéÀ#¼*¦¡X¡1öÁvIÚ&ûR€jf¥Hm^B\èƒüGšŸ‘õÏjbõHNÐe‡xƒ6‚LNP6…²ÖJdAu1:%ʤ¤»RUÍ—pÝEÓ:E:"-1zv\@GÁuÛŸHç£ÛÁv½°ùN•= ] G,?.=_Ž9›µ6hÞ‚¬0Ñ£‰ˆ1èWF[Ã:0nX™È&P#_DZJ\ÈNN3*¨ÐfÕŽæ&!—{t ºe‰ÉQ4 AS7c‘wrüÿ‘úÿÕ¬S‚üBí¿šöðYÉz/óÞË~¿0ôÒ×yç]ÚÞ*ñÚýÁÛ$ŸIéùéAZÍ„&&÷U¥­>*rb¸ì{­#m†êˆ]ðí¶ùCÂÀ=Òš†#P­‰V·0¹ &ƒ s°1ÕlÕdébƒì’”'9%«aƒèFä dÇAÁhvªŽ““Óý!k=´JNË:”èf¼ŠÞfN¶l;•‘^`IÚNâ´ñ&H«­UT²´"Õø\CmÞZý3cÍêk%š¡ênâ·(‹±þùV½Ã¼º´´:ªe âövÄpÅ(5œ„?yEûŒ¬Ú?ê­w ÑSÕƒh¡Ä¶.m=E?¸dh<kÀ•dÏÞ‹mM𷶬 ôÒ“îŪ³l’(嬡‰¾£åXú@EÞE½âˆ™?QÕêóE V%ô?NŽÿoÔÿ'í ¿ÿùÛnŸ×Y!¼êõñ\°š¥ïºÝF#©Í潫ٮ[‹“­•“ª|OOOÛÚ¾T“ƒYŸ^&öNX & µƒ}‰è3i›•ÁZ‡­2Aݶښ˜ ›=deIë±³´´Äú)ÌíûàÛÍÇÍFÄ+,Wa—lÒ‰H7‚­ ‡iXlìC(K'³VòÇÇÉÉé‹'!yª‹-K;¶f¹âP"sø¤výøøXçZg~óȱaÌU¬Ò;ª<;*?§Õoˆ‡[­µ²ô yÛžÙÐ`œ¸µµe¥¤00yè"ã…¼ƒ¬§w³ ŽÞ#º/i¤vÆñä¬äŒ òág àhªýQ‡quk¾Ñƒ°Ñ Ò€Yÿœ1øŸÃ®,CÞp$ÙZ”ãgq[÷8Šp€éQ^Áª~O#ƒ+~¤[ì¬Ö¹xR¶ÄÓêüá7GË´¿’jJD<2Ê…åäøÿóâÿµ´S€ü´W‚ÿ€Ïj^§áU/ÿ¿MÓíN÷}½‘LÏÿ×ëM»FÐf§Iþ½Â¿Ï|Y8ùÿK`?77gK„JÚdëØ34™³`‚ *Õ­&œ¬Øºáшl£·l … ZKrMNNð‹“D‘‰øiS)“O´œÑ¢UÒÊ/ì<Ëk<¥Uà8à¦pº‡15>NNN÷Š€ü£('k`µHrŒK†uû¯¦ûêÎZ„cŠUEºVv•~/£êsEÒ„\ëÉ¥ ç1À¶W6#™¤Mvõ_¥Íhæ–ωüB€uºõE<]#+I0çÖØÍ*½:† Zë ëQý±5ˆm—lt6mRþ[äLö™]z¬¶ÞM¸î%iÅ)¦}LJjÞŽ²$áZØ£õWÃkC* RCTsÌ|£<ÜŒÍ1ó'RHÒçAoËC“4#+•¯ÎŽÿo þ念ñXÉz«iþ®›íÔ[Im.í_[`€Ïï¾ûŽy˜²÷øÕW_ ˆr'¾iÀÅñü©wY>˜1’ •¸µ‰€x¼iÚ2¸Ø˜šš¢ÁÚ6Œõžòž‹+ò,NNN÷„êðú f€;‘‰…Aßð©ÏÈC¬‘¸ Y8¤’2ÙÀ÷ìÎñ"†õ<Á«[Ž8§ »T^p®îÚZ%¢ˆ0c«.òHeÈ‘Œ)–uº2E€9kÀÑ Ì"VÙjÆNJ`‰ŠË36[×4dÚÛgBÐ`r)í§]¸H}Ì“âÕyGÊÐÅå7 ÀU «9vâ¹H?IgiiI£ý–!“§šé‹V’(×ß/BÑÌX¢ÐBôÓvŒ!x6Â}ÔüÁýbÕV˜@ä¶$×5=Áp=I %ʵœÿß þ]àü+üð¿’…—ýâó¢×{å›i¶Õh%3sÝ~h¶:Z\¨çdÆk ±oÇŸþô'^…¢. .¡tÍbÒÕ$¯¯¯ó,ð‚^¾AlI_²ƒƒ¥¥oçÝ‘#ä‹Õ3‹ `³ö¬hA”NF+ ±PÿÏþóææ&Ç]XE–!ô“Q?2UKdÅY"°Ø—Àà<{ö çR·»`ËøÉ~bCAåïqÔø899Ý"×’|˜õÓÁú„x­fø×±_Ä--³ÿ”“¤Í©2 )=ö­öØæŽ#æ¯zòD†mFa¶r`f«Sÿå¾Î ›YHÀ^ s´ÇÆùŽŠqŸGÝÖÁÊ¢ÁX^EËÙêêjtîøþ(BMÝãööö6÷ìììX[6;ùÝwßÉ,¥æ®jÎå<£-„Ãn`Ùå~.I<’ý·ƒÆÏ:L¬}Ú/,š¢ÆÞ&è}|J+ ŒTËãZôOަJ„Ï£ùõފ¬ÚiÒ Hµ åÀà°ßñÿíóÿO_öò•¬WŠWàÿE^ôÃ!üT„çkY¶Ùl%ss­òB˜ü¥˜í«|%ñ¾“XÀ,x¢ÜÅÅÅh™@O026(&–~0U½ìrCŸìS¥öt¶“WÎq-)vØÊ)’ñÅC$#pe±‡áNÁ7¬ï—B›ÖÊp=ž®"ÚÈgk>W¡¬„=ä0â´öiþ:>þ&:9Ý+"S%—G%Oûߎ­åG¼„!G…’%rƒ¨ìÉ“'8Œ˜êƒÁG`hÔÁÊЩŒÊV…´†Ã°v0+˜¢UÛ(µI„dâ¥Ø‰i³À6ËIX)@ þ”­÷ŽŽ-P¡$ÞK;¬ (þ©¢úºêpÅ.I5¤yöHºË²‡µZMçJw4ª?Z&Ðy-.ì'Ö.ˆø ‡ILìfã>Æ´„ãÑIe+Eh¶f¨â–Hóçƒþÿèn9ÂðgŽ-£êìãc›\C1 ­lgÔÑÑQdÇç¬S "žãòò2íéCç/Më<‘Kƒ5~±'||8§kŽ)Ý«“ãÿ›ÄÿÁTH¹šÛ“?œŸo‡ð:ïÿã¢ð¿Âÿ>>{ ðÿ*„¿¶š/zùë,…tÔ¦Á¶òÁMñ5”¿Š5ûÚWLDž@.½¿|õl¼-›‡!‡3ÄO±YÉS%Ùdj‡ü ¼EÎ< ÐUÆ+%¸¢áHp9i­$µÀ88ÔöpC‚ƒØ}ŸFñ1S‡qÌSذJ;žß|óÊ1ðtë€äääôœս;¦*E3µ¾RÝ!ÀTði/Å©†â›Ÿ0›&€(Ë"/ZUVàBh™XQ¹=U$W‡‘óÛþX•î‘7+6 ÆW½e,¯B7²\e†!ÆS;´¡„2íƒÜY+lH‘Å+ÊñÛpQŠÁ7ÆGñ\2X( ªÕ¸Ê”`+Ƈ÷‹ÛGÇ8\ZѤYRU´õ:R éx}^£ð¿š•ÙBƒC÷.UÕj˜‘ž#ÆÛár†QRSØO`±‘ JHF¡’ÒŸ£×()ÿ.ö}ãd°ËGÉi/)§ó\=w…¥DÞ¶T‡FÞþ’Å”M×ÉñÿáUÑ;‹wͽáÿÙÙÞám?l†ð¦þÿÑîþO–­”"À¿²ö?.NÞv›ÉÃ%â® ¶/îѪÇñ–ñ±ÜhC65¾§‘Ù‘;•ãK&Ô`òŽÚà2y`r§| y$}™B×U²vžo÷˜P5é ìµlölÅ%É‘•WT‰4›nŽ«0ï…æÝ1vLUFæº@ùˆ6åüäJjS®)Mþþ&:9Ýbé^é¸ú™¤…SP¨dŒÖ/Az[¤ðRäÿ#…ÚGOÄh%%‹#·o¤J_AOJÔ`Ù/~‚ï1Ì“Pc='±¶*–Û<—~/D•”,ÐÛbÕ3P ?Ñgkh–|DøJðØF¸.´lM̼/É €âQÞfÅ«´vÚ˜¨Mª!¬†ÏŸ?Wt­Òh„AÞÑZ­¦ Å2È_òQ0±iísfŸqüãÇ•ªÈ¦6Šž×(ÿŸª'-19'z«¿ö÷÷m3‹µ¸ãIQ¼Rûhò¦ÖPtÀzp'šÅC¤wq0qØc=Ž" /£ƒdUú,áZ¸¢:)Íï‹B±úÌ…˜½U¦#öäÉÂ{¹PÉâäøÿfð¿8*a0·k­gí—içu·ó6ëýëü’R?¾ÿ»Uÿ[§¾²ÈÍódfú°Õhv;z/Ä+¬=TXZ¹ýù ¨ ¡¬ÔS¨¨ð‡Ø]¨$F梶)JTTwT]+þPÿ˜8Ù¨x:ZSÅ(ü' ³rͨè­0"ŽI;Éxy.8¿´:*—ÆÂv)÷"#NN÷™€E鮿ôùÙò{)U)2Ô’ž={6*þ—Z­VÉfué" (Ú@÷öö$8iM!ßâ’EU±¥hŸ&]¶F>°¹ºnÓÞ‚té¼Ml“y*ÂÀxŠ‹Ê©†ÖU¬POŸ>eŸÉ‡Ù+æ¨áBo/Gƒ2ŽÚ.j2¿eøÊŒýÝwß©­­- a`+çÀ'—†Ç.a0iLás·¦üí·ß²ôæ{Z%ÔÏ¡ÏkTü/%2¶,£‰E΃‡æÙPþL¼¼¼ŒÆ)k¨)tuww—Žz^œ6´˜3¤×fÀ£®L—¦ü(?œ¨s1g$6b?}Ò°Ï”£-YF+23uàñÑîÀqÆÁ8…é¸ÑI럠áò¼Žÿ?—þßr¡«arb­U_ÏÓ­Ðûñäòê_¶wW»ÙO­ö÷íÖ_Î_‡ìMèläí·õ“dz¢[^/¦êÕ*UWöÅÈ,¾2‚ÁØ)««5z†ëÅʙԷšómh^µp=3§Åäʱ@ΦÚ( 7 ÃR( }ŽQj}é"¼¦ØÎ,S²-õ¥c¸Œ}T³Èî òJ%Z•k¬¬¤899Ý"ƒ˜QˆVU'ð1„ZËÒ£|¡’ÿÓê^lÊÂ'ì3·`/âÞT¶Ûè]ÕgW@®Õl‡AÞK´FžlWácòC\:Êd“óW#yUY>Z§ÄyE,Xž àg{©ËäöooM㦲²eKfQ; [ó1L\×Zœ¥§’Ï•–EëÀγ·ãŸW5ÿ'fõtõ““Ý>óIT¬æÙ¶£¤!²#ÙSôPìƒàé¼–¬èãò'TÀŽk@†ÖÓ´ª<¼ ‘eІ•׳ƒ*5h¤ô@`Çÿ7ïÿ/ž#®žÔj˜¬/Ž¶Û­wõæV£.°ÕN7ºÂNùùçñÞ›³CÌïd"±jeåòÂûÂè'ýR·W¬x…Õ[C§Ö ¾×¶¦0zv™ˆŒ­¶„·’B(öÖ2´wAÄl´T¤ÿÇNÛÿ¨Æ¢´(nUÇ„÷h}“´(¨e¶…cdfõ8#'§{E‘J_>ÿâdàÆU«è¨U ¼EÜ~Tý/[À×ÂEúÉÈa—EæH×f›ïeh½0›xÍ– &]ŒÕºX¾m“ócè,dµeˆ±­êQöÒ6NAÁYaÑH,ò̬–0æéöY¨.¤E‰¬ükù¹-ë†nGù‘¶··å˜af^NQÏÑÞEõyªÿee »`ÙØ Ý/dÒQu6£üx´§àt¶/§Y \|"‘¥¨XZZb潪”$< \•Zf‡»ª¾Ê#Z‹‚©­Æ#!r*§‡Åýrÿ–ø_½•W¶È ZœZ^žX\J&§“¹…dr&™šÁ+·Ñn¿º8]k]‡Þa·±òîm­6U¿<·PÖ– ‘D@ÆBv!]Däý"†o5öÖ‰…lÁòq§ˆóËA”¬LBZ°ªÅkÔ%þ­&Õ7ÝV4S¶Ul´kU,p(dp±l„CAž3ªŽ¹ÖèCſЦFRˆ½ð¯ñwäääôe›ÈåÈŠ‰LTºÈjKÆè!¥À·\È*Àå,x¦zD5§ª ‹ìÎæºgéHYLœf„¬„KÙ2nÇól£Nihõa,샊G`Lú"Þ ‰ªFŠýÊöñp»ÒY¸«;ÂN‹ðµˆXõ²ìÖÄ`“×…JyeÆ;ØE“S®‘T©ËTOAѾcž—º·»»kW:nHÅGlÌ Eºwû@íÈÛõ±ZñA¾dQ£}vÕ³æ²øhdì¸Ùº9VгÃh ”êS1€‘bq‹½)cݽœÿß$þ·™ ”ìwai1y0‘þ{Ƀ饇O“dzù»/d¥¥dz:©M%s5ü977óla1´;¸ CÌì²$Ÿ^(«~ ÆLŒY¯¶åêr§'ëŽØ‚U¹€ÃNÛ—KœÇZèž§ÎX«¢œŽ¢B™£H 4¥ ÐJÍ¢ÄQ qŒŒÕ;É$aó q[°XÇ )-X¡R”ÐÖ¯!wŠ4o®gprº‡¤¬6sš±J53^Yde‡ªÚ\0Õ<Ÿj-rò+zADïH‘buÎaÁFêÜO\9¨ 'U˜‡žTM º«9Ò«Vòe:÷0¨úÄ¿t\wäíO„lÅ.*UOµRä茭]õxE»îØà/A_ h¬‰]»àòF$L…Ab ž5ôyi`­$m˜uü×vÌŽž0Rß±ÓQkR% á)ª\yÿJ÷ÈÁQÿ#ÿ«( Ï¢Øe»ÉÑt’ dŸ ^kî‹·Æ i–~Lil'Çÿ¿­þ_>äzI eryð?Îï´²´ÛÏò€7ª…Ÿ¡øÐç¿Õ¬wÎÎŽîÿüv(ÕLÄçÃõjàrŲeÞ~¾nQÕû‚D Zö"üoÇÙnWù•äV{P}‹‡®¤ÑB)‘Aý‘Ëkdµµ¿m©ë©Þ±N;”€ªüYeܵ!$ÉvÝŒ”ø¼¢ÂXÖ"/¤­¥çÚ–mg¤0´ŸHî³é¾mÒhªyDƒ)—L…e‚pkO±Ï˦˳¦Š!6BD²˜¬Tvµòѳ’Úñ†“ãÿßÏÿ§J6»Üë]5˜—Ÿ~t1''''§{ GpV”QRÚ›ˆ@à\uR¨õ•™UxÉÂBj9¤¡(!X.„Oð)„…9`5G}UƉ,³Âœ’Y¥Î²ߊt 2´¡aUí“|Îmhƒ:#×)9¥S’‚Ȉܟì¹ê¿Ì= Ö°nð2dÛá’ʈÇ3 Ï^×ß'§/ÿ÷« ''''§ûF€rT H„Uieö«¬°¿NNŽÿœœœœ¾lRJ|bÎH/ÍJ¯ÜI}2À¹JÓ†Ro¬JåöÛʰÀŸ,(Ìò©òÿárÚxi¿gffX¯vrr’3Auxy …Ü.--±KüKÙ*\  ØVIYÝWÛ0Æ¿¸2ÚgÁ\ôÝã¥Y¯6 ŠOá–íˆ i Æ+'†Í#„AäÆðêà0ܵEL¼I¡`ª ó1ÉÛ_wÍê´2I„ë™p ÂHxÑaªJ€þpXÔ%'''ÇÿNNNNN÷„¸@µîììp>zôèøø˜å†©f^__ç:\LÝ^4ÂÚ¸\bp=$V°{¸ñé’ÂÀkˆCÄ=ªüeiìðòàùùy€üÇó”³èkdSÊ«zUýJb‡Ã €Ü‘œ²ô«P·‰CÇÇÇ”h@"yÙ§ãäääøßÉÉÉÉéË&[€‰®;wÞ?þ< ]>cÿ)>Da¼ÁTU ¿~ÊtŸö¶Ì–⋜œÿ;þwrrrrú•DÍ<ÓBã'sWˆºqÈ,'''t=Â-|Æ8VUo'ŒW-ZÖÛJükš¦¬ÉÅG ‚¹:ƒ©,æäääøßñ¿““““Ó¯$:~ËUÆ*®ï¢8c]nn˜à¹MŸ(92É›ˆrÊÛ·oy‹…)¨aii‰þó?ÿÓšc¬¿“““ãÇÿNNNNN¿3úyËIem¢›ÏˆÿÃÀíG)ƒ”Èv˜;ÏÎΘ4U©ø±4«,/S€RXè–äñ¹NNŽÿÿ;9999ýVë×ññ1¶#•;D€ÇJ=ôyq²ŠsuJÒ8+ÒÖ;{®œBCî»kŽqrrüïøßÉÉÉÉé¶‘ªYUì €j«BWBÑÏØ¡z¤²t“Ý”˜¢Š…÷’¢¡ˆŸ±NNŽÿÿ;9999ýz:==å¢@?“;× hzÑKûéììL•¼8ž¬`o5ÿZ…¶ zÁØF€ÿ£ãœœÿ;þwrrrrú5ÀIå¿×Ü9ü¯œErûù¼þ?*CŒu–£zyy©š_ÜÏ’¾ê'q>í4gcJ t0Ô;ÈÉÉÉñ¿ã''''''''''ÇÿŽÿœœœœœœœœœÿ;þwrrrrrrrrrrüïäääääääääääøßÉÉÉÉÉÉÉÉÉÉÉñ¿““““““““““ãÇÿNNNNNNNNNNŽÿÿ;9999999999þÿmñ? ²Ôë°þ8ÝìgÁqÕϲ óH+,pCUHnC]E''''''''''Çÿ–û¹App°¸¸˜”411ïùùy|?{öL;———“é`Ð×_ï““ÐNNNNNNNNNNá¶úÿ°V8«Š‡Òí477÷ðáClLOOsÎó¼Õj±È8Ž—] ”…Ë!„²9ÚÔÍ:9999999999þ¿%øxž`tzzŠï©©)|ã»ÛíZ× ý| ôz½,Ëh;ÀÁ¸©4Mu€““““““““““ãÿÛƒÿØÙu HÚ'øßÝÝU玎$8êcƒ¶`~K€?q'''''''''Çÿ·ÿgYƳ³3m/--qƒð0^‰øWøéÖpG­VË•ÿNNNNNNNNNNáVêÿmbOàöÓÓSºú«·réáÁôù§i€¢Ž„ äÏsy˜ÜŠœœœœœœœœœœÿßžø_fø’Wü¯r~*ALŒ¶ÿâ`þ‹¹¹¹pÝ¡ÈÉÉÉÉÉÉÉÉÉÉñÿíÁÿÖó?”Îüè½À?Ža>l`'•üúW@ ˜œœ¼Í•ÂÐO†'èfµMG&€Ÿ2môGP„NÐÓ) Žvº±÷#ç…gÁG•Ä¿˜‡–?ù°4Ï彯Y­ÌW^äîË£z½^«ÕÀ²”©,ß³³³ø^ZZÂ7s‘¸_á'7È÷0Ó8©¼Ä‰““““Ó†ÿÑ·™™.yLøÉøszzZ5ˆï þ·Ý&δ² ~âF,bJt‚Bk âÛˆÓïJDû———€v³%aZb{jj 3Ùk÷æçç…ÜDø‹“üÑ£G„¶†ð—A|1-øÇ”À³ÆTY\\´~ŒGGG2bZΆ9†ýýýååeIQ'''''§/ ÿsÑäþhƒ ‚´>ÚFîþ¯×ë\ñÕO ütGØ<ÈG*&DˆÔéÆˆ¹j¥Ëe•:ñèÿ_½zJý¿æ9¶ñøø¼ø5Ÿù—íC@ï`JJJ†Ÿ½’ðvËé±Šç©Ø?;;ãOø'•*ÍÎ%'''''§/ ÿ+ Xè°™u°ü={öLgmmmÝ-üÁn¤iÊnÓ3ÄêGÁ?Üßß&'’ÓͼJÀiµZ-˜ týËçÂçK8'åm¸ñ jž‡7Q5Û•ÓÝ¥ãã㯾úªU÷ØçKÙ_3GÒgŽ„ ¾'Iߊ‡4:99999Ý-ü¹¹9[ö— åÄÄ„ü(ì"xWð?zH¨ÏêfQî#Ý)¡DžQú¦6²Ž"î |“D†!á”B›Š_ìWÅ:Lˆ=˜®ÜÉÇg½Úœ¾â †Æ§pp ‘ee…Œ‹v"ò1N Îùé_žK1ßÁ¿““““Ó—‡ÿ…¬@‡‡‡:€ÀXÆtAß;¤ÿ·÷k5ÆØæÝIÿ1V~Ü»×ÿß$1?íôôt4ßøÔô4m}jKµZ­ÓéH-Ìù€fÝ•ë‹!¾’`eÕ»%E"¿JòL ˜Ø†ÆÅ•$ÍKœ89999}yø?Rþ#))õ{ÇO¥Ä¹ýø_BÍóçÏySSSŒw¦uCžä|@CIÇ|ûí·¸å½½=ŸÛ7I‚ôÖ{S‘Û˜®‘p§¹ ¡õììŒxQpJ;òÿˆ”I‰Ciß±±!¬Z™Ãp’¨â '˜dI{'›°““““Ó—„ÿ•#Q‘’U˜d­áwHÿËñ˜Ÿ¹) ó‹‹‹JgD 9”l5æŸ ×Ãn@À7ž×ÅÅ'$Ä7;KCi#ÐtÅs—ó¶õü—KÉ |l¿$~‹Êïååe|ËÕGÃ2@3Ê’K[îÇYç• œœœœî:þ¯†ÅqÉ£[+Ýø¼(J‰o—K,¬ÖtN õÙ¥%~!\dQc¹6…'¿œ4Äž² FÖ0¤èr‹à|˜žž¶LÌ牓Ó#½ªÜàJ­Œ*DŽP ™õòµqZôµA•)¹„2 ó<Ñ­ÌŽÿo þ·Ú{f,seó[¿µZmhj1ͯT>Oœœî"M•499I ñ –Ö3b™?*‘˜çPò~´ôÒã›K v²@aƒ…ÖJh1†›˜ÿßüoa9¡/Ëû.--áeaí$¼Üxüøq2‚øñåÒô¶2/£ðvÈÝâsᾆØ@Ÿ±MY ”ùä•"†/¯´:ñ" ©gêÙcn’˜‰ |ø¤ÕVWW#1“ݸ ¦­mÌj>2›Öº¿<~‹•¯*×kêÿ­ O\+5yòxLïóÄÉéîRTÿQá{Ä-ä ¨uÄæ÷+À+O} ~¾ÿÞûÚÙÊ2½^¡Fa{Є}= ·ÉÿÇJªÅµ‚0ubÕüêU\mA–KÈÂ|Y"[Ømˆ`ÜŸ4ôÿá6:Iå¿öðuæ€h§Uþ“K|Lɧߊ4cÁÉåfA•Ñèx¸¶„“¶ T×ËØ)š˜É]}x¿°©BCÏþða€Gqn¨ò…›ˆ:`†ûI`[À6ÈÈ«:þ¿=ø_‰ë…©¸Áu“³—ݦ¿ÜPâ‰\RíÊHTŒ—ÅfÈ‘oÆçÂ|±²K%È;UÇ4ô°ÞþŒ¤Ú9”*A›@Ògø™­üÿeÕ}úô)àSxSÕí„x‹E+ž©  «v¿â›ÎI"K—`Oœœî(ðµe*`.\¯iÔò.Þìì,×Zl8d(S‡üÛ$!Ø Âaê9¦á¹vRJj"Žÿo•ÿ¿ÌUôvÃlÇk¢¼yÁÄÇ %¼PVNY[¾ñ܉6?{‘,Úภ¬hË`#* ŠŸÄóóóxR6´,‚|ƒœDbŽÏð›”ã¨Ã—ÔÆiÌGF°åiá$Çcÿ«Fü9~1ÄU[o.gqd¯Ä7µVwaëùOœœî.ÑáŸ+_^ë–ÐÉAb‚Vv@‚¯¿þÚj°pèð ‚œ'OžÐÄ@ŸÉ’(;ˆoà\7:þ¿mø_AëR—1>7€êiûȸuêÖª^1Œ™ýŒJ3ŒF»ÛÑwò á·…÷2걫¼ð lC@P^ žÛÍR|çýÞ¨‘q?¿ßïQ¦yfU:Å#ë‡~^|÷²¼ÝlÛ¡—vð‹—gøî´›ÅyŠï‹óÓ‡‹KÜŸ¥îÁ7Îõ¾óó£üO¿àÕÆÜè“;e–Mê[DU§‡=KKK|÷ù¦<¸ÏÉéN±V8ðÝò§˜ŸŠö¥æS ]zÙ…‚ SVaŇҳ”a ôáøÿVáÿ0¢þ÷¨²çð'äíÔä·7‘ÿªÿ3øÖPäå§¥øä%òÏR@Ù· ŽÄÙY±Ð×ëÌt%­àçÔT-Ïûlgu"˳rO§›µ;éõ‘/þí»ð;<[ lÚÇÄ K‹ôÔê÷²Ðï¿ç`³˜É¥·eègÅöØï)ÌIl§mî9Ýß/qc)M ž,¾3È yÆ·éÚ3õ|kðþµ…ðÒ&^Ó0™LL%““j<í©Ù™ÅÚÔ …|ê—øn\Ö#¾i?i p•D´Ýì”3"c¦ +qh¯˜…>!œœnþ·&{Àú- óH-É#e/®×ëüÒabÿljaØàþþþÜÜ\T[„J2‚œXRðƒ½U(ùÍ.átæ¸` ^WvL[ÆÈÉñÿ¯ÁÿJvg'á'âgm’ÆÏ…ÿ[i¡þëörÀâÿNž%…kÿ„ƒxG¹ÖgY1 {{ËËÏ&'§±s~~±B˜Y˜?8;ÉÊ6O/ëCQC>ø8øÍŸíy£Î}09Aï²§Ë'“dvbâë'O H)×ÏÚ—gió²ÄùiñB»þ}~xˆ‹ãqLy ^ƒN£Y¼1ýpzÚj¶ ™®Ñl¥ãÿ»„ÿñɚ݅Úâd25=9»¸ð8Ið"Oáu^^^££ã"¿gggGæ7®Íò“f½fCv„LÑOggg}Z›œœœn ¢?{ölmm?‰mXÉKž~Þä庿÷äÉzAб™Çàg‚ô0ˆùµþøVu!œEkB¸^t ”ò§<¢a[§IDlüfå#ò'îøÿWâ[í¢š ÿ#I^v¼ '³-Çs“ð€N#Ä€ý³ósøÙh5¯^™Ò{$O³Âo¤×Ϻ…‹~âûì¤p iÖÅXö‹ƒ);llo奚–‘ŸSW>N¿íÓ¼’­ú…‡Ý;'L”¿’™Ú7jÓ“ ó³SåÅ'y}ÏL×xäÃ¥<÷ýÒ}¨ßläýÒc×:«·J)ïb$þwº­ø?mvóvñ çY¨7:Ƀ©NVÌœf7ÝÚÝË U@¿TôhÈËG|.ZÜo¦½¬”÷ÉCš­ÎÅeƒ6A1IOîçätÛHú†þÕœ±³žVð¯¾úJù?#7?Õ‘ì à0̱9ª'ˆ® $É6§"v*3¡²™q'#à>YOëäø_ø?r‚Åûd¡ÒæÆ¿QÀ0P¼ì§¥¤œgêFq¥ÓøÁÞþÕey !úÝvÇåùiá+Þj4!ÂH¢·ÿß Þ8¥äÕI» è¨ÍÎ`'¶ëÍFá®òRL(¼‚ ëáàò¢o¼VÚÕv·W|7Úýíí£^!ÃòŠŽÿïþçöÉñáýÔâCˆèõ¬W«õû“3°9lƒ=µúá´Óåþê7>Íf{°Gz»×£ prvåEL&ðë›;99U‰Là ÷]F ãl¤Qg™€Z­ösLÙº ZK'O’Ò‰Á™X ´ô44PŽ2‰+²œU#Dð)C.'A@…‰ýq;þÿõú&¢,üÉNezƒÐ‚Š”<ÿ†ð€¡χ2*0„™éZžf…÷o¯y~Ñn¶û¯L¥Ú¿Ðù—m^E††•þíÂW¤O3ÇÞA|ÚnofÝÚâ|V³³NÓ"7pçF¿× ·èsØhò|ïž_àû"Ë;%V$æot2 Ív+àÿ!R¥Óí̧ÓI³¼ÿèéWE@m&™šJfæ’©éâ3==ùdßÜÆ÷Äò²¶ão|ææÊ©âƒvÎÓlëèpçð0/¥ÎËëû”prºU¤Ä>R§*S‡¯Ê_üV§RÝ*? 扽™íߪƒñÏá‘ 1×½€Æà%]„g¶hPPJ¤«ðNŽÿ?ˆÿ1ßä¥#=ù'˜lmÎjL]Ö׸iü?ˆízŸ^ÿJUxtÌœ>úà,V;”Â$ZÈrYø ]•ß½¼ÞÇïò|¯b7&’Ú£Å"²svªøžžHægŠo|f§“¥Åd†°mzÈ na¡Ø˜M––®vNM×ó°¹w²}xV¾½”y›ìÝZü_ºè1þ%bŸŸOæ‹ç[›N>‚8°Ÿ…÷Ýô¨ޱÐçaý²¾ÓÎv:Ýè{»Óý~«øF§¹Õií¤Ã~¾Ûm£Í‹^¶}|ÔH‹«Ð°èz'§[ˆÿ‰ä?~lþ0Sí TÏœÒÌ3j8˜ÐÈ0ÐØçÞTÓˆE‰S„XdücðØ›7oØ>”hÅ@çÿã?þC¡I¸4úcÝŠÜàøÿ×ëÿ÷ööø×ää$¤æONÚ¯Äø²”Ý€ÿO? ¼€A/¤­6Ð;>óµ™+§ñ2ŒTŠôá½æ «@!H= ýÒ»`²"þ;V¯ðæh÷Jýqo HvüÿÓÅE½tò´›(àÜäÄô“Gà¯M$OŸ$µ©Ý¼{ÂêÅéZýb?ôßµÚívõÇüëà`7Ëß6?ìíï…°Õî¡ÙɹónÿÊLлšKÍv«*͹×mDþƒGB·Ÿdrê$˶[ú0úZ³¹Ölï‡ðê¼ñ.ËW.š«ÍÖj£³ÑMß6»o[íê7 ÃJ«ñ÷ÃýÕNŸ­¼»Ñ¼|`z‚D…ÐÂå}'§[‡ÿ¹QÄî }žœœ`M'rfzsþV¤€-%jLZ.KRû(X[„'òttô1ÅOmªŸ+6À]@eÀcô¦ÆN¦µ·¦BÆþ¸ÿÿ&þ?ázUÜOžZx³Ø¸Þµÿ?çÞ4cÑ:¿Ä`´/Š\SIQÓwòÁÄÔÄ$DìÉé©€‘35†”&øcŸ…¥EüœŸ«ÍÎð/Œ`ÿÌdd:[›á픎è½üÊ?< ñÇé7¦B䯹¹ýË‹ƒf}·UßËÛ[æ›æùV¯ó¶Û|qyºžµ7òtµÓZO³¡ŸœócãM« 1uµÝyyYßÉû[N2·ôîø¼Ñ/ýˆú}8þ¿CøŸ| ÑË“¹¹½vëõÉÑvÞÙLÛ›½lrßÙÅV;xèÝl¥ÕÙ/÷¬e½êç->ýðËó6q|ÖùçéŽ_o××/Ï“¥ùó¬ÝÌÊ8”f«Ÿv=¨“Ó­",Ù¬^ÊJFÔõÕj5þœœœl6›BçççÌÿŒÃƒÊMRPâM‹Ï%&XU¼Â'µçƒIT$V°$™EMü)`ÆXƒ¥¥%™²’üq;þÿxüÏxMc%¶ív»xeÀþ+åJM{´¯÷ë¦ñ¯HÒÂÉ?+{ù²0™Ï ö³¯ï1;ΪP~zízV ÓâW£y^¼”é•?UŸFé7'Þ¸<²îâ«tv~Y¸vLNlž¦Ýƒ^¶Ó뮥­·YñHÃçuŽïôê“æùYëæ›õöQÚK¦f¨Ý=º¸¸šA¥‰§p+}Ëûýÿ÷J &ܦ’ÆlëãóÉEÇàG\Û4H¡¾•ØÃ ž¥Hmê”{…ÿ1=.ËqI¦¦Ö/Î6[õ•‹“÷¡ÿºÝ|ÓÍ~ju¾¿l¬…ð:ëáó>„^Ô¹}VòüeOŸt%OËyÕZK›;i{/m%SI÷gVÓ»R\Gª.Šù€N1÷8çA¢Õà=zå䉶L!Þ_;=TÞ;Ù²ƒ¦ÍÐyÅ#¹h iiXRJ›;1\¯˜†”´D/=¢ifåâMTêHµÖp#zSœœ~)E%MA¬áK‰@©; ɨZÆ[ƒWL“Ë%Ú8\¾2ª—ôÉüv(þG³|_¸‡Uɘ¯X|&z•œÿÿ«'-¦¾ôÊ0ó­]}~‘‡kN2ÿÕÍèÿ³ÿ<ñÏO¬†°¥Éôd§Œ½èfØ8ª_Å„Ö{y»Ì }ãÓ-²Çß܉O³øôö.O;¡wR?ËCV/Áÿ@,èÛ“CýçaÄÍ"uÇí§nY“«Àÿ³3çyŽ{Xo\ü÷îP°>iü¼Îr~€â>ò"ÀN7_=9Ûmvð4{Å#LK¸”vñÀ‹$±xei€îe½ÙnwY…|˜ù"äù¦AÞÝݵÀFÎfâÞDe²sášÂõß|=m’ ÆppQŸ:IØÖ‹*qÜüŸaÝgX)òt¯—î…|µÓx_`þOâ]ß×›ÿs~ùS»û6„Õ~XÚ¯|^æ½=|r~(`ŽAÌ|Ó<ßÏÓÚóåƒË3VŒ;;:,E€¾ž¾žàU°Áƒ`“Š01\¯P̃…Ìq0³ ZèŽ|…qX4…ôjã0ÎÛ L§BÖ­éªL‰èÉ·ß~;tá$ǹGGG¶Wì­ ½nÊÊ#Ö:,Uª ÖMÔ‹tº„IÿñÿábÁ· {úô)^´Z­¶½½íÈßñÿ'ëÿƒ 3×Lã4SlÎóOÈdOÑ’¤úŸÿç½^¨Ûê´ gžÉdúñb25QÆ~N¹>jÓÉâRòøQ²ôðjOõŸÉò£Ü µ©òSÄœ¥ÍË^÷ðü8½n·Ýí4ÎÏŽ®Är-»%úv=޳³³»h7Ĉ_^bêï5›ÿÜ~̱\W"À3)lWJý-U¸ù pøæ²Ñ9ÎúÉÔ€ËY³‰IȆkÅŸ¢ÝôêÍÑ*P£ð)¡œ3déâÛvb05_@L«ÉG¦¿¨jfûËËËØÀÒ&ñ®DáÿÓ(Szâ!bŒ¶ÛÍïÞ'ß~õýéñ?/.¿oµÿÕîüØM±|¾áŸ¼êõõ‡~Jüßû©Eˆ–… `=k½k7ðÖwÈsÒNQ`˜µ'j50:[!ˆvO‰~³³³T9ªx¨â »I¿ÇÐ?Mü<Æ_SSStiVSúN$¼àh8dzzÚª q0¼|!Ȭ_D”.}øð!ÄL©^‰˜G1NÿöoÿFÙ““½¥®’êÖ0ȵ®Uó³·ÀKèF{ì½;9ý }ÑÕ\ªÛ¨F Q&LWIï…^.{ y~$¨~šËÄÐø_tï»Þn<~ü8\/mL“çvüÿ‘ø?*~Ç ðj2^­˜iŸÆ‡¹´YåËç}ü?ø\œ©cúyR›Lf&“…éd¾VÀþÚÌÔ7ßâû}7ý?këø^»¬o·;[íNô]|Z)>[m|:›ÎF·…Ïf·ÐøC ØkÕ/òÎy£.«C‘eȰšæ?£#PDï¢r¸›æEhçÔÄi¿·zqº²d~†àÿJO["·+n/ÿøðÿF7}}z¶Óê„uJÿÿ>=+:­‹óÓ™éZù^L EîÇv§HB4ðÏÄÆÂƒ"¸¤ÀH\èö†³°ÿ¬$l_‰{¿ÿžŒ-°¾$öà,fâÚÙÙQMI«vBShY¯0ÛDã8˜Y/d¿»oø?/Ý·°vî@T„„>3•ÌNCT(_é°ÿ§4ÃÚ4šøÿ?h ¸2t›ïû)^ùv™Š¶_”›è1'Àüü<@‚ÕÚ ê_¹& WjÆj’p'K‘bþ'KTäð÷Ûe¨µ€ò#ÿEt€•)‚qOBËôÀ‰˜ièeHhµ„»‡{ÇOÌI›óë$…ÈÓÉö‡ãÃÚ©|98ýJ"'|öì¡»f&&*öÞó­‘ã\¸îÆ—Tú,Ž*\ñÖZß> /UóÚՙѶÊ`ç½ø¯ãÿ_äÿÍ™••¬A€ÀÄɯ&Bn?}úô÷®ÿ;ÿ_ž/æE³Q ‚ÚƒÕÓý7{!ÝʳÏÎW›-`ƒìl‡pTFƒn–Q¢Õïõ´‡O˜½Íñéâ³–·ÿ~ðþ¬Z¡eÀˆe‚P¼Ëà*4 Êžþ¹ˆ<Äëïëè—%\ëYoâáÕÃÃ"Ïç³ådafþ ö2+YxßôÙøÈÏë,Å üm{s%™ž:)ŸYÿj|zµ‰¬"1;;‰I¾ÕNCef*9lã/–½°qQf]ìùÃþ@4ˆSÈá©üÑ‘T«J©ÊÒ68rwwWÐçòZm~éŒu$þofÙâW_¯ž…>Px2S[ï´¿¿¼ø¾ÝzЉñÎN×Ê@à¶šÃEÂBàgü_˜Òkø¿égÀÿ§Ç'|LxîZ»é¸®—AÔ4`P€0<žéìì,ÎåYòIÆãf Sðgl@Äc €Çââ"ÛÇKm>99ãµS‚Eƒ”S(JDrŠfŽA›è6¦V"9$[庛‘ÔOâZì<&9ΓÁatE°?éS¡è0uÃÉé·"L*‚vú'[%&?uì`žt{VŒ÷ÓˆF- m[Ö»2r¿ù4oœQõ¿äìÇí003ôÀ*iÍ÷íøÿãýáù0Pó+ÕÔôz'·urWüÿsþÏ *Àêûþâ$y²°“ÕBï'{½ÞÀ@³ý׃#llô6^µ:#BD˨ÀkŠå”x`3ôöB§ÓJ¦ H@ép±((6 Ö ¹ *w®ã‡‡‡wÎÃ6Ë‹íË4Offû½í^ºÑË’ù¹—WNÚHì'þ/D€ü—áÿ7Î^?ìíO~õ ÏñàòâÊɧÕþ/^ªÂù³Ãiö`ºVo´,^¢3ƒUrê…¢Ö«ƒtžøÉHO©‹ƒñ‰RfíïïjiÐ_tmå…ÀX  M¼zQ-ïûƒÿC™r⃹…ƒzc¯Ù|¹ûë÷»nw#ôÿÿzqä¿‹<Û?Çàÿ—Yñˆtë¬eÝõn#©MµK…C:ðÿAøìè*MÕ xÜ@„@æÏŸ?2“è§`0Û±FŸååeO›pÝÀ¦GS²4aòØáXc“üˆˆêÑ,Í ì%JN!{!†½ð¨XgH‚dXˆTDSÜFãZ±I»Ö'ÊÉé“I®•v.ÉE_/ §¥ÞA¾¡~íûȳº‹ŽTS˜*¾O®šjÅ‹—´]]¯)›ûƒvüÿ‹ðµ¶/ …”Ã4×rV35nþ Io…sKƒÿ ;5ÞͬÝ(BG“•úá«öñ^‘úã|½ðï¿ìfozáUšÿÐlo…áñ€eHàÏþøüòŸúé‹~çM¯ûªu±V??è¶’¹ÙÓËzaq(/MW+J÷áäé%KTjÖ»•7˜)V/óÀÄêÙéN?[í¶“‹ÿC„ÿüÁðÿß_ãѦœÚu¯’ÿôB¿wyz¤¯““Ó˜K›;{øž›/ÀŒu¿¡C¡N(=™‡z2`YÁ1, CÓ˜N!‹°>ÞrÆSSØÿèÑ#ìßÚÚâ‘’µ±<=yò„/_Ã/95t¸Ðh¶‹ ñSõÓ4=ÇNOã±þÏÉñ.Þúzýešn†ð—££7ýþÛÀyRùdW²d!ä×ðÿËV}'¤_=Û«Ÿ¥å9;Úý²ªø`™ÆsÔÂmE~1^Ùà$Öi)—¡ÐúOãÐe ,r.„@¥º 8˜!!ØIiÑÚ#ªq‹ÚÃ^á›+§–*Ñ ¾åöd}8ÑÎÃW¯^Ùžã*¶RªÅlŸÝZêôѸ%$nzµãÞÃB`­zƒ,¯Vâ>…FÒô&÷i¾|×~’SÅzÁõ‚9ÈfQ/IaÈb,è¤ëÿÿ$þ×TsWa†s‚UÐ~© ÀnüÞós¼þ¿p 9n2Yœ~Ý8zZ¯:E&ð¿œBø©ÓYí‡Z­íþÑl¼ÈòyqàU–­¤ùJÊïüE~ÊŠÏyÿ_=|ò{ÙO½. ãëvs'íl×/“院'i—~ãí[ÅìgÀÏ壴n·Q*¿[Nt¼§k7ÌÛËó—çgÉÓ§«YÊ4>+eæÆÕ4”Ÿ^¹óà¬/ÎŽ7šõdfú¤ÛîQ…M¶Ýj@è—]iš£ý2)“í(^^zx® Ì 'ÎçΧŠÞ2ÿ¡™-³É‚ˆŽ,º“«ªc—¾pÕi8¿¨'“Sç­V2UÃFQñyz:yüä/‡xÇ¿¿¬ã­ÿ±ÙÚ)¿•-ªò镎d½A8y1IV³ÎFÞÙÎ;Òÿ_Uˆè_åâ¶î´JîJŽ*k¾?«yrþÈW‡Ï]‰Ôl*rmèBTÔh¿à4ÃÆ-\QdS 7  .jY·Ò›Øv¨Óð"g¶0ðg°nÒ¼Ü(Ö'l]×]€œ~Šâ•¢Ç °exÅT”J_ˆÙÙYN{k דßâ/Ÿl·’ ‰;Ê…%fA)%þõÇíøÿ#ýl8ŒÿB÷d CÖ*£'׆þ²Ê Q˜_nLÊPÎyvF²­ ÍüfÆ]å‹¶Êpü_–ëÍÓ¬Wzæ×ûi²4³Ù<ýáx;y<h¼õ¯ÃÓ•Vë „Õ^þÏz½Xå{½7ý|8¡È"¸°ÑM7ÚÙ;@Êî•zy`è•úÀôMÚ}—¥[Æ~£‘LÖzƒ¤£ôÿQÙ>ÂE% Ɔòzñ¸†êE¶…lþa´c×ÇÍÍMm£‡HÕI¬Ä.^lD0Õ®û·S.¨_¶ ?®<$¦ÛE ºÇIm¦ø=Ù?8ê体‹Ë÷gçÛY¶Ùï¿M G¯õ<Çç§ËËWÍæj·[ýà¥~“¶W²âƒ7is5m¾í67:ÍGû;í&ŠvY*lÏû²ÞìÿF¤5½ªlwrrúE¸ ÜBn”5×bx¬ÎŒpåÏLì =ål ^R®Ñ lQ´;Wù¨"Œ•µâóÛ†{2Çÿ¿þDÇß z‡ªD‹üßž={f]X#ÏRl(E•=Œj%fRà̃ѵ€6—––Ô‚u¦Å)eó`ÝK«ÓÎVÇ]Ãÿ…æ¶(ãéd/mÌý雕³ƒ7§gImî¤ ûýëáÁúVYëó‡nk5ô’ù¹âóôÙÊù%ŽÙìäo»Ç’R(<„ËÔ‘Äÿïšýz³Àÿù PÿŠÐÖR51 EEn±´Ñià›<L ÍÒ׺ÓkQ-sÌq¤äò¯©`rcú^UI2 )àÅÚæa£µ¶¸×n¿9>^»($Øîíô3ˆ=/ëg¯ÛÍòÓþ˜ï7íú?¶6Ób@“ZBÿŸœèâ%xg=×ÌÜûìñNó,™Iv{ííNwâ»?ü¯µõý~j5ßùgí¿œ¯…ð¶ÞääÏÎ7ÚÝ7õöjjãKpÚ]ÏÓõvã=PÇt-í:0ÐöË \ÒÒn‡ëQo¬¤ÉŸJ BÆLî>›^I€A‰»± ®…ÿ(óv”·?Uô-sü-„ÿû'f÷Ù7ÿ–<˜š^z´ôõ7`¾xFÉôÔÔ³§«§Ç˜p{·þýî6æÍnžŸ,ÿÈïwzÙ÷ÛkϳöÑÅçe?ïU?c§0¼Ø_x)ÞÛDœÛŒã1ï}ò`¢¬î1½øJð×ôLYÅcìwm*™HfÊÏôà35λøüVñóFsP¢(¹ÿF$Î<”C:99ýJüo£ à©«J*°®ôÎl «-éhóú*(XÚËÅÅE.ëÁÝ UÞoIÁ §/ÿ3σv䚣Lj ghÝa!ô_>¢ØÐëUuˆ,þçk¥ÖC‰ï&º!É"*iƒéô–Ù{)šø¼¼Ý<¿3Á§7žÛy'[9OóÎUåîÐè<£>íò˜öàgwPØ»åÍV§Qf*j‹ŸËØ÷Ûêÿy ôí÷z¸NN¿ þ·ùó©1ì 6”ÐŽTŽÌðLí ¬˜ ÛÁN.îaà¯åX•Ùå ôøñã÷ïßkÕV¯°¦ÛÝNŽÿ[ü/P­Žñ-P!d!x&…Óæ«K/ŠåÏ&¶…lÂÆ¹ ã_Ú¹0.þ·_¼Œ…n§õ`qöÍÁNRKvß÷³dnf=/ŠþÏÅÉ«~÷_iãÿ;~ÿ:ôþÙ¹|Šô€É£Å½6òôÇ‹‹2Ъ ×ðÿL­5pé—ïõÇ©žgò :~õÕW³³³¼U^{ôèk}Z‡(ò‡'OžÐeHæBau[ßüG–^W·5§"…Ãîè#ù.ÞBý¿(¼•6:Y'—íôÉWßÒQÐXî¨Ùj—€íÿgïM˜ÛJ’-Mp_E‰Ú3_½*ë2ëÿÿfzÌzºm^ÏÔëzõr/¥R+)R܉•1øˆ“ÎQkB¤»ÁÀË‹»ÄËq÷ã»íöilWù´â:k§yô¶yÜçu<ë¶šg—cÜ{úôi Ú_•q2勺q¡°=ðÒ»wÐÏØêø%Æíêãñ¤~ãCÛBë¨Ù;휩-öÊÉþq¯óiìÿ¨ÞÑáçƒS ¥¤$þÿLø_ßšÄí^«yÖ†}ÇÔ—‹Î½ @{Dsóµæ÷hýKIüÿ¹ù"º¦}ûS­T _b®ºêI™¶¸ˆa.:üë˜àP‡GÁ§9¥Ë0ߥÿ%G€¹Óëž…ùzÔUûÍîN?uìJ?jïÇ7/‹³•ÅŸOOžô:?wZ?•NãîÆÿs¸ûtè¿ï¾nÜYoÜZ‘‚ Ïò_ÿËß÷ßþØ>'™©øÿhÿÒkþrz8ÀÿóÇCäyv‘jŸ(¤sêA¼íñÊdÔ1'à°ÔÈYÚ8W…Ë4£ê‹qaÑö³Ðlmmqå) à·#P™`}èÞë×öIç Ïç¤ÛU8»òrÑÃn u`á÷¤¯3Ú±§{Öÿ´‡ŸîÙ¥þ?å¢;œÛyʯ¿#ëëëçì4ÇÍß9N;­ÓöY«÷»—àèwüô~ÿèÜÃ݃>ìïöµÄþÎN‘"ð‰c£¢×õÒþŸ’òIðùDþ?šIAøí 8£ 8TèW¼\ŒHœâÁŠ>®S’,"ñÿgµÿǦ¦(°‡*J&ëØÝP„‘ ´é`v#FóÛ”¡wÐÕëÊ„êqX]ƒÐµ£Ýû<µßÐd7Šÿ÷ßöËÙê´ûˆq®ñdûåÖÉÁóãƒröÃÞîß¶^n—òKçô¼úíu);Úýgiÿ{Ûë?·Ož´Oõëß·^=ïõ~nµjëÓý±OÓgŒÑç§ÎÉO­ã§Ó_Ÿ÷³ ä‹W/cyä1ð6çR´õõ³ G'rëTºO­o½×­Ùó/à·Ì{‰iaŸ>}©i*¦‚2­¤ñíN?´ú¸Õ~¹ýæä´¥w»´¼ºwt¼û¶Ÿ¨ëø¤‰9wÿàh¼8ù3h!Gƒ(òî œüðøh¬A¸[­4“üíØÕ›òÅ$¦]3½Àülß6·¶´<ßÐÐX_\¾µ²Êöeßñ3>+ ‹ëË+Ú¹º¸ä_µg¶1óIî"]Fí)))ƒÿ˧ˆÿ·^ÆÎ§ÎßAÿðJ_Æ‹%þÿ¬ñ¿ j\÷#ðVƒt«.²Ÿ–ɵí˜ÁÒø²v/ÿHG¾ŒïΩj´½¶¶æVWÃç!éFì¸ÜpV¡²Pý0çÁ¯ÙFßÍ{q¶±0×wùÖT«;.,¼îuwÛŽöŸv[?Ÿ¾(Ý÷ß>kžnu»?¿}»{vöìèèéióISŸöà»ù¤u¢ÏÓæñÓ“£­Ó燇}þÏ…ùV(uB_fÀ‰)Cü/C•©MX J Ùö;ò «0¯ÀÌ3~Å•/º³€E­Í@SˆZÏÖÖ£fkyýÖú­Ûþ»œ›_” ……%}/-­è{~va¦1;Ûùœ™¿ò÷ïTK3ýÏÂÒ"c>³ÃKdqq1.~¥ýöË žoö¬›é£ô™¹A–Þ¾ý¿ÙjŸœ^I1Y йýLÍÖñá‘6:­6û?ÿgdåR­8ùSRR>ÿ*þO‡.²á?ÎÚ%,ÖÇu/"Ä"±'foLIüÿ9ðôü§YªTìŒ.=ú5æ*¢qúû“ÛÕ2󗊘>À45¶6pƼTvÙµ)̪„æôXȘziŒWöÙ9ÿ?¡^waey奙•5AÅùÛý Aóóf’9ßæ37øÌÎ÷ÙæõéŠ. ¾.&¬8À›+«}ÒÎý·¬ÃNĽ¤2Þÿ‚ÍUÑ…÷î?4ì_^\àçu·›µý£ƒc³þ Ýiá·qvvNÌzÖëØ™ãäøP-z˜°¡öì?;W:tÂY³Ûy{xÐ_h·°ÿ·»8¸ܺu ,æmqJ +žY܆¦Z.!X»RÐèPNô—ïå"Ý4QjB÷Ì;ôÁëÑô>i¿·þîö½•^óô˜î ãÛ9ÀçwÛçºy?â~àÖ=ëõ#ý›§gaÌŒS¿#^µö}ÿ¼Þʆi¾Ò˜’òâ”yĵEc7Z Ô(3¡Å‹Ëè8ÿOÈÿ•’rmðE¯ŸVVVl@‹L“üû_vûöí2KÞ»w/ÆËŠp)» i¦³o¼xï¸ók¢t³â”aÂSÏŒ—áÿs¸:u»EšÍ×™‰\÷›'ç¹ô§ µ§Gw%Úº÷·Â1GÇç:Nù÷ú” íãÖeñ€%ð{ƒ§lgûÑPX]»Õíõë¼Ùlÿþ–)XÏZ½æá)˜nðKë´u2ø¿···ÛíG ôÚíæÙùq=mî†z²Ùêui'Çlìpȯ¿þ•P:x\)+«Ì‘ů¶D9ÜÆˆÝËp/_¾¬<ñF•ôr1geôõº*€ ¯âNÕžÞ¾Þu«uÊ{oöcÄ{o÷5 ½qK8Öoªž{GGÕ{៶šG‡çNbí–TBý¼ÚoÒ¼3ÞŽ5Ýãæô+•ºçœ¤ì¼±z\JÊ ¦u1¡÷’ãr|ðìÙ—~o!¾n†Ví"šÎä˜)‰ÿ?ÿ—¡§vò/¿ ¼w~óæ ½ R]è_r_zÐÔ°| ~÷üùsBã¥#¨3ž$ÆÎx¨Ìž.¤nä‰Õº€ÑNî7V8ø½óvWPQE>§²ì³´»»7^ƒ8«k¸]£ï¿4p às´»ó{ìïŸóûU¤×Ó-G'ÇÒÝ¢Íü`oÿäèØvÚþ ü«Íç¯_ Ô‚=ìÙ³±Ý úí7ã9£†;@z¯wÞÀ$äß»ø^Õ­Õ˜s4.^ýÂŒX‘Þ“>í“NaÝ0jÇêìwËá”­­-kÔ)'8÷Æ¡´Â½6ÚZ%Àm@Û[»;´ ½ÜÓNûœ¨}º¨¡'@ßÇ퓾ªX:­~BÁÞ³­úÖç°{zRú{Ü,âp_"‹§*•!DøÃÈÉ[†()))Wí#…8;Ôù ¡÷îÝ#!Žù<ÕUu"á‡éœ“rýð¿½ë£õLûOG³· ßÇà®ïÓ±¿©[ ¢Ø¢E?ª¼\^¾|çÊ?ÿùÏNÚˆª q{{[ºƒÍ澩Nt᯲‡o=é ¹Ö „ë<¿üw„n=ÔCΚ'§­ÓsÇ›˜Ø‘&ªŽàjfrv;ÿå—_Ê8z%f%+¸ôÐþ­,°asqt+­®©Ó¹Ôõ+cuجKõN\ÞÚoS‡H `ãåöVw8Šíw‡ßú÷õ®~êíŸèÜž>»G{Bþ­Ò‘vðòõïÑ7æF(!T'¶“˜`…–ìâñŸ Ž®“¦¤¤Lg&ÂäXBb#|‰½P(¬r÷î]\€ýÈÚÚš¹»Øe’Ô”ë„ÿ=û¸©¿xñ‚öoÔÍñóêt ÌžN ëÙmggg} $ з‰p5U{ý+|®_ï߿路:LwÑeÊãØd|5öa½?ˆÝì{²¡ï{›wgQÛ¯·ú7\å‡97BŸ›¢/üÚiµ±9ŸGv{Á8~hŠ TE¯šr™Q—h´ SQD§*_¼z¹¿ßWööNnBz'§§-!÷2 bdk{§ÝîÖ](àÿV¯+`~±¯ä¾ÝÙüÐóa¨Ÿ*›æŽÈÓ>ªŸêÐ8þù´êVÈym$_eÖ&#F´* 7R'‚úã7?…yœ¿L;aÄ`Z?#ݳHøÏ;ý9:>%º¤Ÿiâø€tçí›n·Oô‰§P¯tOø‰O³OÑÚd„—«zl«Ì„T¿ÑÛ_%'\‘sÕZ"ÑqŽ))ï%ôšh–ŒûaÉ+z2sNÄ`ùW@"=ÿS®%þ7™-{À*äœ2Ã-ì”ê8 j¸éðó‰”5fž‰AÀõ÷ööØSÝ©¯q;Ovlb"m°Ö0Ö¿bò[€Œqnf–ˆà~ hßp!ÈïU9ÆøüûtØÀÏ£6tÝ¥ï5ˆ ¼L4é µ.%AßáL™ 49ºDjà;wlñ>`âŸÓìvX&4¼^·Ýû]oÓ«ïžuZÝßßroLç)Ù>OaŽm4Ôxú2ƒ7ºß_e0¶ÔK—®J˜ìŸÆr#í˜înhä;’E³á^;BßGýìŒu.瑹±¸1.eÂ$|Öçk_œÜÛÚypp¤5œ«¥,/¯¶ZèP탃=÷÷ã~P@£Ý:Õv§ÝÔÆÉ ~¼ÕüÝJ ,FÀKEß'ï^ŒVbHcàåzôË %彸òèÑ£2t•4ÇÒ˜Z(ú —¡Ï@ß²4ôÿ§±1%å+Åÿn؆U¤šõÜFµK1q?ŠQB±ËØs#Tšê“¤ £„º;„¤ Lˆ¯íýÏ9|ü3ߘé;ŠˆûÎ+øXùN[}çÞN¯½óöM PŸc§£ÏYÿóû§§Çínëì‚ÇH4ö.a,ƒU Š+ûïÓ‘ +€DK8¸ñìî½=xõ¨KDvû¬o¢?Ø;îcõãöYk@ärÐt¤°Žk7{ÚÖwç¤{²|‰óO9n5—×ûØþpÿàÞí;/ýM?¬-,=~ø(ÒA° ^ªøôŠg6r1;LžÅhé†x~"‹´ZŽZ>Y&Yk³.ó;»óšžîê‰ÒZý¤ø÷_íLc^Ÿ ¿sq~åуoÙsrÔÚÛ=d{¦O¶0h.½ßêÝ[{o¶Û—T±­ö¥åÅFƒoíé¶;,‰º$¦ÿŰÏN½\çé#©Ÿ YqŒØÍÀQ)))W·Ü¹s‡Qó¿þ×ÿê(Eû*ÌÏÏ«?²­i÷Ƀ*ÖlŒËJ>ç”k†ÿênØš° ­Õ *®xd[¨¢§kÌ fòÿ¨DÚ˜0àù:£œ'e˜,ï2~ÅËðÿ9Ü:9íuº sý™½9ðÕi¶OAõížg¿Bþãðÿùþê³?p'>ø–ƒÿÏÞe™´!b‚ “_'^÷¿S1—³¹…ù•µÕv·str¼ºq«1Ó˜Y˜'sfÀ :ט¿·y¿uÔ'i_š]ÖNíùæÑ·ÚÓ:m븙>»ë‚ŽùËçÍîN?€å¬¾w·:úìí¾ÝÜÜÔKp:R¬\ÂO;ûÉvQ.úíØõÔî©V­hx09O~7XüSLLs[ŠÆ ¢hI)¢ûŠ÷À§_oq~iyn@{Þo÷o?`ŽY™_ÒÉvþÏÚ-T}6VWT§zU}Ìßl•n¯¿ÑíuONæffÑ΢ @ÛˆC¢¹ÄùI×p…48+ f?Ž#aJJÊ{ ±~ëëëN¨ouÏØ¡èŒÚo?g¡ ÛR<ŒƒU"¼É%€”¯ÿGN9GõFDZÁ˜)Tíc|§}¬9=(®_AôeÞ»§Þ/èBâ€!Çdû1åax¢Ïð‘ èÙy„Àô¥ÕØo•*:o« v ŠM(ºXŒ'­U™(¾’É*1K6vD)!Øpì°omW.íŒYKXiÅj4¸£„u"¼#>Œš†2à6Ã(Ë  Ÿ´K}c&Ø~mYp®ÿ°gö ´ÂÛ¤ˆŠ+Ìî~64ärîY·wtpm>?þÕ}ê2ü_m[‘)8×áöV|0ê0álªmÅñ%ãà……7 磼C.üÿ^ˆÞ}z×Äz÷3ñž¸%œÞ½{wg{—=z§3 ‰R)m“íkf˜AŒ µ„þF¯¿šˆÆaÖqnç 5 • ÷E‰ÆŸð‹®FV&<¯ÇpbiÑ+’•G§ä_:,)¶ÏÑ °ÎÿhãŒXPæh&rý;¥£ý±iÕñ`›Uc ¼#YªÜc%:{ÓËÀ{VŠc:Ë”›`ÿ½ÆÞþ´í*1GÕÔl¢ÓrJÊuÂÿr Tp! ß–P úò7ß|C¬âT nH• 0™B“ޝžñàŠù‹ˆ QÅ耭b¼‡á"ÈŒ ô"®Îap¯S›qÇËðD)DtXj·C~åŽT‚q>Ç8ˆ€câí§¨¿Þ/|2¿ûÒ¼IY£ ÀEÍžôÑHôy¨øN?Ò/…ÊT+•šFö[È¡Uøð!¾7„“¨ð÷îÝ3Úo“6 BÚPŒމu Û:ëÖ­[ÔFþØB¨ W¥]æÿS.RôÐu>q'Ýpee¥ üÃé›T¦†T Bîß¿ŸâfÚÿ_¾|é„&ÎEâjÁÖ•Ÿ*;¡ÞltÐOÑÉŠPêDëh~w{ú œõüùs¿t;tÅÌ)*§”0*/7n%n´s]¦W½#¾}çp¬xK@>03”á",fM!ˆÃÞJ•…!ŽŠpœ:ðAÛj«Q ‰U³³™Íqî£Ö'/ªQo̓ë>ÖÅ¥dgUN¹Æ¢öà\º~û±DæÀØ5ÿ§\cüu(°~øÁ^0fX4ÍM™8*§h Ë“!¥{·gØø«Á^]@#¤÷h·6uX†Œ î§¼#¿5mО>}ÊÕŒa&?¯s/'ñ¤* Ž{4-–NÁ1pôD1xNáy^õƒö{Ó¨• Ž!ÆùËZÊê~³!Åõ3 º÷klPdØÑ—á®is\œïê…>%bcÀy•BÂ¾Ž³„`eèI^‚…ÍGšn½ŒÍ؉©ßP–ã—ãÔéÀ̳)^©—Ùÿ}ºn-Ú(%ñ„îܹcâ®l‡‡8Žqºë‡ æñ²ÎæŒY¾ ËE—ªíímžÔ'>}ú´ÒÂì¿d'^öDuFß*vßõúbd÷ÕÁ¿+ÓW †UfnáU 6¤¯E/ºg¨Úi^ øí·ßx5\3¢k¿Ó qê$ù|/ËOa%Ñåw–yçŽÆIó߯wáœV®_âj‚úÅèêÏM›ýUÀH¼°œCÙV|6#Ä­·Cw nùil´‘Õ=lŽË¦Ëû‚V £Œˆ×-ü*^ëŽr#ÑwïÞ¥!yD¢Ëë²Bø1´ß6 £mŠŠV«§ÀMg1úiŠCj2Ö­ _¿~Wß( ÜðŒo,v2§ôd·Ÿ ÿ³¼‚Û$Ϋƭ ÓwärÎ5vBMÀÍž+8B(7t$„B:ÆÑF\ §z“ ½ÓY½Z¤°û™Wb£›Wê¡u–¸bR•M«Âd˜A¢®ÕpZ¸UWÃý«êGŽƒvÙ,ωüÙhêQ=gƒ§<ߨu±hÿ÷BüèZ?v¤*¨0ñÊM°ÿOP 4ÈÉõaARºMø%ëÙ–á$±Vipp\ ЇMšÆÒ¦LygüÚ§0D\6zú÷:7èUòˆM;ù›sr Kpú2N†v7*aæ ÄÁùÑÀ2á¾pR±B‡Ao½ÄçÏŸûRSè×Að‚WäJ™x3%%åë’Ú—‹Ù·=õhHÁ5NF«íF˜ë†)7ÿ#1oûÇ–‡6e‚èýÚÏq1õ³á<öÁ˜Ì×ÚOÖpJÊÍgÒq*¸M^0ði8ŒR…*ð–’r½ñ¿§Z͘Ò677?LÿNt¦gÇIžŽVásCôÑT5e˜ÄÖæ¾ød"mW¹H5gè³Sùö¯š·ŽS¹V²,bÕlBþ¬”?Pp°z\¹˜Œ,f›­p8G:5­SîJ4“Ê-ß{JJÊûн lVšÎŸ´ %þŸfü/ ©WÔ­¤Xô"ÆmMèž¾] /^¼°!·Œ$ˆ¤/³¡’D«¶ùÕ£p{ Åÿe˜éÞÇdTæ—Ä®m'P%ê…FîeØYn!_,9ZÊU„$\t:©lUÿõŠ öyuŽ&ã°M€žî¥¨|ï)))ï+d,5`˜B\~¡‰ÿ§ÿÛ¸‡ï:¹3>¬óÍé‚è¼ú޶ÁˆÀaŠL‰±w*"µ¾W„¢ïXü¯Qô=??ŸÆÿ//G˜ù“b»Þ&PPWp¾Lžâ”+Ž9óíH&]€îÉë†^Û‰zõ–ïß¿ï‘!ŽùÞSRR>Ì(aäÆÐ(”¼)‰ÿß ·ÛÿÇæôqZ]]ÕÇ_½ze^G` †-JgŒŠ˜ßÙu .¦+•Íê2üÏ6mnnN×´BÊ!ÙÖˆ.Ñ+0®ÃCŒm»‘8Øô³i-™Qÿ²iËÃEŒ+\׎ý0ü[œí7ß{JJʇ J&žþ#y¡ÿO-ÿ§S?{ö,fËýxüï`Ûrѭפôæê4xÐé1-gùšö:ˆ£ø_çÂÀã8ßG¶Ì/&ø{4²Aþl¼~ƒ‘ÈÑž]9TNÏ<ë—ˆ²öôéS@»3YÛ·Àƒ“@Þ©.ÂafÞˆ ùÞSRR®ŽXØT°{ÀÚÕ3/dâÿiÆÿ±e~€ Ðeþ?–ÛÇàAhÐ;I‰5Zÿ€Ç–Q÷2ÿmèvÊ®÷åÇççÏŸSùdI‹´Ì´Ü„Pë¬Äh‘”?üæÔŽ#†Þ”­Xû£Bç5¯Ç¥ò½§¤¤¼¯D7BÄ–Æióÿ)ãòåLü?=öÍ¿œ/--}Ø#Æÿ|qÝ(Rt–‘LÁêÅ8”a¤¼¿{ ==æ,ëÿOÍ—@žò%qcÔ 1oook?®\j$î#‘A C?¥‡äT Î?ô;Òm”¡©qqôþìÙ3Þ»|¤áe¥³] |ï)))&¦ `T™Â¼0å’üD)‰ÿ§ÿ«ã8þÎö:•öƒñ^Åÿ{¥u0~ üK]¡>Hõ0CˆÐ‚ ÁãÇùW¿êýªctmЛ.³ÿSóUF°”/ Õ¢ìðzõꘫ\_,…\Ê„—X.²¶š^;*ã1ƒ†!ýhZ ú¦{"*|¾÷”””÷lŒLŒ'‚dœ6¹,?QJâÿi°ÿŸ3W±™KÿX±Ƚ¾¾Ž_ÇÂÂó»öÓ ÖÖÖÌá©_mÆ×-tÌÊÊŠº6;ùÚ9;;«#uwœùÙCWÒ1ÀKc`'ÿj@0oa‚Š‘h§-ͼFn¼Ffa¿è ÍWð‡¿¯HÊ:v¼ªt±2`âºsç}óÃÈÁ®°ÒáõÍœÇSRþpˆåСQ»¥óFê*»c]\;¨pH&^!®\cÐ`(€æ®Âü“Sÿÿáø_J´]nÊÀÍþÁƒj½,®¹¿3¿†ŽÔÃnnnZƒÐávnÁu%/øz˜¨°jÍŒt4ÃKØ ÝNt.×4óOz|ŒèÝQí¼è2`m™§\dn‡û…aÓ/ËÛ)àû*!>rΑA¤FTë¸Ôétt"_öF‰ê0.‚ŒÕ¡RRR¦ÿ;3¸Ä“ºp•ZÈu@hÁª½†A]ÄJAL]䉬êþx±Žò|&þOü?µøß=‚9öÿòåK@5ö®+š¹lç'Ýöüü¼®IŠmÉ••ú…¶¿ýö[çݦ+©–p‰—Õ¿ÕNJ¥SÐM¢{‰—Õ gggݵZMòÂË š«·o¦÷ø¦*­Bj#kò}_ž¼ž£Öã%Ñ”””éÁÿ¦ŒP\àä²ÔBx&ØÎ¯ÿò—¿ðè"ö[ŽkÙ¾¦ÇÃÈ}QB(÷$þOü?Íø?NýlcȽÿ~eæšì¿áh—׌"ì1«ýš==¥FŸ:©ôS}{†ÕS0í´ñÍ‹ ›››öЋ{œ_¸düïGˆÞ`ÒDîëëëvøáešy‰š‡Ñ\-™×iÞWŒÎ ¯ö‹ÿj̲©ŸÞG¾f»±K94lU–ÕLº¦¤Lþ/~&¦Ê*…"ooÆÊÏã¡FHõk(Êõã'ƒ^ gÓK÷÷x¨¹Bå/ø?ñÿÔâÿ ÒÇ52Ú­aÛ;M^<²´fâa¾µ>®Þ„ÕQp A[øð¡™r9raamX]]õq›«ÍÎÎrµø“c« S—§|€lllèŽeÞ/È;yAj~)ÚàH^ûSþØ÷E/`[/‹ÃÔ=yq~S¼,:£¾£m>~ÓÄO­F^’Ï*%eúð?p]]5F-Aþøñc»"3j¬ÕèÁø{÷î1ôÙŠhâ<#§v‚”îÞ½ë©ÍYJ¥t¬¯¯3VpdâÿÄÿSžÿw¬ØTè˜ú öŽ1ë;h\Ø Ž`ì§Nô q aŒб! Â=qq ׄðÒ}T·cp=h\ŠúPЪña¬¶AŒzöÑ~NÔk÷õ½®A}Z=*ª~X ÇÇJP ¬êÛØ>c…»ñkà ;ùfª`§aÄ{i§oŠPx¿¸iSF¤G0>PlVLô°äÆÎ놞ëÙælnöϤ|Žt½ÎebVÀ*Iÿr5½/‡¦¤¤Lþg¹ß Cù¶£#NrÙêª Èɽ':ó0‚E¶Læ#“¦ý?çWÿ휃 ÇävûòåK/" »×İz" ?a9}õ¾û÷ï³xƒš­¶\¾na§±>ªÕø‚ì‚èʯœ7ØŽNà„f;+«O¤0îÅ[Œ²€~u2šúÍ›7BÑñÙÙÀÍ$–èfS†I(à‚fÐ8Á(c ^7ñeàXâyN¿Ë1®pÜV« ¢|óÍ7S˜gÍ®2À{[ÕÂÓ¹¥9ÂÈkŽ:€màa‰¿£BˆúwbŸ/»ÎX±Ó åqÀ‘_ºš‡d'£RR¦ ÿÓÇ?~Ì€ÀªÑ¾=œÅɃԋ_¿~ý׿þUÝ\ƒ‰z7—]XX`€…`¤ ]ƒ ª n­ †šH{žø?ñÿ×…ÿíÌïÄvWÁQF2Ut!½o¢OKÂc@ x°bn°BPÁìÚôU‹*p~~ÖM‰j4×O?ý4 Ñí^.&tðèA£jÌ+§£1ÐQ½xŒs»ë'K@ š£s3?hv¨uT©ÜYF•2¸t¢1Jõï‰Ø@’{{{¼â¨zhW¦Â#Ã’JËêßìÄ/e ëÙ¼’ù‘^é>‹ P嘚„êšÑN6êõ:؇icòuÆÊÓ§Oãíèk&Uª:ÿSR¦ ÿÇ5Çû÷ïsŒÆg±Õ¨wÇ^r©;W¾¬:Ý0æ·ß~Ó½¶¶†?¤#uðíÛ·¡¹{÷.v_!úQ'þOüÿáÿÈ¢Y†)³'øÿxýiá(ý n˜FÏ>‘Ä2xŽ §êŒÑ@ÍM¿övÅ3Ú,ÌΘ’ÕÄzX#.׃NÖ’­¯¯¸j§.µÿÚ),ªƒí5TB©uUöKq³Mɬ8£F~Bh]üg&£é¤¦|úô©+YÓ®š±ªtyy™zêŽ3¦ªÑÝÖëP‘‹/ºfÅf××Ô{œpwŽ'\“îVÆ1„ä4—’2UøßûêõÉ`îÙ_ƒO•lTÃ…Žã ‹‰«àÿ ’© ¡Î1¤ñ܉ÿÿuö›Ýà'ðçÐSX߇n×Ó¥ö˜:Ût⟜—všÈ¾x-ùº^_‚éÏóÅÅEaÕ6`Ù Ú Â܆¨ÆTñ•E­Xãê:TæµQ¼Ìãi9pœ—ú'†wÍ,ÑŸ‡j,GO7Ú¶Ã[Õ¹¬šQ··nÝ‚x_¯Ò³Ä +W¦*‡£O]yW†¾?¶ÝºØ<šÉ±á,5E§~eéÐÓ®ÞU¤š´Óõ¬öw_ ‘ͼ9zËÊ©·ÀÚåñªŠ6´-Ýô*|h)))_ÿkÒÍlG¡ÈkÁ¼é¡Éï`ºx_¯öúH®ë([úÿdãüzñ?ßÄVWyd7þ&ñˆc–7§ºm›Ñ}׫êî’ÎÐGØo dc©fd@åîb0ìþ~ š–и]Õ¥jä¡€4Ôjô‘à¥PKª7~ÒÁ¶l0BÂuöiyY¿êyDc¾ÚªjlssÓàŸj÷JSlfü«I‡ŽÖ€ê¿Dœ/"™¼Ñ¬:ÈgZ›á™@¥°32”`l·Ç”iÇ`ä‹GËËË´|ö@©tþ¿ì:îUX·—fX,°S–42G{àÊ))ˆÐ[+nuRS9EËe‰rœ„%æ…ºÇ9LÆu —]H<«£ÓX5cæDRŒ]† 4zDÚ›GØæx3vÑ1•Ùÿü+B Ñ‹Ñçáêøß‰óè°N(PBäcðkEK¬ý{+“f4š­Q;=§Ç8_£‹Hü¾vÙÛÛ#üИE@®úd¬¨F *ÍUíèQí^‚-'þç_ ïjKú7Fx9”Œm½w¶)5rÀ­+<^œo4S¦u[½Nâx*ÍT]¦Zrå@ÄgLþÝØØP 7©¯7<>Œõÿ¹ì:åâêóiì~/¿þúë½{÷ÊpA_W6ÅwJJÊ(£‰fã·-krÒ>@C½Ç “3W.@dìØãh8(ÈJX0ÿ@™CRõCÜe –‰ÿ±qF̺1p0ÓDÐUm»GðšÊ»Ø´®™¸Ò¨dáv7<µ^fU³EÓVœ£cڋѵï±üŸ®3p! ,‹Y¡í:È5Url7S_NI™«‚cj¿è¢ùNû¿º¶ …“ªUÔľ Y:ËÃTmÌ—³ó°“¹‘sšÄ¢NÁMãx(¥Æa_É?–øÿóá,–jš©™'#–±øŸÆŒÕŽmfرðÀ>o£¸«ê‰Õš~ÌÙaÊ>‡ä»x×À_N@ÿj̹,,ú0› bMb_][[‹ïÑñ76(i,þwȳéâ£sˆ*P8àËô>ñ:ö»Â±öÇ»sqÌ××ø8ñ´«QÕâ¬Üž£=£±aj£HÄç>mc»,ÿ×e׉S'q¨~‘$ÐÊ ô¹iüOIù…ýìÆÏªŸù~'󇬬¬è,ùFþº W{±Œð°yzÕ~F›ÊÿG;cÄ“iH};C¾xñ¢z.؆ãåŒ庙$þŸòü_ž©¯â~™ý_mÛ4†:`ii‰ÊAŽ<~ÚˆÚº~Š^+Qõ&š¸ "Õ­Xè¹¼cþßë´X†j³x¡PÆ‹_ý•ÑÂl'ÜøîÝ»ï$wºø¿RxÍ·?ª“Ú8CÚO@¾&‘š«ýöÛoU³¼Þ*˜ž_>l_<ˆ“£uó˜^§„^G¸aëßÑôa,ÿÅ·vÙu|£8¸á+)UýŽð-Ô %è~jó,§¤\{©ºÞî@ðú“üéO²§k\ ¸Lì¢à1‘ߣ½Y í· aÙ7¢—hä_M<^(VÛ£J +(sDÖgÕ&&)»Q+ȉÿ¿°ýßåÇáÄ^4ï‹ÿËÀeEÍ^š8*y‰Qú¬³MîŽnD+·³Ö9:ÊMèzdþõàðçÊæ‡ÄÕ©4ç7qýs5F¡›éR8ÿÛö¢š¡Z0ÑhÛTTx³Ûo\¢ §ñ2LЬ4=þœ‹jFÛW¶šv-ÅqvdXˆ=”ýªöè4E’…2›aܨ±2zU›§¿sͱ׉=Hש™Üqœ:ÜW`´¡©äú{JÊ%ö÷³UÜCŠ~bÑ7CÁÙ%¢î$Œp¬®®nmm±MD¤æM<L¡b˜M”̃”RGí1#Kb<#×ÄÈÏhžÑØue;g¹FùwÿO¡ý?N—´ðÉq þW±t^™oÌ÷‹Ö-½ÓÎBc±¿SÛ³™Æüò⊾×VÖ{’¿µ¶®ïùÙ9ýÛ:mÎpÁOú>><Š{Îú…>{ûú^^<_k›Ÿ;»Žø_ã˜ßô&l8¥š~õvEVè¥ñD£“µ¼ëíÏàõY¡>?);ò¦:򮮠ùŸÍTc‡RÀj„¯—‰ÞH…`o o³J¼"ÅŠ†™ºMÔ˜>¹–ùSR®“ݦ+½ãPo]s$m«¦?'ÖÔôÊÔà“û.ž øWSë‰æ<Ѱȇ¸ »˜W|ºFE,Ìì.˜Êà †%ÿfü¿½½í6†]î<ÿ÷Êñîqÿ«»tú°] €ŸïvÎKzÜ>¤~—î÷»ÓãþÝg°êõcWÙ373«.¦ýë·úÇwº«‹K\DZ¹~3³a7¹fþ?X'ÀKäMP]ypӆݢ®¢Üaü×®÷xÂJnÌØh£.;L’Q ²a_¯³ziƒ¶äàßw:Mýøã ÞHþvÓ$Zþ™à?![7ûúé§2d·žÎNWANÁ))S…ÿé›1o ‰Ý5Ù9Á§_†ÿûc M”‹ë}šs5’G> FÌûÂ^íµCQô[v™Íÿlÿ ŠgCÓÉåí*™þÿ‰ÿ?þ÷ÔV9ë¾þñÁ½‡{»ûë«·ægf³33sRš¥šë÷Å¥m7fæÎíW\_=8m©½VGH '0¿¾¾Êþ7»ÛìY\œßß«‡î¶;·¢ÆLˆ,¸®ñ¿z"†Ö"K Ž# Ë…°£\Æ{¬_+Ö‚ëíÿoìýÏþ³Œ#!DR«öô 4µm'2Ì{ù•kªLæ—ŽºXÅÔtsGÙJÅžf3]L‹3UR©0‘î)%%eJð¿;©ubšõ?ÿùÏåbö öO²¬÷邸älllDgÝQ¦YÃ.@àHdöÊæ£G87š›.Ô¦óó󺋤+++Ñ+µjâ”ÄÿŸÉÿ?òŸ¨qN¦¼‹ÿ÷Žº=µíYt}(êñIÓÅ~»w ½üt|zrÒ<ÖS4Û§úîžuôÝ+]}íï¼ÕÆÑÉ¡”‚{î¾|ý‚çø'² ·ÀëÊÿY†I@\æ%aŸñ”M>Ò8öÚSÔiØ`N•Ê­ÝŽUÿY £DÌ%=UZÉÓ§OãaqÑᦉùúüͨ¢Jvú³©Õ@_ßf¤ìHIIùÃñ?i¿ Z̃íÈò¦Â‹ÿµ½½½M¼¯ eN:À >Ñ0ÞQIÈS.r‘Ù¬ÊxR…ìù.*¡¹&ô«m™ù7ñÿçÆÿ..oÌ4.ÿåÍÞ[6Þììï±}ptè§è–Þ‹í—úÖçàôP߇ͣãö {:¥Û쵴јÕûÏÉý"¼¿®ù¿ 1¼ˆÚx'’w’#޼ ¿ëW-1»™3JGÀé`j0š¦£î Ææ†d¡+:àüsÃ-6~žŽ%<ðtéÉn:•n§ +C¦ÐœéRR¦ÿG¶)=??Ïð‘¶c/³ÿs5;äÃíæô"V+|Þ£G*Ë@4œZ=‰‹ÂV˜_œP  22ï·óg3Hüÿ™ðÿ³gÏØ0šl?‹ÿû˜ÿ`¯1?«.÷|ûµ¾[½îq«Ù”yÿð€Â÷JYµ:m=ÂöÎÏÒéõÿmw[˜ýõo÷¬sx| mâ´u¢»{;[o¶uúi«±¡¾vÀóL}Ͳ`¦–¦Ã¸W!##ƒ¾'û¥hø²1S×;¥Œ.nÃX‡XᥩTÄ’^Oq¼þTVü.X—Õ³×F•Ž›#žÈXlr oll0ÓQW~;Sèÿ“”ÁìšÓ\JÊTáÿƒƒƒÍÍM»ÂbÔYËúÓŸÊ0ñwÅ Tᨠ‘.¯ýú7.—[ƒÐ6·ð4JDž.ë•_O+c¶O¼L#õóK´9Ø`ŹvjšB IÊ5Ãÿ1Kš_E®uEüßêôtó øO_þ†c¼€ðüåËçå<$¸wp°ÇÆé©°kGø”{}z ócææfô­Óû)Ôƒu«ç*ùÙyȰûËñéÉõÈ®Dúï»wïúéÜØxeÖw&¼¯ˆ^tØt]?¡Øá„ ÜNpìdÏÖÖVäƒáÇ^Õ$Ù#ÑÄe÷uÎmĉã Z’×Mž={¦úÇ–´£Y€§ªýŒæ%¿±)óRR¦ÿ—¡ŽFZVowvv„í½hî2þ¯ §Wßëùóç¶ 8yI7:ÚÙ0(naÇÃ*¢ŸØ ŠQ(FSɧ$þÿTå7€´Ïƒ$Á)WÇÿeXª¹…Ù† ¿0»´²Ø˜ëou®{é;ífS€ ôƒ|·_û§Ó¡  cô­³Ú­ÓÁŠAŸZô¤Ýj—³±PéôºGçÙ—úLAý,çÌ¥ú‰U†kЮô€fø,éÎÊЈ}•‘Á¾…ƨכ&rKº¢ª 2lÀ´°¸¸ˆmÇáÒlÇ ø“Áªç—;|óÆzݼ–þß³„ ›+ºíÔ>EÌ×Sn$kJÊ4ã<¡²@hÆý ŸCœ4uâüWÃ=hG§ H\3Ž`œ¢yÖ#†½mµQ±÷x~©Ô—*ƚŠ%%ñÿç°ÿ«%»ÉŤº(¹ÐlFä9ÿvÒWWW®põ,ÎöÙêâ’¾Wõ=ùske•µ¥åóss‹ë«ùFcavneéüººæòŠ.®Í…¹yîØ=ëÇ·:í øÄ˜ðs{˜|Ò ð¶*{¸°¡¸„EFâ/lj€‘Þ5üÎAÀoжžqÚpi$Òôb„ éAwjŒrFNWÚ$¾%Ô3ɶȜ®6à.3ö”Ö°Ÿ Ó8TF›É”ª)WQLï £þeï%«+%%e‚xœg<Ò·®08;Ü?ª}´'ĦîÑ,œ zG6ŽûyÁúݼ×%ôxþŒ&¾QûãÅõSŽš½3Šü£M€ _Û«BœÑ;ã€t§¦-mþSå—‚ç’ŸÑ>á¼ÒW¯^™°ˆZu.W?lLØT<-1ÏW¬á˜N%| _ƒiÙ-<×[?Xœ„×ïè²÷’’’’2a¾vN.ƒy[øïÝ»“wÎnš líрϥgÿ8oF„P‘Šø ^ðõ5³lnnrâÞÞ?¹T¾Q5›ÀD÷%逞qmm­ (pP€~Bƒ°„¾lÆ 'þ¿¢T¶VÉ?üàˆÆâÿÝ7o£Ó0ì ãô[þO?ýBÉ_lmë*§n§{vü½µ{Ö?}þàðxÿ ïÉ/5BWbS9vZjÙýLbÍv‹ziŸœr&C›GÍÓ“vë*ø\ã†óO%6¤Êpêß2J€Eé鯱q½€àßh ™ª=y*S—ZÅ#¸x.ùØðd“»R,3™ éÜ,øUV=Ô†Ýů{ggGodqq1Þêî¹äúñ¢ Èηß|óMv]½—””””ÉS[ ò„è ï‘ô²+TèÝÈ VV5اyA ´€²À“öÁæký‹Š"Ñ„ïÿ†GÓ±ÜoœÐWšS¡W@t߇Rȸ ’øÿê«g]ö¨#|÷Ýw>Æ91/Ãÿ²Ñ÷Ñ™Õ÷ÜÒòâê­~/ZZí?ÌÂ’¾nßi,Î7Ö×Ë˹ùÆÜÂègýácooþË¿6uäÂóýý¾}ó÷—¿–ŽÚý´}Üx±^ú9§'ÝáÁeö„jì3=*“zs&Á(X-Ü~¼šI/Žã•$†%^&^©ä;U¼” ˜ñ‰¨•œ¡LU¢ä6©ý„‘ª6@’Vb„—ƒ³T&ðÁ#Å/::¼ÅÊvÁÊaícìu¤N(^IÃÀeï%k,%%å*‹FiÆmalGΖ«…çØÎã4( kyðàW¤7/Æ¢­­-+œŸêÂÂÞ Ðš»í€ä¨d»RK0¼‡›Ž[PlNqÙLFdX…/j7(ºˆ.kþC Pñˆ¦$þ§€ LvÍL½¾¾nu»RW/ãÿ|½»?·¼¾z÷~cv¡ïç++ù…Õo¿ùû‹ê«?ìí¾ìµÿsgû§ƒ½ç­öØÏ“£ãÆâ’ñÏûõú‡Ý·:±±¸ðª×ü­¹¯.ºßkíµNšÝßx·é»?p:jž <ºÛ­~¢“ã³Ë–®Éá?­ÿigË{¿Zd“»»×GVտꯈ¯2ÊJéÊlë%êRS˜—ÊìÇ.˜ é@-4£¸Øƒy£õ¾ s¢"IÛð£NTB @®›üÇ)$Jò½|Ü`R]¯Oóõeï%%%%åCJ ÁqÌ Úšlpè\"žw°ÞW‹çÚàšß|ó vŒ˜|Çxó²Xà=¸ú0G¥U³¿ÿ‹ÿý«&&MŽ‚ ÑUÒŽ=º×ææ¦þK!žU3®*ñÿ…oÃ0_5Extã¿cø?¥{vzÅÕGÇOv÷wz½Ÿv÷^ö:OŽO~í4ÿ¾ÿöí¼ú¹×þ®yø[)/Kù¾Õü¡9æó÷ƒƒù¿þõ§v[ÛߟžþÒíjCÇ7–g>ØÞ9k å¿ÚßmŸõÎëö ³rtÐ_ T/ÒOìÿÝPãÆ'–±QÚ(×ø“©É˜©–**ÅD0¼æ/{¢*jµze~ÿЫº{,æwÄé]âOÖÈX1ZªFû_yŒ¥nãhë ¦*aÊÇëwšž4‹1O]ö^RRRR&9Ü#l~ôè³䨂ô„Äê{îq,íÒÒRÌëíÜ^óóópA<|øÜN”AÞ¾Èýû÷5”q<‚Zau@w,Ãxu}°AÌÚ9êÿÃÜÄ)ùË_¢?°×UaQf…Blœú5Q¦]%ñÿhQ3UKò$@dk¹Ìÿ§;ðÏ×ÔÞXXùyÿ@úê¿omý|Úü¹Óúµ”ÿ¹óúI)úü¯ÓÖòo§‡ÿ÷Áî?Jçg½ÑOãÎíÿsëõ¥ü\Šþý¥”ÿãõ«ï{­g¥Ýxtûeûè t þõ×_ûfÿƒ£Ò=;Þ?èo7›ûÇG¨ð? ÄKŸÜØMÙ%0ÃG:ÁQFD'® ÄãºaŽ=VªH(NùñÇm˜rœ)ž*?LÕèŠVå^ô¼¿âŠD#h<½»¦êjÀLãÉGJŒ>s;Ÿð^RRRR.›)¼½³³ÃøoK‘½e `&çÁ´[Ž0@¦4Ù;‘[€çŸ§P¯O÷yÖî´›}ZK<‘3 þÿeèAWéàŸD¢?ºâøu‘Õvæ.ï<³’õõu†Úh24å'¬¬¼) 2 j]Á׬¤ìxS,aºYYY‰Ë¡YõŒ1ñA¤Só{¬èjËEÿ.סnäLñV¯ÌÛ–#Û·ÿ¨ŠÆEœÉï%%%%e,>!̆²hÇ‹«ÀæG†›•¸Q½ž™|µÓ†ý겺£·#b÷Lꌎksð]upÅÿÝS+„ƃۖÍV¹}Z<“r½ñÿœ&HF«VêÇÆÿ¶[g*Y£±°upütoÿuï쟭ö?ŽŽ¾ït¿ëvÿÑí >å»Îùçûfç?ŽN~é)ÉÚøî´¥ÆÊÚíîèç§vû»ãý_ÛG¥Ù£Að6t‚­¶jâpç­:@ûDý±×î¶N»Ívé¬Ê»]ëˆY…¢[Frp¸wÛ8ßxDÑîtq@pˆ«×¢s ðÇ‘Í@jNäb‹ô‰ŽcZ$·±a”‰Èp}„Œ(¾ÖQÖ( ¦ŠæÛ+’øµÇgí´þè޼_Ú4¾ÊèesÐUÖYR&ˆ ]Ñ=çççSŸJIIIIIüÿUà§Â´&Z©ñÿÀ¿yxÚhÌ¿ÚÙ;<ëGì6n­ßjöÁ¯Áÿ÷íòc«ÅZÀ?šíÿlµÿííÞ‹Rþûë-éÛwž”ò}§;úù±ÓþÇÞγöiãî-ìÿ»$¿´°XZù¾Ò›ë£ ÜÔa3çвÜÍÍM «IÌÓŃíÃ*,(k‹4;;;dôÞ¶N$ä\†«‡e`G•দ”ÑM···…í¡÷1 :ä]Fæ:fyy™ìW$òcgxAzýÆæEh;ÒHqÐa¨6Bò:^6À&Ö „DÀŽ;0í€î®Bš§}¬Àe¤ÓñrÄ-_Õøüùó2$¥„VŽœl7ª?e¸C83Xñs$b®Ä‹Ž&»}û¶ÞÙx.y¦PüH=Ë=ˆÕ«””””””Äÿ_þwv¹²oØ;zÿ«L}ÇûÙù×ÇÇ¥ÅßzíŸ{ÂÿKÿèµ…ÿÿ~Öû{ß“¿ èóÿžK5øÿßíÖ³ÁwcmíoÍSÖ ªïï;m]p·O:»_z‡½>û§ÐÚêòŠjü¿qkíð`¯KwãÎ-—p,¯0¿]>œõƒm«ãµ©VWW…çÿò—¿°GWÛÛÛ«xu\oøØÜ½{W ˜Á1º”5,6¬2€ÿÁŸÿú¯ÿú»{U»¹¿âé*ƒ0?e’Ö ªÃØ£[Pl{±¢AjÅ«4xjÕ9¹Š«g¬†Yeó¹°Ç#Úè§4à˜8†`Wnœé¯òñ¢¾ÃZÏo¿ý–|ª)))))‰ÿ¿û?ÐÑÞ¶ŽŽåÿì (@Uî'‡¥…ßÎZ?÷šçøÿ¬ý÷3©ç«Äóÿ·7¯ôëÿî6õý·öIãîmÉñÕ÷÷Ýæ?['OOŽ«KGå þüÀÿÓ“™Á¿ËË‹?ÐŒñB¤€gʶS½6çx¡ ]ß»wcõòò2¯Õþ*öT§B677 Ý ÎÅüÎÁÎN®ŸìÃS-·@/ÀÎ}ñÿÑñúWº†¾¹ ÕúE|A1;ðÖÖ–i3})§#Ô¥ì·Ãž‡FNc•ÍjÈX8좡<{öÌœ¥L V ³uú”p ›ºâ_ĪÄg•“X½ÂKϽSà¼Êaíc*¹ }îß¿OƒOIIIIIIüÿUàÞò¯&tgЛ„ÿW—úVúùïvéãÿÅïð~ð97æ×ééûßöß~Wº?—ò·æñ÷¥×øæáÛzù¤”áÁ>?vš[¥ü°³ÝX˜=ܨ}6á<+gí΀ÿ¿×ÿ”Þë×/[­SÕÏhÖ <=JXÎè3ˆűº&ç¬QJ°j@¨ÕaÅ1Iô¢Á·\¿Fól¡_½zUÝ$ï9LFi#bD­~R•'’8¥³S§K#`O•zà2q×r1¿€y;uxÏ\“HVÉyØ>«T4AÑ%IïÑûÓXý‘BSD3­’Y§¤¤¤¤¤$þÿ*ìÿNÙylþßýÓS•ûÙÞîÞ@hÜZù±yôSçDè}ðŒoÿÔÖgàÏr,dü=ûõy)ß5«Kÿ,Ýg¥ ¾ðù¹ÝüiïíîY¯1?+pvÔn·úv÷ÍNç´©99Øÿ÷)€ÚÍÁƹó¸Î <å"å©p/¹ºJ ”äFÖM£èýýýÑëp˜³Wp½r&Ñ›››ø9YX<À .Úh )ØFÙiˆf½‘sŠEMÇÉKài7bŸL†JeΧ奄Q}°‘¿Ò¤L³Cr­NÈkö©Ä¡.ÒãÇm}2Ê'QµT·ø¹¥¤¤¤¤¤$þŸZü¯‰{yyÙpÈŠÀXÿÿV»;ðÿŸÝ:=}qt¬Ï«“Sañ×­–>¿îži£±°ðâääŸoßê_mŒýì÷z?>!ü/h{Ôlaÿ`µA}œuý9|Œ:"©¾sÎÚƒÝÀÏ@Ôˆ:f°²ðêÕ«êíF~rÒ˜óµ•a‘ Jud®D#T‹6pCúè¡DIpìwÅ~uvr"sÀ^‘ï4å}E͉ÄsÔpæSNIIIIIüÿuùÿ,---9ƒ­`òÿwOû~øsÿÙ¹¹¹¥e) ·n7fæ KÙ…Æìüà{ðY^ë/,÷¿çûÿ4æ3ÿà_ÿÒ__ØÛëž³•RzÕ‡÷‚ :2~SÎGάr1'lôö‰vÎaXѹòòòr´ZHüIðt.ŠÖ~Ô"'(äåš¼½ ™Bqì÷pRa0àWžKSþMRZ†¹ÕrøúLbðO;É””)))))‰ÿ¿û¿É3Kð¿ ÿ÷N[Ý“æ ·ÿ¹µ²ºÿvÏ…oµ:ÝÞùv§{þ Í–Dן?>ik£È{V=éïŸî Äxûmü7[“ÓÖE¿‚ÞȧT™µA`¬Cƒ+ø f#9f¡+^ )Æd8ð˧ŽsüTöç·*ãÝz)Ä™H^˜[8W§H÷¡6b*á¯Nì†wúä”Ç)\Ãj<óóóÑC,%%%%%%ñÿWaÿ7¥¼3ÿ^ÊÿOÉzå¬Ùnçä •Çë‰Ôý…#WûŠReñ¦üÿûYñ?u«¶•Í””””””ÄÿSŽÿí+Ø/¬‘Þeüÿo3õ;·äâi¬Ýêoaþv·Õ=ëï½Ùßîö#úþ9ú©Ýl‘Æ‹‡ìߥsϪo=n»Ù;ëÆj/­N»Û/ÒÑçlð)Ýþ·®l˜ŠÚ"p ,‰ŽC¿CxvìùxµŸªÀ·A'R˜4møŸ‚é\+AUV¦'Ož”¡‘ŸØ^?H$Ab¥ƒ÷þ5Ftòâ¶¶¶ôBoß¾ÉWS>¡À…뺽J^¹””””””ÄÿÓcÿ×C %...šô2üÚi MÎ--ž´[Ç­¾£~§×ìï•®J«ïî Øÿ'Óãö‰ »0@`ùŽÒ³Òiu¨õüÙu…ˆÇÄÿÀCÝ#-ÆA ŸP’âªs¡1DMpt€¡²ÿÕ|ÙiÃÿDò:T9JýJ4„ŸÂªP$GŠ®GþŠâg½ÀQÒøÿ9sAÌ^2¥ZJJJJJâÿ¯-þ· © ½g¬ÿO»Ûé“ùÌ4Îóq0OÕ´õæõÙºŸ{ EAרÒñ3°=Ù®nfž˜™7¢e ⽈Z+$o2LóCòzD?za$“©93ý“W\ ÆÞ—XOÑ)1FµZ°°ßQewIâ‰äçõsUÀ7P¢óÏÂÂBÉ<_!´Iº’ó婆cJhµd5–’’’’’øÿ«ðÿ‰¨òÞ½{N}5ÿ³óÎ;p}ØwÈ THžmøv¤=88xöìY¼#Š€ñm¹‚ó°`F̱ëèÔ24b«„öç1§0Â'¶oëFº¯¡žBGÕT1ŒúW8GëšÓR{t¤ÁvTˆG&蘇uê^Ðã|Ù«•¥]ÇÛ­Âï;?IW£Ó¾ÕÊ\Fœùodå5QKIþù1âïˆrÄÖ¤¸dÊHIIIIIIüÿUØÿ=q¿~ýK²ýCÆðÿ [YY¯ÚŸ§òê]÷`#Xл`¼—âÝ'Sˆ¨$·nÝb;Z¶cBÞÍÍÍhWG€2ÀÏ]eø Þ›¬ý¾úŽýsð Š9v}<×_]]åHÝŸü¼’Ð,($* U! ¦ýªsµºQ‡¯¨0:íÀHø¦õS¿½5fÁÔ›©}B!}ž›·:‚SE3>¨Ç}Eâ))))))‰ÿý\Ìà^ŽÅÿ¤‘ÚØØ(Á6ˆlmm ?Gu@§ØëýXçíœ~'Xa­6þÏÎΪxº¯®©Ur=ØOepR¢Ö©ö¦½õb é””””””ÄÿÓÿ Ì¢i— OèšîP1÷•¡Iç¡,ìç:ØN¡SÃQmãÜ"À¬SØ™St}°±±;fæÅcíày¨Ïtúü@Êñ;®ø ÆÒzFãð˜¿ñê€n¤gt홎ÒanKÑ•‚Ó?Ø_åÕ«WªgeÂé¦õS³^*Vm ÿ?^Ô,iK4§wê¿))))))‰ÿ§ÿk~¯oyjLeÔÊ«<çbxjå”ÃÃC<^Œ“·¶¶"ŠŽ»teÙŽ=Û9,²‹TŸ ¤\Ìí¥ËÚ™Ç|88*pÔ@›››¥ÉOLþYUŽD?±„a/h§QÆY"jUf *]©?ÿ³dP­ÜL±ëŠM¿ôõîØaY€›ìÿ–’’’’’’øúñ¿®½y±“ ÊšÏS Ó½Õ¶ç¡8fSn•a¾€2L‰å«UJÁh\­ŽyþüùÚÚšñ9žtýDññ¿NOP>‚ ÿx ,§ÀÑdžPSàSÜrŒ PÊÐXÊ)ŸÐþïè``[Å­t£„å$kn&Ò§µç§øæ›o&Ä¿g]¥¤¤¤¤$þŸ~üodnü ïö›vךèx?;;«S¶%/íÁÁx`ssc —8%ús}¾®‹Â¾š¾èŽÿü¨-wcc#†DS¤¯Y>Ô99.À\ªkª®2i¨Ñ« ‚ß2.ÿ]JJJJJJâÿéÇÿš¾Á«Ñ>·Ìwß}g˜ŠC‹Wàêtø-èwiiI‡"þ´1WyïD—øù'»0®v œ/«b­ÿ‘bõÁ‹×£«ÚFM{N ‘¸zóù«’3Â:%%%%%ñÿ×åÿC€­d¤â÷Ô_eSŠô1@›¿¯ NÖ¿Tã(:m6›ŽÓôM}˜N´ïñÊÊŠn7º@öÆÑȦþý4ß©Óþ–adª‚ûze £#—ª„TkœË÷'´ÿóà>]·»™¸W• jZ¤?^ÜœFY•ÚSe¦HIIIIIIüÿµðÿTR¹Ð˜«¿ ùÀ5û/,,DÓz•½K0ì ÀàWшím#ÿÅÅEÃl“mšr§ i…ü²ì,)€*‡p]q@ì£,X\vßiBv™&ùW¥2ÜdÓýÇ‹š%Üü~³N>RÌ[E_0÷oJJJJJJâÿk†ÿONNÖÖÖÌÄÔ_.zÔãcOž<)Á ~‚T zZÛ¯€‹ÿøã<í¬pP pÅ R1´‡{á{ÏO|G"+>˜úýÆ'Ü7ñÿ Z›ßéG¾µ.vìWÁy¯Û””””””Äÿ× ÿucÇ¡‚máUéoß¾Õ§ôzüø1D eèðìÙ³ÉúE ù¿"—¸©{$Ñ–[ac(G"tHÃ9ÊØYw¬5ð€NË»°°@Ù88¾ô꾉ÿ§SÐU777c=gµ|Œ à«§ãŸ’’’’’’øÿzã{×€©* }b„aÅ¥;-T¢“¯_y ëx]Ÿ…ý&·ûÓ§Oã)*UÄu¤«‚±Ø—høüDŸ"’àäSQôÛ\,E`ò}ÿO¡ ÊA›•ù©D}„àwõ÷Ìó•’’’’’øÿZâÓȤZ†T*ÂÒFø>’PbW×ôèÕ É)!kU•k¬7ÿ‹;GþüêíöÿÌûÁÃ~ø<Ù¯b;_ÇWéMGï›ø:eqqQÊcÜ“¸¥¼—ÐP–ïß¿“}§¤¤¤¤¤$þ¿®þ?ÏŸ?/šÁ*׿b9ׯÐlVîôò.Ù¿ u9w}}A޽½=ð9ôþˆÉ+oœÊcÇæ2äš1(ذ¼ò&â"cï›øj…XB¹£ßWʇ :õÊÊŠ*–Þ”ÄJ)))))‰ÿ¯%þÇln;¼õË0×êêª]ƒ*Èzxx(ÐõN îu‚Qðyeu·˜r“<\Áù‡s ×õ›Š¼†î”ÍÀúס º‹½}˜pßÄÿSþ×ÖÖxeRx_Î@—òaÓ¯º<=(ýRRRRRÿ_Wû¿@ÔÊÊJÐ},--©Â´³¸¸È'$Ÿ˜–'ƒŽ7©øÂ‚·Í^P€7õùí9¬rïÑ‘ÎD¦kâîq •°Ê5ƒ…ðãªÄè}ÿO§à£^.†r¤½ú#íeè•GìVKJJJJJâÿiÃÿH›`ÇH\Ù/ “ ã766t¼ö“ð· Íàl{CÛ™Çw'¥°6RnQÚÕßð›c¤qPGø'”]ÜŠ†ñ‰MýGGG ”¸šÀ‘ÜŽPö8—™.Kå˜(âÆ+ê5“Û×ßßß÷Ò ®V=(˜‹¿Çê°XÂ2\¹@{ò«!vc:SµZµŒd°µƒ–¾yk~´˜¨îöíÛ‘ðó ûÿDâÙÑ·£·Ë£cF¹IÝM8Ò9)bEQ¢Q\!Ä>8#ž/Eðû´1Ná¦î,œEÏZ^^¦¡NÎó‡‘êU:¿ºÕj§IIIIIIIüu1š…ë>N»€j3ê8²Ï4)ìÙÞÞöÕ¢ÿOô¢±ÏO¤è1ØÐu W€ U2/ŠêT¦ER PrÊVì½d"«Œ’“ë‰"Á˜?G`X⼈t˜±·:÷¡œj@˜ÊaÔÔÞ‹/ÊÅœ~§Kb¸æˆÔž®æÂ ­ù¦+M³ Ÿ¥ ùcýÈÚÐƵ瘈{ïÞ=7T³ŠÿL¢¶Aä8ý‚FȺÕh½¿»˜«ÎZ­û'ÒkÀÞj½„ä¼SuÔ³‰yUnê:]í*V¯‹¡2ð¢r½ººê†:y=%&ÔóÝõ˜4c2îÅä÷èÀœ\bHIIIIIüÿ¾¢  oÆK»¯0qÛé¥zº8­<°èoû?xOà*G°M¸Æ·/_¾Œ(…@ZŸh îPMJÚç:.FÔPîÞ½‹>rçÎ~‚ÏÓùUmƒ—ü˜:@{¢{¿6ªe‹¸Ü`åÅÕ¢‚R~pCҫᦺ#OÑŠÁ¡1ÿëׯ}–1aÜŒt™# ‹:Ô¼qîkZÔiç™­;/Σ&ašYêAue¾)ë•(q“-ÕŸC\·‘tˆ$tc5/•“îÃñîDq‰ÊxØÍ•¾3AÐéÔ‰ŒöX©ŒK„4!•ptMÁ“–êÎ>9ùWÔ_¬ãÄäÚÜTâ% ~U‹ÍL )))))‰ÿ? ÿ1A1‰3ùFþ2tº0o'ßœ¢oæ}˜s8‹=úiccCS<§àpR™²KȆñ:‚™“,CD¸â Á?£åè/dÅèÉïeÕ‰ÀFÄcàI€É ’‚dŒ±®·÷}/Ü‹ú1œ[XX ÂÂÂwÔ§¬}¸¢°—F[n Ž%~^5ðà±éçÃ¥Íè‘©«˜ÌwTEêƒUÕj4 €;r/¿)Þ `@O'…ÎQ->Rß•&®·CW0Ú­ËZ·#$¿\ô4MÒÍãlžôW¯O¯ ¨Zb ,!¹^,L\CŒÛ))))))‰ÿ¯(Ñ¿7b ø9m‹³ P³0OÇ)> Òþhÿôè‘ Wtª@:ˆÙr´!õÁ Bº`åü믿V¸BQRŽJtºQº°åPÒù€èí?ŠÃ#“?Çèx€G,‰¨x\\†š®(‰Ê¡Q‡¶‹îííQÇe`Ü6ž„Å´Òb¬‘Uh^£êÆ™ÓÖ¿\Õ†—nÀÖyÅXÅ£“‰ž–œqeHQõ%ËOsZ[[£DÐPÏjغÇI  =üé2Øc;¤eÆHㇽL±.IÙ´GÇ» 4iÆÅ< °çKÑPÙ~øðá„û–°*¡¿sç+\®%mÏÍÍIÅ‹k‘¼2¨žþμ))))))‰ÿ/Ãÿ8ö³»¸¦WüvŒ1Ó ´ø\ýk[´*®õÚ ŽPp³¿4‚Ö@<³3¹½ÛÚyÿþ}âÈ´¹wЀ7úÉš·£`xà€aÀÞÎ5< °R‚§¾@*F’9Ì¡¸ci„v,…àtôöž"š‚———…©LPãh_ ¤U‚3•VM.’²Ú[ƒZu'ÞæÑJsëéäÃ1RµÓ;Á&Lj'•Mý¼  «‡UBçÏ-‚µU<»’›­Ý¹ç¬NÆöìÅ ¸SOZ½¸Øs'·a3_ÅÆïu@W;n9®.˜ÈýíüwzUzµÑvŽbî—b'm4<†lx˜â_wŠ””””””ÄÿW@ |oo/Fð‘Á§òº nY=¯¦ilÎáÁ Õ€™…ŒLì–S‚{œîu…hZÔDn‚ ÷­[·b\°ž¢:¸ i3ÁQÚãXs"V9|m–´_Q¥¼p`ò”ºÇ´Èï%\E‡Ò¿€[ê è…'¿nÁ›2?E²–PŸA£öH½â"iòm:VÕ$Nø/U1ÈÓ#†ñøGÆ~–ˆw¦ü• ™Þ¯/5=¦¾ù5úØ|VÑ‹PO¡{•Ííß‹>*Ñ+þÕÞtÄÞz]îAàD¸£*ªô/dB‘l·‡½ŸÊ)C~Õ˜îHƒApòÑe¹Ñ÷ÐþT7ºJPý›‰×ïÑçºH<šWaÈé&%%%%%ñÿû Æs*M¬š‚ ù4çj*/!.c>XѽසdK<‰´ðÍ*g]#jìÛ†âÌò†²XãKº>ÀÃw7"Ây  3ºæ]®"2¶7&$‰‰©€™±´*a}}Û©l:ØÛVxÑ^nÀ£Fg}@ ¢Û_‡ñ˜]’J0ÉZ ñYÑ¡‹=:À¦B¨j/¦”¹\:æËËü@„H¥­è]Ûn:³¶ —nnnò¢i BÔ:WÇØMÝ ‚õ Ï]~µ ˆ›\x7Zþ­(w¼QBŒŒÞ»ÉpAxu\úÝFÅ®bñÙ]:¯)}"Í—uIú©þUݪ¡ê[¯CÇÓq&T…t7¨ÎËà »˜ÈH…qÀ‹¾uY^J뵉Äÿ)))))‰ÿß·œ`AYðs$!×7sq¢š‚‰óõÌ«ýWàPüгëÊ@‚hl×~íÄ€Y††hƒLc°xYR_¸¯N·?ƒKÂK æ·ÄþïÐB¯Døh"VÙvww…1ÊkT‚+”P‡¡ŽX¬à“7ß)vKÃu³FÝç2©èúiEUN' P «À,…ÄEœ<»\“®dâ©U3Ž&žNçÕƒš«Þ©}KÌ¥:ñbS¬êJµÄ+ˆÖfkµ±V?«˜ÒJÅŠ*ï"†ô‚çI™Ç›UùÝnãú𕾨ö¬¢ÉÒãf"á ‰š ¢²©ªi!Ô¹ÎrêŸÅTÿj.§ªZ?Å`v^þB<…­úÖIcE±@éN­‘Áe‰ÿSRRRRÿ@Qí7Rͤ1oóõþþ~\7>×ÓÙ¥ï_ƒÔ2ŒÏ-ù@“×8Œ{Ù(ªÂ¥º‹ð†ï‹ù1*ÚŠæ1Êupÿ >¹šÐ‘@ˆ‹' eMÁ¼FÆŠTN„I:~Q]PŠI´ÀG½&"·*×Uð¹ÈSTᬕèÁÍVÊÑÊÊ U‡Ëå‹•í÷jEŒ×®0¦ÐøïD ‰ÚíüQiµ™ÅÐm[-“¶d€íÜ _@ÜéôFTN5È{÷îù ¢9Æ ]»ä©¡ª‹¡ïh[‡¡ú¥‹jÃe­ß‘é@×ÇŒÆc/NyðàCfìæ5´Ú¡š.¤x.v\}¸ÿ¾W4Tr) ö^+µ© ¹FYÑÓ¥bà||<¦¯¬žWá*))))))‰ÿß)š:š‚Áí„ì=F—ã*“/÷ê[àDدNÞÞÞÆI&ÚºMm'Ä-‹,ŒæQaîÞ½k€ÊíX&à\á,íýë_Kè±à·}À9Q»q°¡q£“rfTŒ•˜08¹E߬Œ‚/‚|óÍ7‘ õ‡~¨ZÈ{áÇ>W„Ec™‹b¾æ2H ÀYZ8ºWI“y/:ÑK<¾Ô´õ/·Õ‰GMŽvèw¡¶ä×,ÞBËx‘•Ÿ ­¨ŒØ¿@€`¶íü£ «”Ê¥câ '¼.!µ\¤÷GÃ9ÝÊÔ×7‡×W£¢µø˜˜AÌyœ•€Ðr‡`À`U‹Êt #y8EÍÞoä_yÇAÍϵ:€Ÿ¡ëøˆ/ó¾RRRRRR®þ/!÷¨yÿ˜^ ÚcpeK‘$D³¿ÃþÅ‹ ,œR|¢Y1™Ð*?€ý‚dBhöiQ8Å=Ôj¤ щŽDŽTö*Ltœæqk‰y‹ 14“ 9ÈÊHfᘡ~’2äG-~sôI¹³²cd5™Zÿ2û k(,ˆPÚÃ8óW¤»`˜#+“©^b•×À•<ɿܿ¼räPt›µ¬Ä¸£Óöpþ×ORôMý^þÿ콉rG–´ÛM‘€X$JjÍhzlÆlÞÿi¦×iµ6®"E‰¢ÔR/qÝðýå×AKp7-‘•[fø9q–3€Ý–žTÕ¶,æÙåÁ‹|»ž9^­Ê4^žÃkNæOç÷S<ì£7TÝEe˜ÕÔ‡â;Ã~SÎó¬§C MýÌù”:Ùvtp€)}ƒÛµz­(Š¢(ÊÿƒH#l܉D]yÎ'‡qe~ÒÇçV¾Õ€èçGÄÉAN|NÌõÑ“c½ þÃj¾œÓ²á¢ºkû·ãâÍéí¹ì œ“kJKšªN $«Ñ.Ò–’( ÖÊLÝë¼ãu·Jrœ¹&oËÿ]%ÉY™×À7Z°rýý i›¶™¢š`¢åRëùŠ ŠY¡†Ø”}ÓIãØ7÷B{Lš3áL|z`Z.g¶ / O›¤ÊS–g4êPzßž£I$X¿:ökŽ÷ñˆdÓ@xjDÄÑe~^""ká ÀYÆïò xç‹Ú"k,¥fKqÛ1~=Ãõ8oL9슢(Š¢üÿ(˜²&y‘eé7IH" Äñ3M°‰{9QÍïß¿oo\’ÿ¦)¯Øµ™÷‘œs#,\¾£Œºþ–,rÂ'â’À¯]ë„}%†_§‹ÍÍÔ Žº2š¶ ²þÉB¹ÝÄìˆËù?MH‚¤€²f¾€$„ÆÓiñÇ[zÉ2<”¡Y[ýjV,ÇWýæŸh3#sÚÎ[¹¹¹iK›±0/g•x9§•–:ïÕú$±N k³ ¬X%;֮ɶ'F&æ +¼‹dÐ'Îsm‘3GÁÆ?“Ô9âq¡†¼SlÌñt„¿JøãSyÇÆFèlFª(Š¢(.ÿa‹Ë=åÃÒºìíþi×Þ±;ž={¦ãTâa†­ÿ‰"¶+Ÿ&Ê“VßIEUšôU‚ÿP1d XŠØÂ²©R’p7аöæ6<Ã1 “‰™Ù>Êgè7•i¤T˜«z™ìl,t¹OÆ›âL®àÿcaårà‚÷l°m¯g§ÊâJÛ)Á£Ì¾²CÎŒ¿-  éœžÜ’úÛ-¦‘f—ËË™éö³Õ`_ÌÁlä©Â[¦V¸ÂˆiË!m5v¼¹žŸ~y±ˆs™—jû¨t¡'UÈäî”Á” úh~:î.ÕCòb®fC¼wã&,Ïd½ËÓXðŰçF­íUQEQþ¿žüßy¦F¨ÇYO“õ¥—"†Ö^Ч¼·°Ü~íA, R;í„\¦Í®‰y{ê—×z›î'™ñ˜A¥˜ã:ÛØ# ª©Cö‰ªAù“^ÔüÄž˜fø;;*¤È{G‰0˜ýÏOûÈáð-xRL<Ðúð´ß°Ä4ÐÜn¥. ÈÖóýÊÌkd¹ Õw^éú›p:BÔß3ð 윱wš´)E¦ýx}gY"›25L^H¾™½w,ü\¾gšÓgO3ÇåÛâÈEq/R¿çü´Çd ?È–NÓöbJ@ž«“,`y¼ÁŠ¢(Šòÿsl2šXì|Ĭ2?ÄÌÁ5Ø¡Zä¨;Ü¥îâ2•Ãy§úr\§ãz"XâÔé‹y„Žý¬ÃÀsy(šaPdšà<¤®†o¡9”F"¤<“íÍb‹â?i—ƒ=Ò(ÂéÒîì#ÇŽ7_Ur“—k¢ÆºáV_MÎS.Ÿ“®§ûßÓWonw£¢vÅü,Þf5#KßzV¨o§\EQEQþÉø¿WyG‡éA«ÄäkûÛN©ˆÐyþøãÖÖ¦Ú3t#… ´)‹ÕgÞ¨'dÂ&@#lð£ÅŲ̂>–äVÆòhœÎd9““M­ £ÉT3–éÑ•Ÿö£¯ï¿,ë`9©þOÍsV’?Ó~Ã÷ª¹‡2‘'Ó ­ï÷1U’’Ùm™4Ì9ôËîáo„ýd5!…þýßÿÝ´y~GS~XXŸ~úiÃòEQåÿWAÿOcÑû¥…ޱÄvé#lˆ2–¬bTŽ“ºŠc?@Æ®ÉßÖ ŽUv|’ERÔe¤EÐØ·‚Õ§¡N²vU†R.GqOŠ«ÊgŸüá˜xõ_ÿúWSÜÉëëe*¥ŠeŠÞÃÚ5"Ì;.“¶ðIÛ*Ÿ×ÿ¶qrø u²;vÊ à?Ý(œ4dÌð-e¼zwÊ¡W'öÛz„“Â[aÙ¤'G|y~þ³X ûþ{Y ÖOš-»»»cᣱž&dEQEQþÿŽ@INð$±S4B4·69¨ 9¿¹k’pó ¢>&Q´eú±fª¬å$Yù øªyµAV2¨l†F'ŒÌrQrÚ;Å3'|J†s̰“±WÏØ¦ÝÒÑ9 ·\Ý›ad¼ib7*¬Ë2C“ëÏe¹E’õgG&{Y‘}2ÅÉ8„îUá å$XáÌ›®¯oÍ MoÁvÅü,Vw&ž¢ÓPVÿ_EQ”ÿ_ýÿØ÷K¹—y¬Ò—9®àˆˆC7y#`»yˆe qEgNçpt¯ ¶3deDMAu q q”óÂC¬NTñŸ}ö™ÛûjËSÈâÃrìG+äW“a(=Ñ–rÃźùŸæøÊäêÙémê†xãÁ‡>ÌÀP‹R!ÌL8Œ‡;Þé;NK§<ËžôX,ÏÏâp`® (J"u£MÔ¦p¸EQEQþ™ø?”ûúõë¦ÊDy› 0 —&u>7K6T¤E™ýÇÛä Úé(ŽS”{ò¢®¶ñC]¾Uâ);d¦3ÛÉd¼ egêðõ™Q7Çëúü/¾ø‚Ÿ2ÞÇ®aî ¬¶ÿÉŠe#z•¨Aù §Hž¹PY!Ò>JÍÉ€6™õ)¡Û5 ®Ô·ìà8‡¬íp¨sÊST©†ùVðËèhŸNcwàü¬…Ïj8i¸M¹R°Òy}ôœ) ËAQEQþ¹õÿwïÞÅD,lÅ­Å­r z¸œC¯èzGûêÿÛ·oë'ñ´>ø@¿îììpÍÖÖåC3677)P÷êé0LÿÍo~£ÿÍ–EZl/t (f,ÂP\¨81 õÕJ×à!Kñ' %¶5ÞΠçÞ¹sG7B,—eh­Î[k:"Í+DÚæ5i+u ¨ýf¿]æ$ù× ðÄðÑ™ z‰ðìNóôe  utš©rLì122™ ¶··Ýpº]7ª{É“n÷¸ìíí©LÆÔ#~tX¶Ê}Çž=p~oûwü‹bãÍ›7-ÇMyEQEQþ9ø?ôµÐ«¥†ÏÉT}Ûæ_ÌA|®¥õ …;ã˜á7Ìá‡6Åç'Qð,lD!!ºþ(FÖ«דúY8ü ×®]ƒ“‹ÇB#©u³h@+$°à• v½œzáf›ÙQq|¦(˜°ž˜:íŠI®¡æº!‚Êóå¸ÓÓv,”· ÁͽñhÎV¨ij›5j2õÏ`A8ùê'Jæ¡_œ# “$Á)_QEQ”ÿ_>û”ÒwïÞEoo²7Ix­Õûv)b#üOEêD3Í®J»ÿ¾îÂ:fK&~ºÞY\7ìSÌ-I„4Õ\Ôn§¿wuê"ØjȼÔüÖáîÕêÉ¿XUµó¬hvVÉçÉ• Í&Ÿ)w„«ìrÐþ̤Œaµ|†M“å“ðwww±cgÏb 7ôÇ?þ‘ú@}—coŽp°™OS G­ID…H$¡|I4$¡Ïˆ9êU|¥Õ-ÖÀC¼i²Eo¯¸(:MýœþÝTsÊñèŒ%/`ËP*D2Â7ß|£ú¿ÿþû)˜,›‹èâ?üp,vˆy&góç †Cï3a9U\QEQ”ÿ_&þ&4ö60Ì$½f€6Œ±Ë-þ§¢¦Ö]ß½{m¶nÑ}úô©˜6^À@…ØÖÈ¥‰=¢^!vPš˜:Š3gªÂ®­Ö¶rÞÕž³ˆ*œùä“OlìdÕ}fûÅÀš:iã‘ЇÎ,6»!’Ah¬D!õ~ÖºFi§áîXÝòË®$^dŒþÔGã '\‘¢2®ÖØ ö³æs=oYIŠkmö¡wˆÆbã€q\Sèy.Ðÿ°JzWS¸eæe(Îÿ÷ÿ‡PÏ ¬HºQEQåÿ—CÿŸlßL{,Œü“RN‘6ኙÕkŠi¿Ó?ºZ›ÞˆË¦$bÎ*e†y ƒ°ÊtÄ]p“¡äL„Š¡ ²Ä!:4Ù©¦ ¢S×éç¤D GðPز{’Vg¸ÔìÆDÖDNþL3}‡#»ÈvSî½4ó`,–㚪äÜ|9,ÓadÞÁEmj¾œ—¡øuÐÿpêcÞ¢(Š¢(ÿ¿ üß s¢»ˆí£6áw‡Ø¦Ýn¿ËDΉh‰dzŒ¢ž°QjÂ*ÓVÄFƒUñŽRnLȵÓxézµÚ=<±z*ã¢èÒÌÁœ¡n\¬Çùz:ßÜÒ»ÅùBÄLûßY¤‹¢(Š¢üÿ²êÿÅÐÕǬÓLG®]»¶··gTuŽé®Éê¤Í†¬êW8ž pRŽeJ)~*¥4Êf\PëáýP‡¬t2,„ ˜³÷ÌxS³MFàIáѾµ<͈ôî™”/ØS@õ:“»joîƒà¿< y‡3Í\]I×Sšcø&Ëm®QetÎû ô6[º2%›ùXÕv²ër|Ý´4øwRæÏ?ÿ|,k^a¾õëâ\qûöm½àš9›››Œ¯ä¾Æÿ)Š¢(Êÿ/qþß±FÎBÇ’;§I<–”¬i<`zº²&§M¶Ÿ‘êyLžËø5uòÉ6Í`©‰þäqVÑOJæñº1³ÍlOÆBÿï 3s„êÞÔzD €¼,ÿ´Ð1µh„˰/v_‘ï8ç!ûTŃ‚ 4Á”Ø+qJ¬åŸd"ê}Ë ;K+©¢gª¤I•ëCõœxJ^L5~ÞG _î–Fà£Òˆ”åûÀã\¾/s!ªC^ìRÔ¨ìLG%"Äâ@'eºB‰¡¤·é zãõñ@«oéj=‹daT€šè)Tõ°zæXxfîîîö\2ç ê˜ÈüÄÐÅ¿2ɹKuÆfE“©wqì‰Ä‘ñ TÒº+ç'?Ñç®éðò%â^²¼ ¿ùÍoè?7ûöÒÏÔG}•å 4ßÌ_×ë'§±&R+²‰>,ébq ûEQEùÿ[ñ”v/øñ§¿ýbûŸïø.Õƒ“ÚÿéÓ§,¸Z‹Ÿ={¶œ‹EÙŠG”uº×¸™gu";YΓ'O (lþaÉ‚ÊP` Ö@NÞ¯~ÐT$íá-øØË5õÃNã›Q=ÿô§?¥þSÿ»÷r›`²¨ìÛ˜Æ*lm8šåxÝ|hý‘N´ó~Ë€¶Ôr«¡yÜ«‹á‡#lø=sŽQŸÉ5 Ý–­ fÂ0¦+êéd—eë²åGÛ]õÏ4;Œ¤:öK“WÎLf¶LW~6'zuÚ§£° ÓÿËïæˆðJög㌓ñÞV/^¼ð>ZNã”4ër^o'˜ËHP*Ï}üG¨(Š¢(ÿ?†þÿåËW6þúìñÿ¿ÿó~qìôdÑfË•q,Üô¸n`¶ã•Úžžbæ?Éõ‹E!G˜4سÕI¬Fê ››ÖÃ÷¼3–o¡vkB_º¦X\?EòÔŸ >kb ¡šÃa¨¹so™&ÁŽÄ?þøcõÕWcaüâ7✻Ì`—'ç• KÐ0£øM·_wé1ê“<ߣŸÒ¢ê“þËËõêáǪXŠ +âXò3^ŒÜ<ú#¶ÀH{g¹ÏŸ+?_OfWri&¼ÍŸÚ‚Þg4'þ'¨¬…‰Ê®ÀˆySL§qPÀXÒóá]î~¶W{fÊðÃ]ñÅ_,ë–ßú¢(Š¢(ÿ#ÿ§ø¿ÿã_/¾{ùüÅ·úë§Ÿ\öÿ…0hɶ²ÝÑI.XÖìMN—6Ÿ®áWë3yþÄÆ·C™–cûáSåX…΃(št"*Y]æl´Ý\kr˜%œ'Œd>ãí†É‚G˜Ñ Ž“Ž hêìΤu’b&%pÆ2bª“ŒLÙž?hòÂ>:HæZ9Êÿç6›]®§ÕΓØrìî}(ŸÌÉ0Y°`'c…QI=íãÀ’g¹þ™GøõøQo“œÂÏï ôÞz–ZPµ¤3ìY$Õ×d浚j¿”OÅÈ1ßG¦lC P‡xìô~aO¸zs¤(Š¢(Êÿ³ÿùùç¿ÿøÓÏzÌ?÷¥Í{wýÞÿ£b,z¢ó%‰Š_¿~ýÞ½{Ðo›˜£¦ÿ,V=ÖÙZŸ†)`ß‹M5ôn¿···±±aÂ`¦¤r`2;Ò•®s{ý Ø‹å¨çÖ­[é–›d;·3ôPÀÔ³tW>ÝÕË­€iu€· æÜÚyxGx§êdŸ4~¸(ú|uí¦=Å;{Ç¥}·'Ù‡~›¬³Þ¶>êC}MãBäOæ[òù뉥 ü\ìp²‡éçí<!¤8ŸÃJQ<È|ÖI§ß¸¿¢ÌœN#¶-rƒc’Б¼<ù-)x€’-}#¬ytìáë͈ì:RK$iÏšøYª{^Nb™ÚSÂñc©jM€Š¢(Šòÿ·µÿÑâ©g<|ôDÿÿê׿züô‘õÿS°GK°—f´vVn[õ¾ãÉI±ˆ}«Çè=9ƒ}ï`Š0ÙÞ¨(±Ç 4ÁæNz Q¡ªR¦°±1-EúpR`Únæ3Y¡çä¡*dè• bo…¶Í¨Lš:;ÿnªTo2¿(³×ÆÛŸ}öÙxÝ~,YŨu1Œï§ ¹ç8^}(Ù í©2i X=¡Ê—ÌÈp 0òIÀ˜<ß=µ<‡™™í@h{vá•ÌÆóçÚµkšiúÿÎ;ª‰zõÆÌvI—ä‰óÛ$yá)LÅÂT¦ûÄÁëÓtóæM×Ù?ݨqèÐõ\ÆkbÏßñò}g£!ÍŠ&ÉhYœ)Š¢(ŠòÿÕü_´}ìûÿê176nŠÿßÛÙÒÿ^gÑo'Ã1ÿG y t¡cŠcèF‡ÐÔŠ¯_E Târôçë Ç-ÑÒoùJc²í( ËD…z^ÛI ª [ZÁsE6TŽ*Æ£±DåøéV¹›˜%]!à‰Šr:05D÷r!_0fPT>Q©¡_õ¤z“q5m·i4y».œ)̤‘5Üv%ÆcZõ¨íŽÿ9"¥Âˆp‘o\§Ê~¶»1•<¬ž\ÃUçôñ?>|èHPcËqbs¯ÊÏbžÃ“}åH)˜ÙBÈ\wQtϱŽã7?ßDZØÂso¤Ë³ÿÔ,e4ÇëPn ÓXMFÈÍW senv Oñ+ïû²ï³ zOǼ_ÓbQEQ”ÿ=þ§ýÅüÉÿeþ&ªà”XXh°v§›*|Ãñv̦´F'Í€Ïp Š¥rË&BýùèÑ£?þ˜3Æwiy±ø†J³–^'­]çYcáK˜¤ yÄìŒc&cP¦d ´kÊ`åšPˆÚÈ£Å6Qœê×ÊBÛž—¶1¦ëŽå™ì÷×Ò(rÄîî.J~3ðôЙÀ«áù颦GS²cø3 ))øýå@—©þ ý”ŽE ¥Ó7§r@ÒMZRE¥¬êh¾€¢(Š¢ü?ø¿¨ÙØgþÛ϶½»#òÿôÙ“(ôêZ”íi+fòâÅ‹ÌÝ£ŠaÞƒ#¡éwzõz}‡›6›üØûxýyÿþ}‚ &ÿ‡\Ý»wû‹ÃfŽðjýÀxFTÓˆIç9†Fc©’2Žêì•(í§¼³³£“ÔG[?IÛ½]2=TO”ŒÀUý§ðç?ÿÙ¤eýùúÉšyÚ|ÝÇSsÆ". Æ')!ŠQ›Š»†/ãɸÏ0ß{. úä'ÎÆŽéÊ5øhó,¬Y¼ßÄ$t¤)4Ý»>¦—ðö<È>¦ê‰ÞðòÄ>‘¦:4Ý¢ÕýÏíOž<1Áf3ÇØ×OÔ4cÏ‚nǸˆ\_~ùåˆ;$8ì¹tµj‹ûÔåÁ~ŒŽž¨þ!€q—ej$Êd›F'uŸ eú/›Æk(]â99›/ (Š¢(ÿ?Ìþÿ‡W?ýýÿú•~Ðúüë_mܾ #2öööÆÂÀ@ÿ¿ÿþûâ½=²ŠÚf%­Öz›úÀйQ—™·ˆ-°â›B™0ü@釡ò< ˆJeÖ­Ô*C#¹… ,ÅåøYSá*VÄc…¿Ù”­ <д^NîJÞ1‹M±;€1’‰«Šõv€~"PÌÒÿšu²•RÇÒoš*8u¬;0UÁv‚@眲Ãoû[ïˆõÕL¼Tk8xœÇñACÑánÎÏ ñg&šÍCUOOƒÝÝ]‡“…m"'ºòî+Òso‹?UO‡»W=U×8ñÖXŠ”˜¼ÔŒ„‰”éí£ ôÍ×±“ ö\L˜&¯üŒ2D,\†@_-ì»&O‡uâO¤<ï¼° FÉΑa¹› t ÞGŽUˆ'IóEQåÿÚÿÿëµÿÄÿ7u§¶òu˜ú Žw-äÁnª:™~¯^‹±s¯;gÔ.p¤31.ž;ÅcŸb›¨pç'a2 +p'%“tTO+ùa*ÇçÝ.·(p½ù’®AÒÑæ½.Ö:Åfœtéˆÿ£qu m]Cå3?MÛ»7nF(Þ766ئ±kª®äw2}n1Êé›s˜tKÆŠAZd84…8IÀU]&QE°7Ñ|EQEùÿÄÿµ®þ¼où£¯~úq?À?_¾úÅÔeŠsb7ÀTß™]LÚùÜ:3ÌxnÇgv‡ÓY6´H›|(J2Œë‰²y@ÚFF]Z|àz·šëQE:!‚Ë´H#]¡f4á·(äú[%{Ñù¿êõÎÔl'iöÞ¿ßrÇ×^¢x•€·¬Ø#ihîz ã§û\׫”¤(0åïUQ¸mÑmÁ•ºâ48÷Ö,¾Fƒ¨cNÒ^«£—í…(A’ò"ž¾’y;ù›8—2oWº]äëæq¡s&Ñ{"Ò’V“dBúOÓ Y·+BDæËïƒ÷ƒ²bü㳆9Öy¤O‰i˜š/ (Š¢(ÿ?Ðþgìÿö×/þúÅgÿÿÿb:鵞z/>}“o°è³Ûî=ãö'¡ÂH #™ØŠb‰íÐQþò¤G¦!4„úßy»2ª?ä3•q>æ-°åVû23«‰„ˆ™¼Ü‡9ŒþŸÒž¨ôÎÂŵÿÑ•ù†šŒÄ—ç%)L™§ðNµ¹x–Ó2/v±Ž¢ã¤·zÔÔιNÇl¹oâÌ„0ò,·×-Ö¥Ó'̲ÁŒ'€w²0åÊáÓ„qDP»½L2¬-£2Âa@ÿ?ÑSÝEèØaÝËÓ[má5áJ?ÂMÆãfÿϪ.§uF€I“`5¾“ 8P’óôY@ÈÜy40»Â#è̤?㼺eü›/ (Š¢(ÿ_¬ãûö<ûù¿^ýôã·ß½°ýk®×â)úXD2L’œáÙ3uQZ)ÃRXˆ&%‚s s-@)},Œ–¹×IU˜Ì˜M',L|“f|'Ó8Ù&y¦%á`AVHšL’öhâÌ~bZ/Œ°SÙÿ×f9tøNf•µój©çmfOb)ø¿%ÁÔrçË,o qrû${Ëug_Éùh¹§Œu6ó¨ñ¸Ï?ÿÜ…d^c§°bœà6ùRøØ9#tè+ñóWô¿“šMam2<×t1ïòK‘mŸ²­öirÆt “¿úê+gó-6ò™^LgÐÎŒØ)$:Ù_ë$X-þ$ÍPEQ”ÿOúÿ§OŸéO¿yŽþÿ§ŸÿgY÷*œ!.Ç!‰“¼@ÛtGK­s³Ê§1CšsxÏÔ¨üéHþî‡)—–Tf žR‹Zã:1ÿ´Žæ–$ü°‘´ßv©!—I’:¸+ô«É¤™ÕÎDÀY–'7þgzøRÇç´ 5E•aÍå°l"0vš¨r±j8eFóEQåÿ‡Ùÿèÿ»ã™”“„<‡M“²EfnŽég«ìŒÿi tt¾7‰S¦¤ ]ÂõfbIKrbsôô?]æ®Ø¹Jãu7‡´¦˜TµNGku´2YÕ\à)Ù…†…&M’ŒŠéž„F^þf¯aœÄý^ä6 é<ۓç˜`ggóÛ|±óY6}ŸÌ{&?©½³` Ÿ‹ÕùÍPEQ”ÿ¿;ÿ·W,ÀêžÄ[i9œ\a!5ÃñHMøÛoßkÉDz÷À®àç}Œ°IžÊIj„Ê.AEˆç3 ¶ý°âÑ.½üùìÙ3w—ÍÅÝXý¯_“Õ'÷à¹ä_8b$– ”{ý}œû÷ï#v9ñ“ŽWûÃ^xÆZ ÀpÝò/QìPؽbDØ¢4^J³4çà¯&JqÕsÒû¾LæîÛ2¶ïíÅ’+›/ (Š¢(ÿý¿mZÒLÚü2™Û{ï½ÇöA†òã®7n8/ÏÒbíÌG÷÷‘[vDÀðô¬ÜÚÚÒŸN?4Fh_õhKN"B»“´+†$ #vs0?ÝžY%—àx¤D§±ƒþ'È$UZízÑaÁÊ–ccß…SýïO«ªËÑjBæ| 2/ØÆÆF2p&ªæä—k&ãvÉÁµÖR9¹óT©=ܱt¾DN;éX†e—êùÈÖ“ü7_@QEQþÿ.üŽ-J­M“¯¡PÛoXR àI:B`RÃFPt[gFÑ£Ç{tBR;TŽ83é™ò‘:¯˜’þ‡ö£ƒ%iÿppÛu ¦Î"QŽliÚ§8Iôïq2ÿ>ŠWæEŸç¶$O[}Ki¬u¡‘N%éŒLŠŒ¤éG&;Ûù0%¦}&•½cë"Í:úÐïNN0'/s­&“3=åþë6¯š/ (Š¢(ÿwþï*a¬åžœ9[“ÁŽØ2…æ'Ôï#"ŸèÏ40ÐØÀ¿U¾'ø’¨”M¾úê«.É®íØWxZÛ)ÀöÉEŽ€‰¥ŽÉÚZýúÞ{ïY ± ój°w„]|ÿþ}çüM# Z®g‘"™x•cÉ…ó’Aý“Šn1dÒ7¨¯ÌÙ2áÂEd[Ó;#ðàó;"ò/Wz¶êO^½Ç®*‹eRé^¢'ù!:®gMoÏ@Þ;¶äTïFeZmû×_,þï¹Ô|EQEùÿ;úÿN =ÅoU1ÕðÙ³g¶@†®°æZ™/B~÷î]èœHŽÖekæM¿Éÿ»#nIç>ò@àq¨Lc›IµàBzô$MÐÑÒ«2V:¬*oÓ‹ 0¾»»›.™NíDúc_éÄ©ª¼w"Ä7lø½Íˆ/‡Qº”H‚ʱFS= ù(}±Ç¥°ÿѬÛdºÚ…œcMHGÑ„ü{,Ù8é'RAùòØâv—ÏKçlËpc¨u)œ.3>¶$+\Dýÿh¾€¢(Š¢üÿÝôÿ6NN5 d>£¦'EÏ(ŽI*lÀÃe^(Jb‡à _¦ÊŽ'oÊm; ýäÐî˜îp>-LÄ‚D,±ÉÉЋŽÀcó¬T7‰bb«Ž´½½:—áû ‘¢QØüÃZEíLÒø‰zÓ!ƒ·þÈù .+&+½¤“Þý!åeâcš3{{{~;x¡4èÌ73߸€ æ€N"Úo V‰€%î̽ëY¤{-Òê±ð…@Í´ÜÚÚÒ«§gé=ͽ€ dß|EQEùÿ»óÓòä¬7nÜðn»“(q= ļÝ.ËÐOè'YµÅ=°~—¥Ÿ:Àˆ2 ÇäyX!âxü6uªÞªðAÆJòSÌ÷Ü“íjœu´ù:É^z>Æ–géÝ»wõâÓv8õ1J^Î @gZàÕâü!ßù0ZË SNð)Z!ƒò‰ÔÙ¼˜—‘“>Ï;;É8§ý½u?;7œ:„mGÉAÞäkìc4+öCý¾7ˆhQEqqù?tš%’L»Ož<±²ýƒ>Hfâ¥ß¶ëÑì¯Ï>°©?:œ”Ö´ÁÑh8·Ñéñÿ±Øbaó'¢W¹lÝø¿¤g쉬¶‹ý2ˆöƒ¾Ä®„ ™äë|’N#+DŠQêU^ ¿#~sí´îYš ”ª(=˜œ¾ ˉÎsáË2 ôÈæÞ¢ëp6³N€œn&oh*¦Ø¥Š¥™Ð²„â}O;@uE+Š¢(."ÿ‡rXw·œBÔF­M ݼæIl'V3z+Ø H ÷¤©3ÓþóŸÿ¼ºÿOŠÿ›ÉˆãMý¦?!~™Mx­ø?ŒnDØI²0œ@¤q5œ1¿üòKw/4ø½}¸ç>|ø.Êd“m‹ä:ãÜÊ9ÄÛ‡h-D€ßÁ4³dëüUy§¯™ÞÊL¢=¥ÿ¯çésÒ³úlC¸œ§Ã‚§*ìDäüé¼u:#ªŸ†ŽùŽ4•pQEqAùÿ´J²¾C‡$—9¯ž^uñŠuP?yÝÇš(ãÿ¼U¿Á+ 3©{Ì&Pç3 ÎÙš{ ?ìÃê'È’.^OûŸìÉ33'ÐkžqhÖË KÊö"™Ìþg÷ö;hó3o™Q,)˜¢e¦E} Óµ¤÷fÎËsFÍ¡XZŠ{ŽSéM’ÅÙ¸ÀÛKZîi¦Gg~d–í¯r·1ݨ9xðàA—³¢(Šââò/ÄZÑXЭägùs€ rR§#2[á²Oþ£ãñÿKcg¹{O_h"ËTg íÿa/™@öÌíPg¶ãpŽ€g¾Ü‡íÄp¹wïÞDË1 ùË_’è¦=S4¹=QI3³°.˜öï®ícª’ cT2V‚“Ü­ÿÙGpÄ]›¿U„“BvÎiÃúô <ß¾çN£ÀKJµUd,‚V¹ˆWǰÔ*Š¢(Êÿׇÿ› d8MÕM zjÚsÉÃÀ€c®YáºÈO¶#"¬ÁÏ·”[Ïé:Û*¢ƒ³Ù—w‡Àj, qì=S²õÔÿ( žˆ¹»»kAéÒ'cMÁ×A°³³£wŸ×K„Ô±¥0X=óê믿Öÿ_|ñ…ù9aðùõîÝ»DÂÉž§å¤ !Ö(¥á¤`xNWÝ‹:ÝR¹.¦uV³“òl9¾“$5üöíÛgÐù|  æ&ó}ðl÷'Λ• ™^aGôåÛ’; N:PEQ”ÿ³Žã(7Bk“œèdŠ +L¸ý¶ÇäÕ=†þv­ÿ­²f¥&(¢£œ=©³qõX²ÿñOëÿçøuf\ÆYù3:í‚çÒYî>œ=˜ùÈÔãõ4Ó)E/ª8*9¸‰O _MK{&¡D’/ó‡×9ß&œýù"‡?‰ù“Dz¼îtì¶Øjˆ+-8µw™B’ôl†€,äc±ÿH^oI=Þ=ÔA¦™Dž)ÆW#ÿEQÿ³" æ~Ö .ÛØÛQn„­òý½;à,]ÇX÷3!á¾³?Y¯qÖgO’GÐö&òÏØ<¬ÿ'Íö`#}õQ‡d‡ËÍüsŠ2ax}ÄÃwÙ!™‚Äj&å˜Û[ƒ=ýoùK—Ù‘Ç¿tɸtङ„·ïîÝ»~ïÇI| “úʱÁ†‚·Æ¸àTáÌ#ª¹^IUÃó?u#â‰Yõañ }o ¯-ÇWaöEQ—•ÿŸ6¦œ;´z ‡ÆÉ2Îa*?'>u,4·Ž»§r”¤ +øÿûðŸ·ÜA0aCÆùeÓÔB?‰=É$¦Ù¶öe#´aHµM‹¸—„VcIYí4¾ÝiD رP C¨xôÕ4¢@ ͤ<˘ºOtÞ÷¬ÞOZž[6·nݲMŽS†ùqºEèäµk×ÒЋ)ŠÑZ>‹3™8Àù»õÿ½{÷$×3Öx8] E›ù©ö)·Ôyúÿì¦=iDÒ¤Ÿ™?%öfÆê×)Àïh*á¢(Š¢üÿ‚óûiB ÒÉ2?‡A*lç¬Ò¢$K¾Q,÷‡ùÿ´ù‚íý%ùÿÿ÷ùÕé•ó)º@t}2ÕàâØˆ_}õÕØ×gB{öööTÈ'l0í4lóÌ#Rîàü óÁ¨Ã£©ŸÒIÄ´Ó=‰LAõ¸YæjTx&X™œ±Xm‹þ§?ý‰“`꟢ßÇ“âR ™­®gÈ4â:o§]`¼˜Ø¤Ì“qå$Yüú׿þ•Oƒ´  ›w”¡w ß3àÿt/žz"Œó5ý“4Þ1 0Ù;;;n_‘ˆUEQEùÿåæÿVºžbYož!Dƾ-A¦R…Û˜o=­aÚ+ôÿ¦Í>Ðíº7õÀ~º˜Œ8•=SÃé|Ä»»»Hh}/ª]Õ_C 2ï¤HÓÓF$ØÜÜÄú E®å#‡ A&Ó,Šj«|«©½cBöÕÉŒüJ•¸†€N0Ÿtp­és±üg^‰Þã&rxñâÅõë×=‹<É5.)>øÞe÷„±ïYìÙ¢¼u듉À‰t¹X-rŽ3^yœ¾™r¼q*áÌ>¹ª0þÈp{Uãüc~ ìé@ÿ¤’_«—29Ú¸~ëEQEùÿ¥çÿS…a2÷îÝÿùÍo~ƒÒÒê}˜6´V43æÌ1Š™±(1DBLï0þ%s:3Ò»»T É÷ß}J=¼ØÝƒHÖŒ0"*ˆ»]%,;lj lºÃ•"ö·oߦ†6PÁIgpè Š èYê+Êüè£FD¡§¯¨¼Ý€¯ÒÝòê@½ÍXÓí(¥éŸ `…÷Å>FÄkµÜg1ͦìNbE±ËâÕr”§tž„â±È Â糋½U`²ŽÓ¯ì—¹§k&G¡œç§-jéM”¨å—ë&~M‰é#`—m”…ÈtPûŸ¢(Š¢üÿ¢óx‘‰ëöö¶ÕûVšñ&wÊpFÞ ÈxƒâºÇðÿiɧ0+‘sQ}s<,½ùU½ªë%kØcqä I“EŠLiô8ÇEÜÙÙ¥›‹RŽ$g…KÇRý©»~ûÛßêäÇ=¾ºž?^WqÓ rΫ„ +É30>Q­ôŒÀøgrÞ”a°ìfkâÍ ×ôà'³z®Ç£³{—x†vËﵓ67?qLKö…w6³!ÿ#b 9ì?¦k{•y|à,iˆiåNnðÏ¢(Š¢üÿðé‘DwÅ“½â£É7±Aÿ©Öííí‰<'ÆÎ‹áúõë+ø¿þÄß-zÖ öäÍ-T¸Ü«Çeô!êI’YÝxïÞ=‡yÁÇ”¦ sƒ [;XðÁ¤®¨¡tLÈ´zòä $“H2ní±zÕ¦/¶©¾R@HÄbÇ‘ä3½…{Þö9¤ÎÜ¢™©¾„,¶ol ÄX›Ó¦‹7Ïå'DâdzWžž’Ž'5¾såIUÃ;S#CôåfÁм!'÷ “3³ug64±ªšR³æ'[Z¶Ç#âd©UEQåÿŽÿÛÐ5ÝÌ܆ë¨ÍaSú?]V'«iíììäùüßÁUÒ}«˜ ié`ssÓIöX³/ñvD“Có.‹6T±Äíím•ÆezN’>i“îÒ•7ö‘ÛâoÞæ°A‘zR—á= Ÿ¤¶8`¸‚e&WöSðèÑ#õªä Œ›djꀷ¸‡ÛJ 晑6ÍB¹ž™ì@£.Óq>MìMÅýh 4ù-‘©pvIJzd+ã‰l;ËP²Sñ&Ÿ”3è籿GŸ`–O··ÎÔcš±ÜòøñcoæWâ â EQåÿåÿ§ [¶Œ…æÜ! MlØlŸV®„x»(³2G<Œÿ£“OÛXñùÅ(Á)•Í^ܽ¾Ë1‹LÅa,Ë$ñí½‘u¤im>Â2 ãg+ŸoÞ¼9 U•¨dF‚µN€QÐÙä[+أ¬nºñ´áNs Jïm‘Õ¯¤%©‚3s@€¢lù©3ížàTìWy7­X1ùýÒÙâÎAn=£Òât²>õí„¶Ë/¹3of—€¸Í5Îö¢I»¼f9\žCoe8CåSϦc^”ǽêuoîû2o¡z'Ôk¥Ó&ò~Ñvüô»=°ÊŽÇ¹WmUheŽ£aäª7ùCY·fîä{•uúXÀÐ J ¯R ˜Uõs)ÿ°¯™:'M@G¸ª%eÊ5+ó§{Q¾ÿLï?UÃQг+ô "„Œ¥ÌŒºÞ+æÚ‡-ÿ_OþÏ\"â}~dx»]ùüø¼üFdŒÄcÌ[ìüñÞÅÒûÃ?”@!¶Æo…µ5ª·—–Eú¤_Y?JM9Qù¸9ê¦ÆQÇ|E3‚SšÐ µžBÔúŠ›ˆ7lÜ»wÏî½L{ ¿L9¸X%üÇüEij}÷7Ÿ““¨K±˜IúØÛÛcÇÚ-çOõãCØU8œ!ÝÛ †-’_]ã_ÇÂ@kÄ.Þ)aZ^§€xRÛ¨ùˆ‹e0+íÖàMÌ}=Ö#âk¥ƒ¡A)s5aô÷òõEb:4vï&»`vÚö²kêN±Þ7ÍöGŒÇq™“’Œ0¯Í ùݳƒÕòn ¿~|é±Ìqƒ@Áθʤñ {Ú윔žø†dTaË,®g^“É@ÓŸN~öÙg)”åøNZ£”D’¥›ˆE >ÂÐÔQ;¦¬FT˜™Àƒ,izÄ‹I¹GÖHjnÉbºŒ§ë×4meùS'gHjkBÊÿËÿOV[¢‰Ê«´ìðx¼|U|ëP«Ú‚ú]X4õÔçËõñ†LoÊ:À¦×(™§/í•‚;þÒ"ÁyÖ‘Ö| ¹xÙ-ÝŸSS«¤FnÒ—Öéá¸1—³ÝÝ](®lùãÑqÒ^Üò•AÄ o=qÀ­ÀHL7Þ¹sÇéíÎÀÈê2x ÂȈ¤f©9\ý^O *ó \TO“çMÓÿ,²î^–Úêÿ‹ h¥Íæm|mЯ¦jy±K=³fõó>/ökoÞ›¼:\R½w~/ uóTŸ¨ìƒráó½Ô„˜Û™î<‰‡¿“öŸò+ï†èÞåOØtrŠÈ±üâÛˆoéÍ}¤þÜD‚B›ókãHËYùÜxÍño\~òÉ' „J@³‘_x{cMú|³ˆ?eZ,666™\õqL  9£ÅÂyUrL- ýå/IÝ”çäX˜=EÖÅiO„îRmï߿Ms±ÞÇòÿµåÿÓ§ÏZ‡F±`{ ½=Ú9l$xYŽM¼w™;hiw™ëZ“iø2'S½Rð·¿¥ùÅNÍŒÝ.t0¥ëb6si?Õbv_…²á¢ïyú®jzS>~2’™´a)°Ø}ÆLÞ£j ¡_õ'ÙǨ 7ªæ®óÙ@õ§ÏÕšuzºw"Fä×øÇá°X-¤Âí ”h̦/Æ´)0®¤MñÆÉ£ ï¬î¹.x2óAN‘“©åpÁùEJ‚—»áކ7Æ3˜ òÊ'g›(uðd6çç£ç½Q§5ô>îùÔGrÌ1¿ø8¬Ù’Äí=ð}ɬ”rïÞ=«ú§À )›À`ùf§Q«ôœ>öÄiÔ£G¬!×5ô³73ù¸ýì2\³Êñ@ëïÅ¨Âæ0ˆE^\²Ïu‹U=\óÁØÐkúh‹Ì¨LXöʱÝ5<=&£ ÏI>9kŒCáiUúýï?ÉMˆ?”ÿ¯'ÿ÷¸èåÂÖbúŠúÓñî"§­ޱÀkøùçŸç÷üoû zþlžY|•·Â×_íN@»žõ<³ùÎíuB$éÿÃrrù‹»»»¶N™\T<ÇÈLÁÿÌðÉ6_L»³L@}íç›sXÃ'‚¡§8(n® “·Î²–—’S¢ýhü¼µ>ÅGU{ Øuípht Ÿ~úi*>üðCL•¦ÇÑFD­Ð€^ÁâCÁ»ïNž{oG“à”‘i/da!„ÉýdZ©ƒ÷ß,ü’T”?M¢÷| ½×™N®«–“YrÝjŒ/›ZJıڵmÒäš1µ­RR‚N‰Ý½‚Ø·KÑ¡ùh”ÿÔb¡¯´S·³£Áê$;ò6Žò¢@˜nêL«!Eøš»É*Š »H0åˆù쯥ۈ2ßFJÌLM’íímä8•àVx±cþŒ× Ò&)¦ü¿üÿm±/qDËþ½?Fù.A·ëuÖku<#"¿_6C²¨Õ6þ_O»Äë½\)Xy¥5‹#¬^Ó#¿lƆu žŠÎÈÄ´LLòlN{ýïú áúϱ0ð½Ö¿¹|ÛªˆŸª§½n­¶r!ˆ«Z…Ïl÷–}–QM<–ËLo€ÏÿBUýòË/½±2¹ÛŸ*°£@È ¨j#­@{hW“‡©›üIuìíí%™„w¥õ>d,·œ<Ùü'/²ßyÓPüíéÓ§ú¤8¶_H'§(=_‰±OíTò¬e‹áóÎf7t]vÕ©¿jnÍ3¯¼’ù~:ô8-Q'¸ðN¸þSª LošÐÉÈM:c£M¾<êCýDÙ‡ÊXxWÓT1Ñi)ê+ufº L vëÞmIÅŸú^©ù, t) ̱tŒl•â›·ù€Ó@Õ$We'/ºÑŸGôðz”‹-Ÿ}Æ!ùßÏòDõ• b.=Ž9”ÿ¯³ý¿M, 0=å§ôLÇོLéc+ëÄóy¿üÁñ>,V þÚ¯!ÿ·ð’_ø«¹.C•Y½LäÆ(Q¬taÞãýk¿VÖº¤hÅŲ¸çFvòüñºõ‹W@_ì‘r‰i“7µg<‹ÅÚ‹KÆ‘˜¼íN[´w úÐ 3{.x+üpÓ†ÖrÖ©‚¡IíAºZ!ÝÆ±£—š0·nÝòk ßÖ¤Òì5N Ì2H…ß§•Lêkm¶Áƒ\ÔP†g>A¤W4ôAÐd†ŸÛW(‹yˉûe3‘_L}ñ÷ç¡¢Ü|¸ô Ú;5'‡GøÑgê@ÄT¦kÉ}X]Æ]úÉÖ¥' J³½±”~Ñ/5:eç¤÷V·dx·±0¤wRNwBòj7ŠÓ”ÐJd-â”Øsü¹¸&[è¡&#Dx›x,Œ”TŸœTÜ‹ù¥µþ”q†k$B~òÉ'ú)ƒ}ëMvÆ3JvíÊÿßfVSê¢~“Öôm‘–|ôŽÁü±µ%¡ë™ÎòÖ¯¨¶:Ç¢qB&Uq]ÎϬ5`ž*ÖÛãàÂoæWÚÁârv¡ÜÖ‹Æ2í9째ûˆÁê¯ïƒêd©ËÒÇ=å|ƤåŒ] 3΃™óÙ¸ËÕsŠ«sa™ýqö8ÆÙFÖ=ÐLh%¥&å+¸‰VQÿo}¬£ÆéË€ÒÛyçmpù6¯¢¶6ôò~Š£C;¡f‹Êñvªå»Ì½BõTmýš¦˜YxXsÒûÀrkÖÅÒ–ÿ¯³þÿlXŸ'ù•õ×Ó×R™¼‚vË©RæË™BL³Í)x~J ÇêÁž¢ó¥ ½íÈüöD³½«uh>™>€6.¢@¢dd@ ËÎ6ʇZX8žýÛñðüùsŒŒ™rtÖp xBgÒÆñú^ƒå°xV$:ù´ÛÇÈÍ”å¨92Ýs:þ{H·À²ŠâÀEÇ|›Ù•¤ÇÐ_a—rÁ{‹u†7%QI¸ÔéäBÌ=Êæü™þóçÏ%ah!ƒ³3™",èJ¯?§ÔŸ™þÁ*mèOo|mÕ6o~¨E!bÚ¬}—zÒú|Òå !²iÂ.†8Ö 7q ëñçBñä$`5´V'ê;gl†”S=͇¼`§ï±ˆþwÚ`'ÚQPDx´þ·§ôÆ•ÜÛÛ#ÞgÔjü%Ýáv‡ “'o—¨í ™:Ü!G¼GðñÇçZ0e!]šÝÜ$é¹È€&ù–¼ôÙk£úÿbÅ¢“‰°ýÝ~ ¢â’ñ’yåŒÒ×o2ÑY¾æ­¾Û¶±<^ÐõòÿòÿòÿõTd?\»¾cCn(¨9?‹5¬’ o6Dq\5—ñ©Ä”§Øb Åt³ašÐ:܇Їñ‹]GoÓíŽPÄIg…~öìßpûz`©Îކyìi‹œj¾è·þ'‡çÕÕV¯Êˆ–Ûl ˆ]»ÉŽ2á)Drãóäf·Š"éØÂ’¤”-.£’õ2ôºý8\f–úŸd:W3•^qêž^9ǘ'æÿ¼8ëœ_¦8Kx5Éý ç,örp<²ä‘ïÞ9…ËÿËÿËÿ/ 2Fúÿ+ë´øùçŸÛ/O|Y±ìI:ùÿšÏˆ«™ŒÝßIºÚ²¿ZàâѦîcw £±e nç·¶¶Ì`ÅÞaø¢`ŸÂG§ GŒhggbÿŸA¼9PM¹2Q4‰ÛûõtW;I¨?ÝlÙ茅/O’­’ÉØj1ó×£Ùg™¾<(³B;˜’ã{?űLUŽë\Ål± ÞGí¿‹¦Å_›Éö£¸‚p<:&˜3•ŒˆY—’ãñ ¯_m»|©ü¿ü¿ñ?G¤d½š¼%£èà®k¥ºÏ‘—c¦ ŸYŽŽcDXl‡ÜOÕœÃÈPÚ»žÒ¼³ÿý>ÆÂw8¥3ì~M*2:ÍX¤éqV/èô æÞ<ÅÖ,g¶TYlqòS¶6ÒßÁIͰJ£z‡I÷Œ—­zf-C9"g>úè#Ôøùë$¡dUÉJˆ„®¼Îd·s™ý$—Õþ§8Œrèv”àq¬ìN;ëWþ ‚wE àk¯ÿü™™F¸cìyveŽûËñ2–ÿ—ÿ_YþO˜Õ\Ùø?Ël º5l|߸ÈfP˜¡Öz>2ðIý™ä~Çä»—:3 $Ýžû)dó$±×X™ÿwÝ0›dAª>¡(Š¢ü¿ü¿üá´¶ï½÷Þööv¦0¾‚]f¼fãOŸ>EÕ¼B ÐŒ¢ÇØßÜÜľå?ÿó? ¹³±±áì`ÙÕèô.kÕa€Õ«lM 3§õ¼ˆBhªpÙL±«rQEQþ_þ_þ¿V˜RA]Ù- q™"ð:€‹…&Ù×üóp ÌÖ¦5¹टémªò3Eã%æ‹ØGê—/_ÒutKzO_ “ÆZ³ˆV4kQEùùùÿúÚùÞ>®¬þŸ(á(Žº··ÇŸœ‹Ä»«?)\0™õšÙáÇá@3ÖýÕqâS÷šÞ;ð¦ûAÝráöAì'2ŽÆuÉ,Š¢(ÿ/ÿ/ÿ_ÏM5Qa2\Á~€«»ÈäE-÷Æ«W¯ŽbŸŸé„?üá.Ÿ¯ »:ƒG€KsjÚKì:J«'a‰0ž¨ÃSçpQ`W‘Gݽ{·kkQEùùùÿ:Õåwß}GfØ«i·œq41ÄÆ·¶¶’é0}Þ9ÌþÇN \6±Yqþåðª*“ò3¿íåþÞò±ÝØØ J¾?7nÜ ©€»¡Mß» P[,ÎÜÚÇUN¢QEQþ_þ_þ¿æÌ_° úÊN†4;·ø“Þ¢s¶ÿY-=þœ Dþ¹åÙ³gÉ9ÖO/^¼p´U'8F0À ÚÎæˆz@=C/âíçÆÇï~÷»rÖº÷G•êäÇ)Š¢(ÿ/ÿ/ÿ¿¬"ÀXhª¯rбð†v?R~sseµ¼2 Dh¹=6JlŠJý6g01ÒzÊ«W¯ø]îyhjwµÓ®×S_ þü¾§uÖ”†„¡$ÙºØ"w¶··'J³ú.ÊOpŽvØZÀÁ¨6 ×07Ã80bhÙ'$z[¨|çšfà¹À*N«D`LšùéÙ³g²ñÏm¾â©Ì×;SáúXJ¸nË”¢žiw²ßl;dëî‹à0:sà„‡(ª|;_î-·Î]í®ã'»NÐo>ôŸ\à¤6#œ&4. ùr¥7®·]|Á¤ÉÏ+9ïéíGLEñ*9Iܹ¿ÚEQEùÿZ8µ÷ÓO?MžÉ±;°IÛœHt>ûì³ÝÝ]ò­I’Y5öý÷ßOÕ®˜Þææ¦ƒŒý¨ïê [Èè¤MAŽuãÿ¦dh¹-Öi& òH6¼{÷®ä¤¡_%æ%×KÊPù¦Í"Wšç;+âÿHžõˆ3Ïý§mTÄ÷’Ï‹^2”VüBi£GY·Û @?¥Ü%\nh”ùø0CH‹À”“Ü­PÿóSzë.zÒYü†ª4õ¹ÇÂߥÏ?ÿ|¢è_ýõˆ¤«*VÇúÕùš“ØûöL´JbOZ!m–ìÙýàÁƒ#~E‹¢(Šòÿ³azZïX³ÄÆŸ>ž6ÛÛÛãuk@õ$C Þð1Šza Iì]Ó2“5@¹í²‘ß7=×â-=o3?}\d±°þÒ-:³»»‹˜ ÙJЯWêEýÓƒ»"@QEùÿúðÿÔª‘vóùó禲lakåZmœ¯ÕK ìaŽøh|ý&}éy Ê`? *!’üþ÷¿‹à$-1 ÄöãùI×ÿ³ CW¤VSÝ’2Ý7k2þ¹÷ƒVߢ'’oËljfÅÄÿǾý¹+†é—EW´÷j…s(Ø™gD´d(È¡÷˜t=çõD4Õoì· 7†Û«üf}ùå—L‰¯¾úÊ£ >¯ŽB ÏFIŽ%Œý=ú\×S ¸="XŠ6ø±,àÅÐã¨b¹‘xþlþö·¿åÅ·Ë »b“KHQEQþ¿ü†¬É4àÀp^«íyÌ…°Œ]m/ôôéÓ›7o¦ÚÿUØîÞ¹sç@rbÅgÄ%`zj gÞþ¢ØÿŒ…‡# ö ›r¨vÈ*4i…þÊvªñ 9êaMúsM’^hÿ“#Má‘[ÒxÉž¡¢‚žB¼“¬”ãÎÔó¤uñåοlîÔéóLžáí¢ýyÙµk×r¿é›o¾IAÀ_6f#ªû±é ãÆ ‹iú_·èzX¡á}}(Ìçu —ÜÍ÷îÝóC=%˜ —XŽ+Š¢(ÿ¿Xü?ɧ –?«¸ºžõŽ ý7òXØ£–× ÓqîC¯Т݂汲ë'«ølúëm ®Ñy³‹£cÝøFþg&8<,jmýy”Z>ââÉ^ú@ZËìÜÉÒaþ¿tËÔRO˜É=ïJÙAÉÇ*ÍÒTS½MØ%ͺËí4êÏ¿Ð~ÜjldõäÉ“±ÅG½}«kì¨înL³¦æ¤•² u/ìÅÓlÝø¿åÒœIxùüóϱjððeR°±0uN³Ä"Í+,7haÛÕ^w2?ɜ׊ÿçÆ‡êöç?ÿY¶Ýø³gÏ0#aþïîáÿn2o‚Gñ¡æÃbþ“ä´íÓÕáÿÌ5|{{›‰a¯ u—¦"ô›® Ë(層KŒ¤&îm¢Î¦•-ÓFX[%Ÿ÷ “hÌÛšIÝõoŠ?€<7]f4¸F7rÆÛ nffyvš`ʼÜ~EQåÿçÈÿQáj¡!œÎˆ¨ChÑç[·©3"9æ$ZÎ`tc)FJr-¢‚^vm1²†ú5Vmw{3"¥ ßÿ}[nsrÿÌ莄1ôíÃá‰kÈÿÑX Š.š¤zB‡nܸ1¡Mbé„)|¥Y´% ±ðÖÔ¯8Œ`f›õáÿÖúêÀa-é I¶ù$þèø$Æáœ´{ˆØ>ûk59Jï«Æÿ ºÈŒ:½àíSê}OôIÉPcbÔŒZ:{Zæ®\Î+¶±P\è\¼Ù¬ñ]H‚T#3ÿZjÈ}.ç#óþ‘ ,˜°# GgQn2õ£ËUQEQþRK°Ö;5/În,vØ£ ×6[ïsý¿ýÛ¿eT=õÞ>ÌëÈœ›‹ãúðh˜õŠ4ÄÌMLO ¸ª±Bõ ¨úuŒ@$­µ¹—ëÌ€¬¶³i’Yb±3¹Êúÿìg¦‡}{KK3P±M¼¡Ž›»Ëq“‹ô8˜4LWË ¹À,ÕÿS(àqƒÀ²4­GûûÀë ‰xùÅ—aŠ¢(ŠòÿÓc}ZÎÄ~µ„±Ày÷9wØmªj/y¬¶~ýÄ]âŠh8%AdHÔãëÆÿGdÒÿi!ìýzNªþ4\´„5Ú½¡~R?4s'Ý%¯îÚÆÿÅRÛ™ æ¥)yb¨s8©ý+lÇd‰T¯JÆ<0¡ðX?ý?Ö8Œ ‰!`ešÌ ™i§iÛT‚Ú›é’uœ„Ÿ6zåjêÿÇÂ`&½èU§Íâ«¢ÿÙrÒds2†cggÏz®wŒ É M/££ø"Ì øº‹°NÄ%¦(ÛŒ²ù7E`ïØÎQzï ¢éÎF¡¾·4DC$´S̨ýOQEùÿiB ë”Ý&Y½y‹–'WX¯¥ÅN%°«®s9 < ¬ˆKc×uãÿt‚-² lËñ@ÌcY¾³ öû‹‡©T¯òçæÿ²/äÖÖ–›«wÂ#;Æj@ÓçÑ”8û´_ô-éòAÜ»žö?žÉ’ãvww¿üòËñzH‡6ÍÁEi¬»ìè¡V$·—”¤&ÛLeÄΑS_µø?êUâçóNi&ðºÙ–^O+2¦%¸ÔcÄ"ãW{$±wßf÷Ê Ño¿éßG@öœœôüôñÇKî€ÏãæCe4ÐP}Œ'™ø}îdD~7ýÿ—¿üÅ%«’Ot”|EQEùÿ±áøØ8{j‘‚Û;š1ØÑ{qRàdË*ÁâƒÃæÛŸŽãõôÿÅéu¼øc7ÙUµ½—™p¼na6»s«Sí¹žöÿh#Mk3’y6Á¹®`YÓ’,,/6õr¨ü)ÇîZñÿJ|@~õ:ˆp5I…ÎfaŸˆÝvËÎ#rF+©ÿG{@—BžÅ„ 9¥†Hã`î\x£dÚˆÁÒp M`ãKù9râò<“¦þþ*ºv1vâìôQmQÍ/‘^ü Jͱš;pEQåÿ'Îÿ­ìò4.½"!›››S„º˜u\ëæ¹çDZæØ÷™N°58—‘EèDàÐ@SØóåÿšØZ¸V“5{Æ9?)L &Î}J¤'f!¶1S…°Y½üî8콻ğ\ظíjˆpÔ-¨ñy í­O\Y»åêâW˜°ffé’&t#4Îu"±ŽYítlª/¦ÃìîîúÅ$ôÐCÅö¹†÷Å<ŸÛ3cüh|6KÈžWËþEQEùÿ‰ÃzËÇ£s»ÿ¾Õ›éòéÜX'õé§Ÿ:â8_“WŒ~ÿçþǩʹ¦CíœÃ‹ÞÐO'Õêmõ¼e1ƒswú#•­i,–KL{†é³Ï>¡»~G<|øð¿ÿû¿æœ#ïu~gê`Û'‘4¥,+ÿOPè°aUn‘\>ØP »ýñz ÎeÐ-¶"óŒuÜ]{ax˜@n*Ñ¥ÎIA–¡_Qì§pJáza¹ËM”Ì.§µ÷jZ:èÄg¿øÓLEqýÔÌ¢(Š¢üÿ¡%Œ¥åFË1ú./”¦7'ná „Äs"¡SuóÏ}?hùOBDšûÙ æ19S50…:=¸'yûèÌÕíÍ 2{el;¿¹©×I˜<)›y¯Å›Ù¨ŠMÕ Ìúðy¡¨Ï?ÿ|>T×Ó:}E½½E…3ŠÚó­(Š¢(ÿ?=hUrPš± ‘ysNC9oWGGü>G½7.~äñt*äÁÓïï¤Hæ:~µýÙɃ#é`ggÇí…­©Îöü=)Ð kys¾’J¥s¼žyj™±¿;Ôöäü—ž¦ôXÄ;Š*þŒòß±¿}™æ\Œôêd¾Ë_?¿t)Šp~2úùä²¢Iëä_ËÃocêÝ՜ꪉÎûéëÿª(Š¢üÿRòÿIoÆbçN0)8OJïÚŸÝpâIž¯¿ÛD9îÞ½ûí·ß ’c˜$œ þ,’Æ+Îö©$8ÁÌáäd7È~Xž<'õé–¿ ýDìU¥{÷î™ÎÙ)€i|Rö?ãõtQ:¸Üq`ˆÞil…üaàw>Æÿy†Û¡Ù©Ò÷ çàÑ£Goj,"ÿŒ°#òOT”Ð$#a¨?Ù9âkþä}.‘ü¬Ãé­§üóUEQ”ÿ_zý¿õÞ¬¿âÿI9È¿szFÈ<ý|íȾ:áÜß{ï=¯Î,åß¡°!ϬCÜŽŒ¯hÇIu׉«è1¥8’ßetø 8¤^/^L„ü­µó-[Îqù™DÜ«y¯÷b؇J ˆúr]öøñc÷dŸ+ aÍÀ¿’úm¨ï”ˆ~)Ìê3HéNRÐ@ŽàÛ¬N!ÅNOÜå9fá¢(Š¢üÿ´—à f‚‘3«0VX`üO§Ð5ý;÷|¯^¸ïܹÃÒl ¡—~Ì„Nª2lH2ásgeÎhà\«ŒWJ@'u¼n÷>õùÙÃv8TfŠoaù44´”‰®{¹Ï/’·£y|h <9Ç"÷„ÿ´ŸÉƒE_++á Ñ3e¸¯'­àMO¯ažâÞ_*`1Кág¥qW~^ü8ʱSCãÿEQ”ÿŸêúk\ǯžbþ¬C’$ɘ‹Ÿ¬ªÜÁ÷’æ9»×â³ÑÇZ(“©ÁtœI–ÇIç ðü·ÕúýÄôÈ@%ç.§@䣓¥“4Joß¼yÓßÌÓ¦Dg2é›mE–³¡(™¬Ú'?J å*3íL¥’¹(Š¢(ŠòÿeˆN¤^Ǧ|Ð8†ØÎóçÏÿyN€Žç4⑺Ìèÿ½½½§OŸfÞ[α08UP%GÝÑ™“gØq¢vø™‰LŒWu¸uëBÇ2á'ú͹`@Ô?'»Y ™O´«±ï úÑG‘+Ê1œ©ÖÉœ!bggÇy¬ôÙÚÚZ¾fE^ŒébÝÎy—s÷î]=§8µu8š¢(Š¢(ÊÿßÈúÆ"m¥yžC4xYž l…ØI?YWYu‚³‚’àÕÇp9à뤺è´ÛËsÿë¿þËc¡ú`±À`™¥ŸF¾0‡.Ô³°xOñGâ åìáVûŸªýXr'Šõ&Ñ$ŒÀÀÓ"…3ÞNZ±oÅOŽ`ã(÷ÖùÛNÆCÀå«ÑБEQEQþ¿DÌ#è¥Ù>ØÝÝ…äªòïç8þ¡§at Ý‚ãݾ}›¡§C¶··¹êõäÉ“Œ{¿¢½c‘ÌÈ>3á˜Ì0OªœêÔÉÕ$€öÜ Oô'Ÿ|ò«óƒ[éØNpb¨pÂRi¸E§Éˆ7–v^4%ò‹‘xø:²…ÏaûüªËò®Lk•~²üJ Ýû÷﫞öÙé—¼(Š¢(ÊÿL%²7Bo):19å£?&5?wÝNƒç¨|•LŸ ôæ¹âctBž<³©¨Çq,)LsR”AYOü¹¨Ö766Ò^Å;#ž3ÿ÷ÿwŽï©j’³Q>ÙA™¦:D°­Ã'.Vº‘úÝùòË/§ÒœRíÆù¾@·¸ÔIÇœ£Š÷Tâ!¨ßhQEQ”ÿ=²Á7ß|c'S¯x¦mBÎQN‹]€ÓGÈuËq† ùÓŸþ4‘í3p&϶í=nß¾M(~þÌ̼'=”É0y­Ú°$sãàYÁ”8ñqùúë¯y„žå7îm>åV™üOAž®ées˜þ?ƒÏL·O‚ƒCƒ+RÕÓ«ºœ·®(Š¢(Šòÿ °‡ý¯+Iͳ&C#v$–%Zµ½½nª'ˆ 'žv™oè,[mµ61!{®'ƒu‚U‚vªÀÝÝÝÏ?ÿÜ=Ÿ‰MuàœhçÌþÙräöo½=æ«—H“ퟜ&Ãñy˜<“ÅŠ­Šé‚å8WT̉ ¦Ð©ê*ÿ‹¢(Š¢üÿˆÔZ€ÿÛ¡e/`˜0ÖÎç1"8ž“s,ÏÁ{”à‰pªLÐ3"'ÂiÊ7%E5¨§UÐ';ÿyÐÿgXK§7¢n盤Àb©ÃOqýÍoGlLØ|ÝBœé.g\2Ž·c)Ê+#>%lB<%ºkB­ Ãí©(œ%ÖC‰ßÄ$¬ùÀ6TÝψشòïÅõj)½dÃ'KùË EQEQ”ÿ¯@2>úHÜžæÃULÛDQ gBÁÓ™Û·oc!#~ ¥q°š$'xMêÀL&¯ÑI•£§è`kk+Í*N›ÿ«ÀgÏžQ Õ!k%®åí:DÕƒ ~üñÇ4D÷g{{ûÑ£G˜*©‹¨§áÄåÌ܈)*q€T_o æyÚüJ'»Î:N#öÜ›P<îê"ç) z’EEÊÉøEL0O ³k¢Ü{zøLŠDÑ9UþOF-»Z§»±Ûå œH œu ×kè «¥Ÿ$Ù_³».ßw)]”sLü_—©ÛtR\£®‹ØPèÌ”¹£(Š¢(Šòÿ€´^2)„Hié(Ÿ5½vŠÔÿ67“7⌊Bé J” އY;¼kcccooo;9™žªþŸ ª§*Á¸dবަ¦ùOA,Ñô•È0j £*‰Þ¹s'-|VèoÏFÿoÆ+bIÅTCÕŠ™ Rй‹­PÈe_ºQœS "ÆnÏfSN˜>ø@½¤øíØ×xó8è±÷Æ™èÿ-ëY ½CAë<÷з3š>™Ó@×ÓQú˜xQQÿCãuÖ;Azâ5¤ðÜà}ÁX¯-}¢ëÕuéº^EQEùÿ2ÒÅ‚ñþûïS}ssÓF/65çJ›$YµAÆÉñ~¥NZ·)è ³~zµdPÉO‰ÿSQMV5rç"c Azi\×;v=ÐðÃ\×ç-RÑ4QÄ4.ZÓæÿ*“¦AV=Än‹ÍW,ÑpKº$è^.ó]躑t,÷1>ù䞈.#v¤ æRÎææ&e>xðóyMëÉ™ b¢ÜØÆö?caî®ÞsBäSÕÿ§-–Ý‘y©û_ÿ3§«þ·ôªi”§éêoºF] ¦—c@¥·ˆç “Šð¼91Î&?uQEQ”ÿ_\ûûІY[&ûJ~gƒ·Œ…JÖ¢Äd±Ã%Ò‰8SJ×ó°ˆÎÐî§ÄÿU”§&³µ!Àfùs„¡Kòð)>¿Ûè¶13™J€“Üå„ bq>{þŸ©ÆŠÅmnnÂ[LTÖ 6½Æºæ¡2ߢ»n8Ô+ Øú€¸1ö]±YplÞ‹ˆ‘Ðòs-‚ ûì³ßüæ7)Þ¼y½7f0ÖQÿúüàºe «¢(Š¢(ŠòÿÕÈ$§c߆‡3ÿ\3ŒC\NpÜ]æ”nl­ ‘‡)óIÁêýçÏŸgDJó\ž¸nd[Õ^a4UEQEQþo @w2£[OE=©¤rí3{"€ÿ«ð—/_jôq5]ý'«üÿÇË?Ùm™ÿíó\€”ŠÃEFÚé¬(Š¢(Šòÿ£SJË©ø]`ëB=½p‚Zè7¡9UãÕt÷Äã 24 °,´×A,r¤M ­µÿ)Š¢(Š¢üÿ(dz:]V¥®¡ýÎ$ëdó¡¸H$~¢+Ö­¦ÐŽT{9Bé»ðêìX‡ÙÉGˆiÓ9/^¼8/ýÿXĽT`³”8‹¢(Š¢(ÊÿW@ìÎI]Áú½¦7®«zâqÎ'–»†û #"‘jŠž¬T¾ðjì ,kx#ÀYÎ éúí€Æ½/Š¢(Š¢üÿ€Ñ‘3u‚Êä&úæ~'ëªà†¯y$Ióä Ó°×¢cyŠ=‚Å®—Ÿ{Žñ?3 /¾É ZEQEùQEQEQåÿEQEQEQ”ÿEQEQEùùQEQEQ”ÿ—ÿEQEQEùùQEQEQ”ÿ—ÿEQEQEùùQEQEQ”ÿŸ,¾ûȚD §/^ü«(Þ¤Üzùò¥_œÌÌ»VÐü'—±&?¾âÝóБuZ“Šìù‚Žz+uà´€¿üòKGªxÇyÎìr:Èu˜íEQþx- Õ¯?~¼¹¹ùë¢xè¹{÷îÎÎÎíÛ·µO?ýTÿ¯á{½±±qýúuÕíÆTµÃW¼#®]»öÞ{ï}ûí·L3±£ï¿ÿíʹÁVÐô¾yóæ¯èHïø>úè#ýÿìٳŢüÿÂÙÿüðÃ(¬hæò´âÂAËAn*ýøã{{{k¨üßÚÚòÞ„HjÛ¢xhFÝ¿ÿåË—ÏŸ?·Žå¡wP5áÛîÙÎ&]Q¼#ôÙäÛ® /.a²TåÿkÎÿµ4èµå˜5âúõëÿ(Šw@n-ë)WªVz©µ„y [5ïï–‰¤ÙçnÿÆô¾ví~óÍ7|ü‹âذ]™fû/¿üâiVåÿëÏÿY›&[¾êÿ‹wŸW¶‚0„¸yóæ¾×ÉÓDÒj¿Zœ”\‰½½wÎ]/ O³R·ºŠw6âüžWl´gŠòÿõçÿ¶ CóñÖÖV5Å;êÿ‘%mcðÓO?­§\yíÚµeÎß,ÞbD’vùå£=_²ýâÅ >ïZ¹ÆboNT­#U¼ãwj¤y% ·Êÿ¢üÿbéÿ­¡û›wÏŸ?¯þ¿x÷÷…Õ!mŒwww×­ž"E7nÜÐ+ Åëûï¿§¶¶¢xܾ}A’µã ÍsøÿÚã*.Üwþ‡~Ðt‚3À%lN\åÿëïÿËr .dÿßF6+Þ1.“JÇh>±=XÃWÛµRUaþZÅ:‚Å;Îæ•&?Óé|Eáoݺ…‹ýGªx°©¤Ù…´›†ÄEQþ¿þü?-ÿY¤ÐÅU˜WH»ca ×%¬¸|óÊ5yï½÷r÷(:¯Š¢ü¿ü¿(ÿ/ÿ/Êÿ‹¢óª(Êÿ‹¢ü¿(Êÿ‹¢óª(ÿ/ÿ/Šòÿ¢(ÿ/Êÿ;¯Šòÿòÿ¢(ÿ/ÊÿËÿ‹òÿ¢(ÿ/ÿ/ÊÿËÓŠòÿò´¢ü¿(ÊÿËÿ‹òÿò´¢ü¿<­(ÿ/Šòÿòÿ¢ü¿ü¿(ÿ/O+Êÿ‹¢ü¿ü¿(ÿ/ÿ/ÊÿËÓŠòÿ¢(ÿ/ÿ/ÊÿËÿ‹Î«ò´¢óª(ÊÿËÿ‹òÿòÿ¢ü¿<­è¼*Šòÿòÿ¢óªü¿(ÿ/ŠÎ«¢(ÿ/ÿ/Êÿ;|EùQt^EùQ”ÿEùQt^åÿåÿEQþ_åÿEùQ”ÿ—ÿ}eÊÿ‹òÿòÿ¢ü¿(ÊÿËÿ‹òÿò´¢ü¿<­(ÿ/Šòÿòÿ¢ü¿<­(ÿ/O+Êÿ‹¢ü¿<­(ÿ/ÿ/ÊÿËÓŠòÿ¢(ÿ/ÿ/ÊÿËÿ‹òÿò´¢óª(ÊÿËÿ‹òÿòÿ¢óª<­è¼*Šòÿòÿ¢ü¿ü¿(ÿ/O+:¯Š¢ü¿ü¿(ÿ/ÿ/Êÿ‹¢óª(Êÿ;âEùQ”ÿEçUÑy^þ_åÿEQþ_WEùùQ”ÿEùQþ_åÿåÿE_™òÿ¢ü¿ü¿(ÿ/Šòÿòÿ¢ü¿<­(ÿ/O+Êÿ‹¢ü¿ü¿(ÿ/ÿ/ÊÿËÓŠòÿ¢(ÿ/O+ÊÿËÿ‹òÿò´¢ü¿(ÊÿËÿ‹òÿòÿ¢óª<­è¼*Šòÿòÿ¢ü¿ü¿è¼*O+:¯Š¢ü¿ü¿(ÿ/ÿ/Êÿ‹¢óª(ÊÿËÿ‹òÿòÿ¢ü¿(:¯Š¢ü¿(Êÿ‹¢ü¿(:¯Šòÿòÿ¢(ÿ/Šòÿ¢ùΫ¢ü¿ü¿(Êÿ‹¢ü¿(ÿ/Šòÿòÿ¢ü¿ü¿(ÿ/O+Êÿ‹¢ü¿ü¿(ÿ/O+ÊÿËÓŠòÿ¢(ÿ/ÿ/ÊÿËÿ‹òÿò´¢ü¿(Êÿ/"Oûå—_|üÓO?éC¡òy 'Y…Ÿþ¹¼«üÍyšæs¶ë‡~ÐÁ?þØù\\PþÿâÅ O]Íd&¹§ñ«W¯øtw@‹òÿ¢ü¿üÿèPiZMXD¦ó/_¾deaÑ)Êÿ/OÓdV[Dïù“ÙÛù\\Pþ/|ûí·H²“fæéÓ§)|÷ÝwÖ¢ü¿(ÿ/ÿ+)€ƒçÏŸëÿÇóÑ`w*ÕÅ¥üÿBð4OTÍ[5ʲmçsqáø¿Ž½EûàÁd ¾FÒwŠ¢ü¿(ÿ/ÿ#’}óÍ7ú5©8æNcåÿëÏÓþö·¿}%?ÌaMòÎçâ"ò‘¦4RÇšÉlhbçÅi‹òÿ¢ü¿üÿèxõê•©‘VõÞµk×òÛK°;P”ÿ¯-OCÛÿý÷ß…ž_·ß¹s§ó¹¸ˆü’~µÍçôÈw¹(Êÿ‹òÿòÿ£ m¡YJ(œ>dgY°ZQþ¿æ<ÍÆlžÌšäÏÅEäÿvïE˜½yó&šÿÛ·oëÊ —´«9ÑfQ”ÿåÿåÿGÄ“'Ol¡®‹]fþÔBÃsE™ê8Yþ¿æ< q! ³ß~ûíööv®zÏÅÅâÿ†¾É|œÑÒH.Ðe·nÝÒk›k_‡µ(ÿ/ÊÿËÿ{GâM¦®³ú êëׯ«=ê+ÿ¿<ÍVÐ7oÞL›ÿÎçâÂñØ>q~TaªêØV pݲަ(Êÿ‹òÿòÿ7‚ eñÿÍÍMÿi‰€þÌ åÿkÎÓl,!ú¤vqcçsqáø¿bÒ"d+MrÓþ´|+Šòÿ¢ü¿üÿäšD±¨IŸ={6Þ’ Ø&¨¿dùÿšó4[A›äÓ´Îçâ"òê¦ïó7R¶e>Ó ®Çç½(Êÿ‹òÿòÿ#B,Hœ{{[¤ˆe=’­5Dj~Éòÿ ÄÓ˜´ºLΑÔù\\8þ£úÍ›7—#ÖþíoãCm'÷ŽiQþ_”ÿ—ÿ6.åOLIs5ÙØØÐ£«,-ÿ_žÆ5Übsˆ—/_v>‘ÿ»ª#tþü¼zõÊnGÿ‹òÿ¢ü¿üÿm0í#Ûøß"½uëÖX8£åÿëÌÓô+ ,Ĉ˜Ãùçsq±øÿ·ß~{ãÆ „Y¿f²ØêLƒTBM€Šòÿ¢ü¿üÿm—Bk™öš¿þúë¼ (ÿ_[žöêÕ«ëׯ«E:€Þ/¯zÏÅEáÿ/_¾ÜÛÛÃ\MÿOJ~ýé ¯hQþ_”ÿ—ÿ¿~þùçÝÝ]-%ß}÷]êÿõÑÐI6X_,´(ÿ_[ž–\ˆKÐÎçâÂñÏUŸ|üø±.ÖLæÂ[}òÉ'<è˜åÿEùùÿñâÅ‹­­­ “.R¤G`,Ávó“'OFULåÿ§¥¥4íb ó¹¸ˆüß¶ý|¢³†ŽÒàËR{SåÿEùÿºñ6s3o£^O}Æóõtl‡ñzˆÎ\Þ¤ŒÌµãûï¿We666â+YSlMªê9jºJ°Õ´Î«ÌãÅðRe[£”A–A…mõ:Âß-kN)S·p»nE|l¥Þøç>®ÈbJ=ÙNœ«df;#’veIÎ9¶6ž™à¹êZå+05 _³TÂ,qÑ)™ ýèóyúuõü¼šóùmù¿%_zìD¢ByÂOÞ%.ü@G]_ìÙÎõ+æ3O±ûÉÎg•㙦c‹Hç;Ÿ—ßå∟&óõdCEåÿçÂÿóc¨ãï÷á÷ÔßO7ç믿Öÿ>ôŠ OºÞå·}®_ùo¾ùFÇþ8ß»wÏùRù>ó§Ù—×—>øÀWªz:v!˱éŽÞªŒ¿í+IüÒ´›¤N¹¤Òú>×_u=ƒZ¡óA9X— Ó©4÷p›=)¤Hë‰ÍH¥l›dÆcGçSÉ7nL‚[Tg˜ßªd]Éu똗`>«±yËQÈü•šÏo uˇ~ÈÁÔ·Ç W5 \94í)Ù3A8¤¿ŽùÎó+3Ss8eÃæ³¤Ëe3!·â¤æ³nT™<Yò¼æórŽ3•S‘öˆz?‹‡) Eùÿó>Åz%ó› ñ'îË/¿Ìg~÷X_Ð\½ø`&%&Î'Ÿ=èÑ£G2Ñk µÒ—V×ß¾}[Ee@u¾-ºfÅsWt…냤¯ÓŠrP¨øÍgMQýqüäÀ­àxueÔ±.9Ié?/)’QxÐ% žÔû(ú‘*AˆÉ'êdFŸaô{LNÎãœB5¸“á)ª_™Ì“âcé‹>ŸéUìÀNë|~[h2\¿~Ý ¦ÓñœA’À[àÕLH¢¥k49-½½Ïø´¹Ûµb>ëW=…»>|¨çîìì0aNd>§¨È»†ê¼æ³î(^äÎäÕ0©ØØØðP®Þš,ŠòÿSâÿùÉÍ=VU›/Ûò«˜9o±×”cØiP,/¾ \.'™R.Ž~®5´,ãòÎüc#ö—WóÉé̯°hã®ûZVèé‚7~÷¸ÀVC—8KÔòRk“˜DZ#àT¢§˜'xŒtžczžq41XQ+MT&†677‘2à<šQ&BÌ® =ŸWL×ÎçãAŒÈ^´þüêd‹{cÉÎÇ_x~ebx/Òb²ÿÄGóYb/;b‡ÍçiáãM9Áù<»¨GÙ6:íùŒ›³P]‰PÓi|”AT_i <ëÚoEùÿ¹ð«G¬×»éì7ß|ãåƒõbú$꽼ׯ_Ûçò/:Ðú⯑?îcâHþV«>êXv.|Ù±w`]-jÞY½Ðx+Üš^zïæÍ›ú]® ±êûŽß˜ìiòW 8¼ZêÁ¥ŽaW¶zª{2›ºäPÒÛËÏËfe–Rõ"¨@lZx5þú׿zì°\J#|›vO®t>ëbÜè‡ñ&è+8Ÿß 0"&ž¿ï‹ò^ZN~MƒTVsÒ³Wä¹íÙ®õ+_™åùŒ4‡h`s8­ '5ŸyÖdœÿÅ_œ×|öœ‹S]P¬Ú<Âjá«(ÊÿÏ&þ>_|!!Þ|6yO·¶¶ôÓææ¦ø‰øÇúÐé»çÏÝ1ì¼±ýª QIŒÍÄr"}m2ÙØ¯¶s8lýv:ìõ¹Ú^%uJTÑ1tž¼NI)Ó¾wŧÏ+Kª–'Î\Ö}a¯î¥q¢þ¿ž«*\ÅŠŸ?~ü˜?ÙLJ-è=eÂO Cä\|ä]«Ô”2”š~:Hq˜YíÆL"+vqçóÿ×Þ™ÿÆu]˜2IQ”h9r-/ÕÍŠ¢KZï²ö-râ¤)‚EäçE€ÄŽ¢]²dËKâlhж@Ñþ I[¶$“â:ûÎ!‡CR‹eE²­’¸ —×CëøjÈ¡Dr(©ïÃÁÅã›…oæyï»÷Ý{_^EC>Â$ã1ï·|žFþ»æuN¯ŠtéÒ%=ºJÚH>ËÛ.]ºÔµV»n+VVVêî^¹r¥íz«>È>’5=ôí»;æ³kÅön3Ïg«hä^ç*ŸÇ»«]€I¯ÚíèKË?àÿsëÿz„´ú¸œw´ #­¬ÃCuuµ76Ìs®ËPž GÑ©b—ä+ªªª²+¶zP•GÝ¡UîómŒ›,È ucô¨âvašvÓ„ÌÇ_DvéîîÖjÙ`·åGO¾º‘Ú¨ëžÙmó.\¸0ùÆØÈM;ËL{T`écªc ²CM<Š‚ €))r§ßÔÝ-ûN§a”¬5ÉJ‚©!hwÕªUÖª× úÇðnõ Ÿƒì2];Áé4nrÎë|Îí¨“½OÞþy_åóT‘/Vòʾ@ùЦ-ÿnvÉ>²á–úµkiCÚ­ªë9Ú€YoìÎÔ’6a’|vÂ[]£¸ù¬ô£e³ÙÉŸ<«ù,ŸT?—üÄôKcðïÝ#é$yeƒ°¸øÿ\ù¿µ>é‚5V{·:B‹)Éq²¢¢B‡€©K¸ÇƲi!ok Þí#¼ôÍm^ » s݃­½TLDí´µj’:ÉñÜZÆôÜ'²¤MÁ";Tþ‘l³:•M"á9ÓwëIV·\΃ò*}C»Œ2ÉìúýËkåP)ÏÔ—È.([ ØEymœ·ý8U ·Jwø¼¥ŸuxÐÒÌÇE·ÓöÈâ1t³%óµÌó­iQ²waä³–ú=Lî«÷[>OÝ5òýè·­93=UÖIŸ,ìzV^C½Z%oõŠ•ìëñÇaIK}mÞ˜Bù¬Ï´®õÚñ¦(ù¬ÿÚ¶MRQs•Ïöã²³˜¦4Ü‘eË–¹ûšFÀÿçÊÿ­W€Ÿ­ç¿m¼þé¶-_¾Ü8¦//Á[òã`M¾î\Í+îøÓI|Ì®V»CÒôl¥—ï=gbüûá'3÷ÿ²ÞÚiW¬lP¤µLÊy\íB۽ϑõˆ¾÷÷iš<Ÿóf+ÊûJupbq§…|ÌjëÚ›Z»m˜}ÝWùËVI56¯ƒ÷ï¾Ëƒ<÷ÿü¿DÚÿõJ®ÔÊõO½¬©ƒôõLqùòe«X?g}²vØÖ¹¼Jñýä -:¤TúÞÑÀžiÝ’g£R3aŒ¼†/k7ûu+\øÿôp¿py[w¤5ºz·Æk³¿ª‘½6•J×ÓŠ•ÏçÎÓíÔ_®MÛ¥<ç_Ñ·g| ù/?þ¸‰Ûâw¿åóœøÿøíšá:&E»kz·Ï»®½¥ÔÎüÚKÿÞxÚø|Öîyv¯ ÝN»m„Õdåi³ÑiäîóÙ½z«§ŒÉ;×þø Îÿãž ]IІDzåÊ•¢zp¶¯~Fk>*) t;6ÖØš}Üc¸|¨"ÎOXh{ìîfîp·+©"|ãÒ¬ú¿Ž¶°ïyÕªUn‹¨wûM~%Iä¡ÊÊJµ1ê¼Ä¸÷þ_(ì§'Él3™»¯Ò–òá‡.â<Û…Æczc³²X]ïªÚý“ÏsâÿBgg§}ç:ÄUJàÝjÿº…¦Íµå^ž=O›äø<þhlykíQz&*â†M#ŸeYÏ ZÉ¢ €ÿÌ/ÿw´Ú$®'hÛ~ùh-$6ã™ œ,Aÿ/4ÿ¡ugµ˜7!¡ü©Gõâ~¨;ÎǨÿÔíIëÞ”Ç,ÿŸùû»“²êÿÒL¶së `szè7¯ ìsâÿ“ç³=ª-¥â'n Y#u÷æ}ÅR¦;ÎÇèJþý–Ïsâÿº—µiz©zõÓm²¶Nbö£Ð¾.³êi“ä³;Ú»}æ.Ki­­w Ù)åsÞ¿–´/ ð Ïç…ÿË1ÖµP=}XOi•Rk'·ÞÅvX;Òè¤@¥F¡û¹boÓ‘åÝM~Â;]ÎÆö¸M£rÑó‹ìyf^kÒøÖ]üÿî‘,ÕÛXkWWròþ»Þ¨Èj…v³Z÷ލsÒÿg’|Önx®ò™5Ye–6)ï~Lz@poô©sæóœø^2»ß³Uo=§¥ZûyΉ§M˜Ï6 µVÉÝ ØvÊaÁhhNòÙ›FÀn&>ÉL€ÿþ_Êíÿî9Èeùòåfn‡L;}豸÷i*b“;NÁ6^;öŒ?øÈý\r`_¼xñLæ©›Òö¨¡MxÖ•Ræ »Àÿgx–ׯfðÐŽpJ”ˆœCÿ/”?555–-y¦d/ÔáÌE´÷סߧ֛lÞxY9þþž÷U>ωÿë7ï9÷³6Ç^±b…å¹Nûï¶r¨iëM÷ ýòã³5ÎèÍÈòZ«t΄âŸj>O8˜Úžø?çóÂÿmzäîîn;ðºOpïÃkŸK~Âr¦Ð£_i¶ÿ{·¦Â³³ŒMjª,§H›ÃÙ»ý.z*ºŸŒß»/ª}·ÚSÝNŽjžyM¾øÿTqïé)µ?½¤åú•›ó:¸Mk}V? n‰z”)d»¾¤è)¤ÃEu3¬N튙 ؼóyNü?ï%;E﹜Wõ³KºvýQódžßOŸÏz{>ïöid¥n˜¦´TØu³‹Þ¥íîóÙž?ùmËÿü¿dý_›}ôîív^ÐGޡϺXã¿·giªœ¢øžë<*öîMíÍLìt£¨·ƒ)®ÔÚK•¼Ñú4›ÊÛÝTüzØ™Ýò6oGäU÷t{túÝ}6î½÷ÿBù#ë{ì1­›hò¸ž«5¹S¸ ÷FN&óöU¸Ik½­î·|žÿ××Ê~w*î¨UYcÚ¬©â&w«­{¶=m’ã¡Ý¡/ºý6I©WÔñ¿SÍgí¤Ú<¥ôgÃÿ¼yÛÿ§<íÞœjÝ›­¾cêã’ÿ—”§ ÷r•ú‰Îgk¤|ðAYoÓL‘f Ûÿç»§¹í3v#x{ÔnÉ­ÇíâŽÏüÿ_Øþ¯§9þhOî€TVVÊùùÇÿKßÓÔ…ªªªìr¶^ÛuÝksÜjÿŸžfIëŽ Ðöv=&¸Ó™þ€ÿãÿwÄÚEu›u°›üyþüy}‚—l6T®çâÿ¥ïÿæKÖÙC{: ׯ__±b…®§±ÿ/}OÓ¤µÉÖ×T«²16C²ÎÕCÚàÿø?þ÷þ/gëeêÝÞ.ª§ž¢÷ÿü6P·)Ò!í:eŠ5VWWËÜ5€ÿÏ Os¯[iöž;wî‘G‘CwÑ'ÿüÿ_ðþ¯Ø¤è²ñjPW®\ÑÛâ¸ýK9Ëàÿ¥ïiòuI>ÿ®zzz¤’ks2Øÿ/}O³N˜šÏ¹\NïÏ¢íÿÖh£— ÈüÿÇÿ§Á£>šw‹L»›ª{gLÀÿKÖÓì*[¥É¬·9“úìã?n&¥“š’fø‰{šf©þöÝJ«¬éïï—AÞäÿÀÿñÿ;"[«Ã~åSÈyD·\N+Ë–-“ÝTUUeséÜÎd2þ_Êž¦nïÖ^uA¾:)µƒ´{·>Ò ÿ/eOÓ¹IõÿÞ¼ySë:í;ÈeüÌü€ÿàÿxÚ±^ÓªI‚Ž Ð.@ÞíS=þ_²žf ¤]×ôPcUW·Á¿è7KüöÎr@®®®önÝ’Þw§÷–Ü€ÿàÿxàÿ÷§þ¿Àš^¿+ÁvZ˜_|úé§¶|ýúu]¨®®.MOs]H$ö(–ÿ+sÞ"Ú××§Õ[Ý*IxÙ$ª0ó¼Òܶڮwû5/ü¿”ýßôlx ý-ÌÍ(W0ºººjjjJíw}íÚµ'žxÂm˜Õ*0{fÂåË—¿üå/‹éè*oìºêܶÿËÆÈﱪªêÊ•+nû-ÀLŽóâÿ’ZÚgøÒ¥K¸"àÿóÈÿELØÔÙ{ì±r€P6ŽU«V•`ÿíÿ¿lÙ2ÝÈåË—ë{fžÿ===%’çZ—Z‰¤ú’%Któ$óÙSP”ã¼Ô+mð¯¤Æøéû¿ÛB+•wý _¼xq`xã:÷öööõõ•àOûÌ™3öÓ¶áðìA˜aþ«ü_»vͼ¨ú•}òÉ'n¯$öÌ0Ïõ*’Û%çé< øÿ|ñíªwýúuû€¥)i0¿°. W¯^Uÿ±nf%¸Ú…Õºj¸—æW6©‚ü9çIe­²²1¥ùc„y‡Û-ÏÕ"˜ðÿù5þðüÿÀÿñüÿÀÿñüÿÀÿÿüðÀÿÿÀÿñüÿÀÿñüÿÀÿñüðÀÿÿüÿÇÿðüÿÇÿðüÿÇÿðÀÿÿüfæÿÃwò~ÿ˜ÿ?;æÿ-ø?ÀüöÿÛ´ÿ‹hM|þÐ჻6®{: Å#Mø?ÀB÷ÿùÿÀÿñüÿ(1ÿÿ|ïøpÆÿîÿbü/þÿàÿø?þ³J__Ÿ. ‰ÿ———755‰ÿ'"ÁxÄß–ŠÆÂ¾t2 µ´&©xHþ<{ª£¥±VÖ¼ýÆ¡5Ï?%ë3é8þ0_8s挔ec¤Óéö½ºo÷‘Ãû÷îzåÍ×îÙùò¯Ø¿gÇ¡»w¼ü½¿yX~ñÓ·dýÖMkÛ[cáóÿÌ>ûì3]¸xñâÊ•+kjjÖ­[·iÓ†—¶o}që¦í[6~uó†¯mÛ¬Ë[6¬ýÖK/ʲijO~EÖ¬~æÉ¯)ˆâÿó…K—.y·Úÿe!‹ôö\‹}ÞÈàû¿û”u'¼ÁþöT\ʺãïËš®Lz¨ÿ¦”§²íñpÿ(}r¹œ. .Y²¤¦¦¦¶¶¶»»3ÓšêH'C¾&)¥" ž/e,äÕ?öTs}­Ô¤Ü¾eãG§:½÷ø?@é3<<<22244$Ë‹/.++ }}7½‘aodp4û?_Éõ Üìì»!Ë7®^úïÿü÷'ÿòÏ|'/~|ÿ˜/ x·úÿtwwçrý©X4 '"A·LFCçÏž 47Dƒ>Sýk÷mÛ´¾5‘õɘßóúÇü?<Þÿµ `%Ì!ƒƒƒ###åååñx|h('Â/’ßÙÞö7Kò5eZ²Rþ”õéä©lû=;7®]ÝÝÑ&ÆcAÏËÅ¢AÇÿ‡ok÷WÐ wAAASˆ‰)xÿ¯h(jéhK„Mñˆÿ£ÓY½@"Ȥ㲠+ܳyà m©¨,Çc!©Fäû^À­ àÿAAQ2þß\_{íòÅÆ“ÇÅí#Áf)CþF1©dÛ“RÆÂ¾_ýò-×øšêÚ[cÓòÿ)ÌœBþŸimù//+«ª({ø¡¥²°byµ”.­ú:±§Æ£?tº3óÎ[G^Ý¿kÂØ¿gÇáƒ{~ñÓ·ŽÞ¿o÷ׯyöTg[Kcm*ê êC¡F‘ÿEc’¯ …xï7òhüé…Žý­¼-þOAA³,ÿ_¬÷5Õ¶ÞGCûvíØ¶i}:íH'‡zëNͤã–zõÿªŠ2û¿qªþ__ûÁkŸ-©,«XT¶byu,ìk¨;&•üŸ ‚ ‚ î½ÿŸ;Ó)þ ùß|íÕkW{#ƒa³”ÙödG[B·¯©®ÐÖûÏvMÕÿµú`!5y©VàÿAAqïý¿¡î˜XzG:¹÷^ܺ©é䇧;3#¹>qx qû–ÆÚʾø©ú¿<*•ˆ¥U<²¢fqyY&—•A_þOAA÷Þÿ?>Û5Úȼ}äðºÕÏz#ƒþ¦z)ÛRQ©èÜ>‹Ê¤ PU1öÿXØ'ï4-_&ú_¦Ï{üŸ ‚ ‚ îµÿ7ž<.BžmKسsÛ¦õ¾Æ“í­#¹>õÓ]íMõ'2鸘ÿ#+jêk?hi¬ªÿ··ÆäNu¶E‚ÍâÿRºóÿAAÄœø¿Hþh/ýdìí#‡Gûÿ Dƒ>odP¼ýÄ¿»ðñiyT¼½¹áËçψêOÕÿåO)¥‘mOÊzyfWGëØóñ‚ ‚ ‚¸×þò7FC-éDôÕ}»7¬y¾+“ND‚ý¢èÎj[½Ôº³éÆ“ÇÕó'ôÿ@K½8¿ÊÐ× Ëm©h¡û„üõÝÙÔžß—ñÿX¸9jʶÇÙSAA1{þŸIÇÅÞƒ-o>¸mÓzohà“óõö\)äím ©H­¡3“:t`·ø$Ø ûÄö‡s7¥mOJeÁõ¾¦ºBï#Â/ñæëûÏéè½þYWGRü¿ñäì)‚ ‚ ‚˜=ÿKŸ?Û=|`ïW7oh¨= ´x#ƒ…¼]* ò½.ðã7oߺA^®õ‚Þë—î”<úá±wõËwÞyûu‰×í›0öïyå­#öîúA݉wÞûÚ«»åÏŸýDž¿‡ ‚ ‚ ˆÇ.'¾XÿÚ«{÷îzåÀž{wþðÛó’˜ÿ‡¼÷æk¯òö{tèÀî_þìíŸ¿óæŽ—¿·mó:©´4ÖÆÂ>ÏË5ž<. ßúÆöo|mëŸüñ}}ûæ-×L_ß¾qíê'%¾ûOßyê¯þtûÖu›7<¿aí3[6®&‚ ‚ bÆñœ_¬ß°ö¹þ‡ï¬yîéu«ŸÝ¶i}È×ôÝüûçŸþëBÞþÕ-ë7­_½î…gÖ¯yVþüæ×·µ&Â]­™t|d°÷Tg›,} R#ОBzñ‘m‡üõ­‰`8Ð ÑÑ‹†šbáæT<@AAÄŒÃçÄëE×ß÷×çÏžJFCÍõµéD4Û– û› y»ND§»ÚÅóëN•íçïy¹@K}[*ø»³éÎL*äoœ¤ÿ2æÿôÂÑ~‘ÿt2$k:3 zjAAÄìõÿ÷7ŸUúT\äÿ¹3™Ö„¯ñdG:YÈÛ3鸸½x~G[Bô>ŒH BÊÿëXË endstream endobj 140 0 obj 185942 endobj 142 0 obj << /Length 141 0 R /N 3 /Alternate /DeviceRGB /Filter /FlateDecode >> stream xÚ}’OHQÇ¿³%B¬e&RðN¶Wí`ŒÝõoʶ¬k¦²Î¾ÙÞÌn%Bˆ.AÖ1ºXÑI:†‚b]"è(‚—í73»îˆÚƒ7ï3¿ÿ¿ß{@](mšz€yÃÉþ(»;>Áê7P‡A+­Xf$‘v™lqdí}…䜛áãõÿ] ‚U€Æ¬ÇמöxÀáû¶iO:¬äÒb“¸M¤’1âWÄg³>žöq†[ ñ2ñMÅ'"()Y'æ±ld4ƒä—‰»2–’'&ßÀSg^™öÐ}8õ¹&›°€åwÀ¥Öš,Ô \V:k²Ý¤;©iÝR;;\‘Œu?ÊåÝV þ°ÿ¼\þûº\ÞC9¾u¥(J•IÒÀëÃ]ýÜàBS˜s_ QP5ûFz¼Úë׋Gõ%«t{3qW°D÷0vz ¼ü \}\ø$€Ôu¡ºmþÀÍ+˜…–ÍÙ¬C–;XØ9:Y„^g±BÞ,Ú\°ACioci]g®©Å·¸(ñL;òz±Úï9ÚAnŒŽÐIó ¨Üê­°4“I÷ÐÝ x#Ã{zwA¼¨j}ƒÎ…Ðþ¤Š¾Q¥óš=˜ò8Ðmèñá Ã(Äo{1±cÚÑd5¾Ué­ÊgÒ·t¶üÆlaȱi"ßÐ\.5æ±”šËÅâ^Å8tph0èk€!‰~D† TÒhd¡‘”»6‚ØÂì±–:>f¤ß&Ÿm×çŠäíxÝA4Ž…¶ƒLþ&ÿ–·ä%ù­ük±¥ªiÄ”¦¬?ûCqÌÕ¸m¥&/¾By#¤Õ‘%iþ 'ËW©¯:ÕXl©Errð'ñ=_—Ü—)Œi7Ò¬›©äê,úF|ÙNšٮͯ6×rm^™Ü ®ÍšUáHWü «Ãÿ5;¿?ÿͰh endstream endobj 141 0 obj 706 endobj 56 0 obj [ /ICCBased 142 0 R ] endobj 144 0 obj << /Length 143 0 R /N 3 /Alternate /DeviceRGB /Filter /FlateDecode >> stream xÚ}’OHQÇ¿³%B¬e&RðN¶Wí`ŒÝõoʶ¬k¦²Î¾ÙÞÌn%Bˆ.AÖ1ºXÑI:†‚b]"è(‚—í73»îˆÚƒ7ï3¿ÿ¿ß{@](mšz€yÃÉþ(»;>Áê7P‡A+­Xf$‘v™lqdí}…䜛áãõÿ] ‚U€Æ¬ÇמöxÀáû¶iO:¬äÒb“¸M¤’1âWÄg³>žöq†[ ñ2ñMÅ'"()Y'æ±ld4ƒä—‰»2–’'&ßÀSg^™öÐ}8õ¹&›°€åwÀ¥Öš,Ô \V:k²Ý¤;©iÝR;;\‘Œu?ÊåÝV þ°ÿ¼\þûº\ÞC9¾u¥(J•IÒÀëÃ]ýÜàBS˜s_ QP5ûFz¼Úë׋Gõ%«t{3qW°D÷0vz ¼ü \}\ø$€Ôu¡ºmþÀÍ+˜…–ÍÙ¬C–;XØ9:Y„^g±BÞ,Ú\°ACioci]g®©Å·¸(ñL;òz±Úï9ÚAnŒŽÐIó ¨Üê­°4“I÷ÐÝ x#Ã{zwA¼¨j}ƒÎ…Ðþ¤Š¾Q¥óš=˜ò8Ðmèñá Ã(Äo{1±cÚÑd5¾Ué­ÊgÒ·t¶üÆlaȱi"ßÐ\.5æ±”šËÅâ^Å8tph0èk€!‰~D† TÒhd¡‘”»6‚ØÂì±–:>f¤ß&Ÿm×çŠäíxÝA4Ž…¶ƒLþ&ÿ–·ä%ù­ük±¥ªiÄ”¦¬?ûCqÌÕ¸m¥&/¾By#¤Õ‘%iþ 'ËW©¯:ÕXl©Errð'ñ=_—Ü—)Œi7Ò¬›©äê,úF|ÙNšٮͯ6×rm^™Ü ®ÍšUáHWü «Ãÿ5;¿?ÿͰh endstream endobj 143 0 obj 706 endobj 64 0 obj [ /ICCBased 144 0 R ] endobj 146 0 obj << /Length 145 0 R /N 3 /Alternate /DeviceRGB /Filter /FlateDecode >> stream xÚ}’OHQÇ¿³%B¬e&RðN¶Wí`ŒÝõoʶ¬k¦²Î¾ÙÞÌn%Bˆ.AÖ1ºXÑI:†‚b]"è(‚—í73»îˆÚƒ7ï3¿ÿ¿ß{@](mšz€yÃÉþ(»;>Áê7P‡A+­Xf$‘v™lqdí}…䜛áãõÿ] ‚U€Æ¬ÇמöxÀáû¶iO:¬äÒb“¸M¤’1âWÄg³>žöq†[ ñ2ñMÅ'"()Y'æ±ld4ƒä—‰»2–’'&ßÀSg^™öÐ}8õ¹&›°€åwÀ¥Öš,Ô \V:k²Ý¤;©iÝR;;\‘Œu?ÊåÝV þ°ÿ¼\þûº\ÞC9¾u¥(J•IÒÀëÃ]ýÜàBS˜s_ QP5ûFz¼Úë׋Gõ%«t{3qW°D÷0vz ¼ü \}\ø$€Ôu¡ºmþÀÍ+˜…–ÍÙ¬C–;XØ9:Y„^g±BÞ,Ú\°ACioci]g®©Å·¸(ñL;òz±Úï9ÚAnŒŽÐIó ¨Üê­°4“I÷ÐÝ x#Ã{zwA¼¨j}ƒÎ…Ðþ¤Š¾Q¥óš=˜ò8Ðmèñá Ã(Äo{1±cÚÑd5¾Ué­ÊgÒ·t¶üÆlaȱi"ßÐ\.5æ±”šËÅâ^Å8tph0èk€!‰~D† TÒhd¡‘”»6‚ØÂì±–:>f¤ß&Ÿm×çŠäíxÝA4Ž…¶ƒLþ&ÿ–·ä%ù­ük±¥ªiÄ”¦¬?ûCqÌÕ¸m¥&/¾By#¤Õ‘%iþ 'ËW©¯:ÕXl©Errð'ñ=_—Ü—)Œi7Ò¬›©äê,úF|ÙNšٮͯ6×rm^™Ü ®ÍšUáHWü «Ãÿ5;¿?ÿͰh endstream endobj 145 0 obj 706 endobj 126 0 obj [ /ICCBased 146 0 R ] endobj 148 0 obj << /Length 147 0 R /N 3 /Alternate /DeviceRGB /Filter /FlateDecode >> stream xÚ}’OHQÇ¿³%B¬e&RðN¶Wí`ŒÝõoʶ¬k¦²Î¾ÙÞÌn%Bˆ.AÖ1ºXÑI:†‚b]"è(‚—í73»îˆÚƒ7ï3¿ÿ¿ß{@](mšz€yÃÉþ(»;>Áê7P‡A+­Xf$‘v™lqdí}…䜛áãõÿ] ‚U€Æ¬ÇמöxÀáû¶iO:¬äÒb“¸M¤’1âWÄg³>žöq†[ ñ2ñMÅ'"()Y'æ±ld4ƒä—‰»2–’'&ßÀSg^™öÐ}8õ¹&›°€åwÀ¥Öš,Ô \V:k²Ý¤;©iÝR;;\‘Œu?ÊåÝV þ°ÿ¼\þûº\ÞC9¾u¥(J•IÒÀëÃ]ýÜàBS˜s_ QP5ûFz¼Úë׋Gõ%«t{3qW°D÷0vz ¼ü \}\ø$€Ôu¡ºmþÀÍ+˜…–ÍÙ¬C–;XØ9:Y„^g±BÞ,Ú\°ACioci]g®©Å·¸(ñL;òz±Úï9ÚAnŒŽÐIó ¨Üê­°4“I÷ÐÝ x#Ã{zwA¼¨j}ƒÎ…Ðþ¤Š¾Q¥óš=˜ò8Ðmèñá Ã(Äo{1±cÚÑd5¾Ué­ÊgÒ·t¶üÆlaȱi"ßÐ\.5æ±”šËÅâ^Å8tph0èk€!‰~D† TÒhd¡‘”»6‚ØÂì±–:>f¤ß&Ÿm×çŠäíxÝA4Ž…¶ƒLþ&ÿ–·ä%ù­ük±¥ªiÄ”¦¬?ûCqÌÕ¸m¥&/¾By#¤Õ‘%iþ 'ËW©¯:ÕXl©Errð'ñ=_—Ü—)Œi7Ò¬›©äê,úF|ÙNšٮͯ6×rm^™Ü ®ÍšUáHWü «Ãÿ5;¿?ÿͰh endstream endobj 147 0 obj 706 endobj 133 0 obj [ /ICCBased 148 0 R ] endobj 150 0 obj << /Length 149 0 R /N 3 /Alternate /DeviceRGB /Filter /FlateDecode >> stream xÚ}’OHQÇ¿³%B¬e&RðN¶Wí`ŒÝõoʶ¬k¦²Î¾ÙÞÌn%Bˆ.AÖ1ºXÑI:†‚b]"è(‚—í73»îˆÚƒ7ï3¿ÿ¿ß{@](mšz€yÃÉþ(»;>Áê7P‡A+­Xf$‘v™lqdí}…䜛áãõÿ] ‚U€Æ¬ÇמöxÀáû¶iO:¬äÒb“¸M¤’1âWÄg³>žöq†[ ñ2ñMÅ'"()Y'æ±ld4ƒä—‰»2–’'&ßÀSg^™öÐ}8õ¹&›°€åwÀ¥Öš,Ô \V:k²Ý¤;©iÝR;;\‘Œu?ÊåÝV þ°ÿ¼\þûº\ÞC9¾u¥(J•IÒÀëÃ]ýÜàBS˜s_ QP5ûFz¼Úë׋Gõ%«t{3qW°D÷0vz ¼ü \}\ø$€Ôu¡ºmþÀÍ+˜…–ÍÙ¬C–;XØ9:Y„^g±BÞ,Ú\°ACioci]g®©Å·¸(ñL;òz±Úï9ÚAnŒŽÐIó ¨Üê­°4“I÷ÐÝ x#Ã{zwA¼¨j}ƒÎ…Ðþ¤Š¾Q¥óš=˜ò8Ðmèñá Ã(Äo{1±cÚÑd5¾Ué­ÊgÒ·t¶üÆlaȱi"ßÐ\.5æ±”šËÅâ^Å8tph0èk€!‰~D† TÒhd¡‘”»6‚ØÂì±–:>f¤ß&Ÿm×çŠäíxÝA4Ž…¶ƒLþ&ÿ–·ä%ù­ük±¥ªiÄ”¦¬?ûCqÌÕ¸m¥&/¾By#¤Õ‘%iþ 'ËW©¯:ÕXl©Errð'ñ=_—Ü—)Œi7Ò¬›©äê,úF|ÙNšٮͯ6×rm^™Ü ®ÍšUáHWü «Ãÿ5;¿?ÿͰh endstream endobj 149 0 obj 706 endobj 87 0 obj [ /ICCBased 150 0 R ] endobj 152 0 obj << /Length 151 0 R /N 3 /Alternate /DeviceRGB /Filter /FlateDecode >> stream xÚ}’OHQÇ¿³%B¬e&RðN¶Wí`ŒÝõoʶ¬k¦²Î¾ÙÞÌn%Bˆ.AÖ1ºXÑI:†‚b]"è(‚—í73»îˆÚƒ7ï3¿ÿ¿ß{@](mšz€yÃÉþ(»;>Áê7P‡A+­Xf$‘v™lqdí}…䜛áãõÿ] ‚U€Æ¬ÇמöxÀáû¶iO:¬äÒb“¸M¤’1âWÄg³>žöq†[ ñ2ñMÅ'"()Y'æ±ld4ƒä—‰»2–’'&ßÀSg^™öÐ}8õ¹&›°€åwÀ¥Öš,Ô \V:k²Ý¤;©iÝR;;\‘Œu?ÊåÝV þ°ÿ¼\þûº\ÞC9¾u¥(J•IÒÀëÃ]ýÜàBS˜s_ QP5ûFz¼Úë׋Gõ%«t{3qW°D÷0vz ¼ü \}\ø$€Ôu¡ºmþÀÍ+˜…–ÍÙ¬C–;XØ9:Y„^g±BÞ,Ú\°ACioci]g®©Å·¸(ñL;òz±Úï9ÚAnŒŽÐIó ¨Üê­°4“I÷ÐÝ x#Ã{zwA¼¨j}ƒÎ…Ðþ¤Š¾Q¥óš=˜ò8Ðmèñá Ã(Äo{1±cÚÑd5¾Ué­ÊgÒ·t¶üÆlaȱi"ßÐ\.5æ±”šËÅâ^Å8tph0èk€!‰~D† TÒhd¡‘”»6‚ØÂì±–:>f¤ß&Ÿm×çŠäíxÝA4Ž…¶ƒLþ&ÿ–·ä%ù­ük±¥ªiÄ”¦¬?ûCqÌÕ¸m¥&/¾By#¤Õ‘%iþ 'ËW©¯:ÕXl©Errð'ñ=_—Ü—)Œi7Ò¬›©äê,úF|ÙNšٮͯ6×rm^™Ü ®ÍšUáHWü «Ãÿ5;¿?ÿͰh endstream endobj 151 0 obj 706 endobj 71 0 obj [ /ICCBased 152 0 R ] endobj 154 0 obj << /Length 153 0 R /N 3 /Alternate /DeviceRGB /Filter /FlateDecode >> stream xÚ}’OHQÇ¿³%B¬e&RðN¶Wí`ŒÝõoʶ¬k¦²Î¾ÙÞÌn%Bˆ.AÖ1ºXÑI:†‚b]"è(‚—í73»îˆÚƒ7ï3¿ÿ¿ß{@](mšz€yÃÉþ(»;>Áê7P‡A+­Xf$‘v™lqdí}…䜛áãõÿ] ‚U€Æ¬ÇמöxÀáû¶iO:¬äÒb“¸M¤’1âWÄg³>žöq†[ ñ2ñMÅ'"()Y'æ±ld4ƒä—‰»2–’'&ßÀSg^™öÐ}8õ¹&›°€åwÀ¥Öš,Ô \V:k²Ý¤;©iÝR;;\‘Œu?ÊåÝV þ°ÿ¼\þûº\ÞC9¾u¥(J•IÒÀëÃ]ýÜàBS˜s_ QP5ûFz¼Úë׋Gõ%«t{3qW°D÷0vz ¼ü \}\ø$€Ôu¡ºmþÀÍ+˜…–ÍÙ¬C–;XØ9:Y„^g±BÞ,Ú\°ACioci]g®©Å·¸(ñL;òz±Úï9ÚAnŒŽÐIó ¨Üê­°4“I÷ÐÝ x#Ã{zwA¼¨j}ƒÎ…Ðþ¤Š¾Q¥óš=˜ò8Ðmèñá Ã(Äo{1±cÚÑd5¾Ué­ÊgÒ·t¶üÆlaȱi"ßÐ\.5æ±”šËÅâ^Å8tph0èk€!‰~D† TÒhd¡‘”»6‚ØÂì±–:>f¤ß&Ÿm×çŠäíxÝA4Ž…¶ƒLþ&ÿ–·ä%ù­ük±¥ªiÄ”¦¬?ûCqÌÕ¸m¥&/¾By#¤Õ‘%iþ 'ËW©¯:ÕXl©Errð'ñ=_—Ü—)Œi7Ò¬›©äê,úF|ÙNšٮͯ6×rm^™Ü ®ÍšUáHWü «Ãÿ5;¿?ÿͰh endstream endobj 153 0 obj 706 endobj 118 0 obj [ /ICCBased 154 0 R ] endobj 156 0 obj << /Length 155 0 R /N 3 /Alternate /DeviceRGB /Filter /FlateDecode >> stream xÚ}’OHQÇ¿³%B¬e&RðN¶Wí`ŒÝõoʶ¬k¦²Î¾ÙÞÌn%Bˆ.AÖ1ºXÑI:†‚b]"è(‚—í73»îˆÚƒ7ï3¿ÿ¿ß{@](mšz€yÃÉþ(»;>Áê7P‡A+­Xf$‘v™lqdí}…䜛áãõÿ] ‚U€Æ¬ÇמöxÀáû¶iO:¬äÒb“¸M¤’1âWÄg³>žöq†[ ñ2ñMÅ'"()Y'æ±ld4ƒä—‰»2–’'&ßÀSg^™öÐ}8õ¹&›°€åwÀ¥Öš,Ô \V:k²Ý¤;©iÝR;;\‘Œu?ÊåÝV þ°ÿ¼\þûº\ÞC9¾u¥(J•IÒÀëÃ]ýÜàBS˜s_ QP5ûFz¼Úë׋Gõ%«t{3qW°D÷0vz ¼ü \}\ø$€Ôu¡ºmþÀÍ+˜…–ÍÙ¬C–;XØ9:Y„^g±BÞ,Ú\°ACioci]g®©Å·¸(ñL;òz±Úï9ÚAnŒŽÐIó ¨Üê­°4“I÷ÐÝ x#Ã{zwA¼¨j}ƒÎ…Ðþ¤Š¾Q¥óš=˜ò8Ðmèñá Ã(Äo{1±cÚÑd5¾Ué­ÊgÒ·t¶üÆlaȱi"ßÐ\.5æ±”šËÅâ^Å8tph0èk€!‰~D† TÒhd¡‘”»6‚ØÂì±–:>f¤ß&Ÿm×çŠäíxÝA4Ž…¶ƒLþ&ÿ–·ä%ù­ük±¥ªiÄ”¦¬?ûCqÌÕ¸m¥&/¾By#¤Õ‘%iþ 'ËW©¯:ÕXl©Errð'ñ=_—Ü—)Œi7Ò¬›©äê,úF|ÙNšٮͯ6×rm^™Ü ®ÍšUáHWü «Ãÿ5;¿?ÿͰh endstream endobj 155 0 obj 706 endobj 79 0 obj [ /ICCBased 156 0 R ] endobj 158 0 obj << /Length 157 0 R /N 3 /Alternate /DeviceRGB /Filter /FlateDecode >> stream xÚ}’OHQÇ¿³%B¬e&RðN¶Wí`ŒÝõoʶ¬k¦²Î¾ÙÞÌn%Bˆ.AÖ1ºXÑI:†‚b]"è(‚—í73»îˆÚƒ7ï3¿ÿ¿ß{@](mšz€yÃÉþ(»;>Áê7P‡A+­Xf$‘v™lqdí}…䜛áãõÿ] ‚U€Æ¬ÇמöxÀáû¶iO:¬äÒb“¸M¤’1âWÄg³>žöq†[ ñ2ñMÅ'"()Y'æ±ld4ƒä—‰»2–’'&ßÀSg^™öÐ}8õ¹&›°€åwÀ¥Öš,Ô \V:k²Ý¤;©iÝR;;\‘Œu?ÊåÝV þ°ÿ¼\þûº\ÞC9¾u¥(J•IÒÀëÃ]ýÜàBS˜s_ QP5ûFz¼Úë׋Gõ%«t{3qW°D÷0vz ¼ü \}\ø$€Ôu¡ºmþÀÍ+˜…–ÍÙ¬C–;XØ9:Y„^g±BÞ,Ú\°ACioci]g®©Å·¸(ñL;òz±Úï9ÚAnŒŽÐIó ¨Üê­°4“I÷ÐÝ x#Ã{zwA¼¨j}ƒÎ…Ðþ¤Š¾Q¥óš=˜ò8Ðmèñá Ã(Äo{1±cÚÑd5¾Ué­ÊgÒ·t¶üÆlaȱi"ßÐ\.5æ±”šËÅâ^Å8tph0èk€!‰~D† TÒhd¡‘”»6‚ØÂì±–:>f¤ß&Ÿm×çŠäíxÝA4Ž…¶ƒLþ&ÿ–·ä%ù­ük±¥ªiÄ”¦¬?ûCqÌÕ¸m¥&/¾By#¤Õ‘%iþ 'ËW©¯:ÕXl©Errð'ñ=_—Ü—)Œi7Ò¬›©äê,úF|ÙNšٮͯ6×rm^™Ü ®ÍšUáHWü «Ãÿ5;¿?ÿͰh endstream endobj 157 0 obj 706 endobj 111 0 obj [ /ICCBased 158 0 R ] endobj 160 0 obj << /Length 159 0 R /N 3 /Alternate /DeviceRGB /Filter /FlateDecode >> stream xÚ}’OHQÇ¿³%B¬e&RðN¶Wí`ŒÝõoʶ¬k¦²Î¾ÙÞÌn%Bˆ.AÖ1ºXÑI:†‚b]"è(‚—í73»îˆÚƒ7ï3¿ÿ¿ß{@](mšz€yÃÉþ(»;>Áê7P‡A+­Xf$‘v™lqdí}…䜛áãõÿ] ‚U€Æ¬ÇמöxÀáû¶iO:¬äÒb“¸M¤’1âWÄg³>žöq†[ ñ2ñMÅ'"()Y'æ±ld4ƒä—‰»2–’'&ßÀSg^™öÐ}8õ¹&›°€åwÀ¥Öš,Ô \V:k²Ý¤;©iÝR;;\‘Œu?ÊåÝV þ°ÿ¼\þûº\ÞC9¾u¥(J•IÒÀëÃ]ýÜàBS˜s_ QP5ûFz¼Úë׋Gõ%«t{3qW°D÷0vz ¼ü \}\ø$€Ôu¡ºmþÀÍ+˜…–ÍÙ¬C–;XØ9:Y„^g±BÞ,Ú\°ACioci]g®©Å·¸(ñL;òz±Úï9ÚAnŒŽÐIó ¨Üê­°4“I÷ÐÝ x#Ã{zwA¼¨j}ƒÎ…Ðþ¤Š¾Q¥óš=˜ò8Ðmèñá Ã(Äo{1±cÚÑd5¾Ué­ÊgÒ·t¶üÆlaȱi"ßÐ\.5æ±”šËÅâ^Å8tph0èk€!‰~D† TÒhd¡‘”»6‚ØÂì±–:>f¤ß&Ÿm×çŠäíxÝA4Ž…¶ƒLþ&ÿ–·ä%ù­ük±¥ªiÄ”¦¬?ûCqÌÕ¸m¥&/¾By#¤Õ‘%iþ 'ËW©¯:ÕXl©Errð'ñ=_—Ü—)Œi7Ò¬›©äê,úF|ÙNšٮͯ6×rm^™Ü ®ÍšUáHWü «Ãÿ5;¿?ÿͰh endstream endobj 159 0 obj 706 endobj 95 0 obj [ /ICCBased 160 0 R ] endobj 162 0 obj << /Length 161 0 R /N 3 /Alternate /DeviceRGB /Filter /FlateDecode >> stream xÚ}’OHQÇ¿³%B¬e&RðN¶Wí`ŒÝõoʶ¬k¦²Î¾ÙÞÌn%Bˆ.AÖ1ºXÑI:†‚b]"è(‚—í73»îˆÚƒ7ï3¿ÿ¿ß{@](mšz€yÃÉþ(»;>Áê7P‡A+­Xf$‘v™lqdí}…䜛áãõÿ] ‚U€Æ¬ÇמöxÀáû¶iO:¬äÒb“¸M¤’1âWÄg³>žöq†[ ñ2ñMÅ'"()Y'æ±ld4ƒä—‰»2–’'&ßÀSg^™öÐ}8õ¹&›°€åwÀ¥Öš,Ô \V:k²Ý¤;©iÝR;;\‘Œu?ÊåÝV þ°ÿ¼\þûº\ÞC9¾u¥(J•IÒÀëÃ]ýÜàBS˜s_ QP5ûFz¼Úë׋Gõ%«t{3qW°D÷0vz ¼ü \}\ø$€Ôu¡ºmþÀÍ+˜…–ÍÙ¬C–;XØ9:Y„^g±BÞ,Ú\°ACioci]g®©Å·¸(ñL;òz±Úï9ÚAnŒŽÐIó ¨Üê­°4“I÷ÐÝ x#Ã{zwA¼¨j}ƒÎ…Ðþ¤Š¾Q¥óš=˜ò8Ðmèñá Ã(Äo{1±cÚÑd5¾Ué­ÊgÒ·t¶üÆlaȱi"ßÐ\.5æ±”šËÅâ^Å8tph0èk€!‰~D† TÒhd¡‘”»6‚ØÂì±–:>f¤ß&Ÿm×çŠäíxÝA4Ž…¶ƒLþ&ÿ–·ä%ù­ük±¥ªiÄ”¦¬?ûCqÌÕ¸m¥&/¾By#¤Õ‘%iþ 'ËW©¯:ÕXl©Errð'ñ=_—Ü—)Œi7Ò¬›©äê,úF|ÙNšٮͯ6×rm^™Ü ®ÍšUáHWü «Ãÿ5;¿?ÿͰh endstream endobj 161 0 obj 706 endobj 103 0 obj [ /ICCBased 162 0 R ] endobj 163 0 obj << /Length 164 0 R /Length1 5760 /Filter /FlateDecode >> stream xÚÍW{xSU¶_kŸœœ4mÚ$-4 …“4MIÓ@”j‘Ó’PÂKyÚ`‘–R(”Ò˜J¹¢ ÒjaFt ŸƒÞ^$=t ƒƒ¼Š8ƒŸw¸ò uGtÆ‹O$ç®sRQïÇýãþwÏÊÞ¿½ö^{¯×>;û@l¤†–ú60Áê9MeLCÇ:ÇÓ?ûÕÓÔþ€Ï\Ö¶¼eóíÐØÉå«:—½òÍ¥>ÉsIMõK?<^y3@â»4g|u$í×=B ÌÄg7µ¬[Ÿò0´_¢j]ÕÚPiø 5%â -õëÛ ¥ìñS‰w¬®oiœµcÏ⛈wµµ®]§œƒˆˆø¼¶5m±Ïm'~ áUêCPýQ=Òƒ•ð.Ð ÷0ò  2©ˆTlܰÐj \TKl¡rogìuå=n-ä‹zJ`%<ãà-ŠÑiàá ¡ ƒÔRÑI#wÂb¬€ ÖPôìÐÿÀÛa†Ï ›¡$’öA1­— óá8a…ƒt@ôÀ!› =Ê[ÊÒ6Ž´µÂVØc¨}á<®RNU°úàÞ¢"9iš¬ó’7C¦ÁLZy!,†¥´âãð8ƒÊVåy(¾±PJv= Çȃ«XŒ\·FªˆÞ†?a2V)s•£Ê«¤'Êi­0VÄZÕì‘—~"uídÍcdÏIx˜„ p5vâ~ÅÂÜ1¥MÙOyqCiìƒçà%xÎÀ%’4b&Va žb‡¹Tn7·ŸïàŸV\ÊGdßd˜k)BÛáÉ¿ çá"|_“6´£ˆc±Kq:.$z0ŽmaO²Ãì2gà~ͽ¬KŠ]TþSù’¢’^Šq)­€ Ì ŸÕ®!ÚC±z^¤\½Jûü…èøu˜Š#IÓ(ÒãÄlÌÇj¢éäW ®ÁljÞÇKŒœbŒ p!n—t[ø¾SÉRJ”2¢'8Š|:E©&Â-Zæj)šMÐLšï‡-°âÚ(‹ð2Yðü>‡+p¾CyÈ3EÈ…y”•±8ž¨ % ‘%Óqåi>ÞN-ÄŸ7á.ü9'ú=¾„§ð¯x ?Ç«š•×Ñyu’î=ÝoçËø…ü/ù>}‚ð»kŸÄÇ2CéQö+g•ÁHoZ1Ì¢·` ùÐJ>¬£ódì&ÚCt€bù[ÚÉÇh½@9>Eô:ÑiøŠêû”½!¢¿Ó»L>~Mþ)ÆqR3j×2ZŽ·`€¼›KTƒËho´á]¸‘¨÷áŠüA¦<.Óuéöë~¯;Ã/òSù¾“߯?ÊáOógùKúlýaa‡°[¸DYY@¹)‡Ÿ>©´ÃzáYhbl€N„1t6­„#¸¾eòê.L¥\wRôüôÖ/Â{ÀÌÆ²_`åè7ütní‰_ÒYQFoìyz·B°‹Þœs0O²t*ަ“,U¹ 6åc~¿Ž’;FS±ÑÌÔásî2•cUtÒXì9åÏܲì>+忏³]YN‡8ftæ({†-}䈴T«Åœ’lJJ4&=¯ãBAÐ5¥ÎÉ©‹èr\S§úTÞUOõ?ꨋ8¨kÊOe"Ž:MÌñSI‰$—ýI).)]—D³£*|Ž Ëy#àrDqáìj?p…‘ËZ{¦ÖÞ©µMÔv:i‚#hk 8"XçF¦t4uë´Ü ú‡côP A‚DuáL®ßØd#P%‚»+Œd¸ÚçÖ/Ü6»&åt†}œÜàZWU$Å;<]ç Ñ95¤ÛW°Bµº“–º–vG%XR§¶êkk"\}8ÂêTo$݈¤oøÀöû}+øÐ#Ì=¥¾±k …¦{jœ­S¹ú‡ˆ›>×A˲-ášn ÇÐl{Ñè ª=u+‘W•«©keÅæÔÈvÉtÕ¸­FÎ24ÆW0h»çf'eÐWé«Tñf§íž8~x¼ÿí5¹“§Ï¹T5¹BdfÄÑ )q‘­Ôªqt5L 1zÂH^®ˆ$L®ë2ßD³"¼Ûìrt}”(×åO~ÚS?Ü£w›¿µ©¦óúŽ ñá¶ö_údúWOØJ)“׋´eu‚ȑ׉Çì zADÈ0$DYáQçòÛl^ï¬+3¯UÌ2Y1Ó|­&U\«P˸±Å§%—Š›¿têê|Ó·{Oqï}—C7 §r‘ßGwˆbÌN Sy»1+ÙeµZSGdسì®ôüŒÂO®¿Ü0>a‚}ŠaŠ}žaQÂBßòŒÎÂ3¶y,|dÔS†§ìǬÇR™ºœ –`4V[}¾oAÏè•™YmÍËϳgL=˜kÐk4z ÂÔ>âü…~¿`H0z 2ì£2ó’ Ñœšåæ‹ÆX\¬XïË÷p…‰’Ï?µ°º°Øhñ8ó²ó%¨ÊŸÚfÙd9ká,Õ–âìÒâÿß9i)ï˜è_dë(·¿f÷[Ë'ÚÏ[Ê­å¶GùÄóvLJ¯ ßµô kz¹À›;¼‹:Ì‚¹âûÆD¯Í\a0W˜Y…0ÑL O¡ÃöE8"G¤LO-N-ÉÉ-ÄÜRç=·`)uj=º8"T%ð#W>aoâG¢y´ß/(ŒMI»9]ñ8éöŽŒ½ä3ᛢؙœlw¤ˆKw%Lµâl¡yDf2_TĬö”\gln3Z ^»®¨HpßôÝiÖrm7‹-.5Å¯Ör¯‚,ð¨4o9¾{ËeùÆ0r¦£ŽéÕ„x¬ˆŒÍ!A ¾jAŸRm¬£E°X³¹Ò%%;Sì©B–“wê+ikYS·:gìÞWWìß°Ù‡hsͤ–Ýv¥bÈb-÷äI—;Þ±MºüqôC*åÛ ½Û6ž„x…p,*.ŽàJuŽÀñeãËŠ9ôàûüU^I2û2–ÿJ ©¤Ü;P•³àcè,ùî%>«8$Ïâ·^°þöüÐ┊/ ÿÂàÕÎëH»X{[¾—WQ1õ:±'b?¾¼>òýÃéËÁÍÓ-–{X#”Ð~«&ÅÑíIOw3=EØL” |„¯ÚÊÖáµôu˜S5kò´*ï¼-k}U­«–jwtõQÖC7Üèá¨,„E¿Û©ß)°QÖ-W‹iQÖEeÛ ¬Qö %ʶ˜£l+AJ”m!H޲LQv?AR”ÝGe› ŒQ¶‰€…{ Qve ôQv7eÿB ‹² \”u°([O€qˆ“FT‹ï‡ðÍ:<è(ÃaÜ™;*ý¬Ž¼7SmfKÈÓ¬x…-¥ú3­~K“x“5Rý<«§úˆVÇ%whu+[Fõ­Ô¾•-§UDMZdËe4H•‰¬OC;˜ð¤V÷iµ ¥µ›N·›ži7=ÙnÚÔnº¹Ý4¾ÝTiÄ3t—0a¿V7juŽ”Xf:Tfê(3¹ÊT‘éRlÂiZ©ÕéRZØ46½6›ê¦aSvØT9»èÓÁ„÷kõ}Z½A«›´zŽV{´Ú"YòLïæ™öç™Í3-É3MÈ3ÀºîšÐ(%˜.˜rLcL£LÏÐJÁd9ñ5¤Ñ1£V‹QüF®µ\‰Ãçríh‚ÏäZ7Á§rmŽX™ƒZÅ?€Z\@øWèÕ©üylf*þ›5þ=ð ›ð]Ùs‚¦Ÿ‹ÃŸãðŽìYHð–ìÉ#xCöd¼‡WdÏ‚—åƒàE9”Cð‚*$x^ù NÈ¡%Q94Dp<Geß*YömŸÅøX©ß$×fPï½rm&ÁF¹v<ÁÝrí±Ò‡wA¯fãºaÖ¿°Põ­ z´ñVèÑÆWc³Æ·ªã+±Y‹Å úUç-'ŸUl=ÓHͲ§€ ,‡ÆÔÈ¡9b¥ çCH[l„4 çBH›t›ìë#±[eßÙ?sØþ²ï ±2§ƒÕY!pkÒSe÷~’7œÿp6|ÃxÉróAÒ²’ M©›,Tå\ñÉ.n¦Mr­³Æ—)¶ù¢¸ï˜Øê+[üÔ”Åf7wL\éÞ-6¹£2·¡'ÊPJï [† Äù!•7Š‚Þ#rÌ£žSkãÛšøÖ?ØÚâ§Vkü »3~\Ý?ßDz;V‹Õ~Zî˜89”%N$M}²X¡+‹å!M}±/ªml¯´R±À—'Š!£8¿_¸]¸I(J„B!Gp £…L!Í`5˜ Ɇ$ƒÑ`0è :3€!-ª\²Õÿƒ4½Y½N­uL­Yü/ˆ¡Á´Jë{ÊV*P¹Ê&*÷P¹›Ê*ë©tPéR.Ug².v÷€9Þ¼›mîÜÀ¶·¶²õíõ¬CkE U„ýÓ ŠÊ–>lÙ1É6Éz‹¥|JàUÝpíýá±ýon$û£&ŽŽ<2}nMä_G‡#EjCžÉW¯õƒl<+ Y© ášA\ÃÆç¨ý¸&&±šô²RƒZHŒË‚^U z¹,Ml»*ÖßÓ ô÷öj"ü^èÑDzø½šH_|%) •$HLo&æÑU1Úš6ƒD‹I’&•‘‚ͪ6g¤h‹Ôô¹Ý$r«"ý^7 ô»½ÚpîÃ>§6ÜnŽëÀÆýñéÎø¸“ƽÿŸžÆªÿ댣ݶT?Ëê\ÁF*u‘îúòÜ´Äáèß~aø{-§nIC“Šõ‘ ®Æ@d»+àèï>xƒáƒêp·+ЃójúJ¹[êÖ¾æŽÎz|Æ®ŸèÚ~]׌Ço°Øãêb3T]³vÝ`x—:> endobj 166 0 obj [ 722 778 778 444 ] endobj 119 0 obj << /Type /Font /Subtype /TrueType /BaseFont /RBNCJB+Times-Bold /FontDescriptor 165 0 R /Widths 166 0 R /FirstChar 119 /LastChar 122 /Encoding /MacRomanEncoding >> endobj 167 0 obj << /Length 168 0 R /Length1 5684 /Filter /FlateDecode >> stream xÚ­W tTEšþ«î½}»“t÷í¼ºIÒ}oçvÒm:!!!NÒM !b€B ¢‘™ð6 L”Ó3¾ÑqgÇõAäÒ²Lç Ê ;‚€ãct¯Ý‰ÎxÄÑúîo7¨{f÷윳·ºê«¿þ¿þúëÿ«ª«€@ žþî0öœÁìêÚ ½ùÞæ±þW³f`mÿ²ãbC!£¬½ióšw³ïØ`z€Íéëí^ýLJ똿Á>e}Ø`9žR`™Ž´§¯æ”[ évmÔ›Ö÷t“|Dº ic÷¦c€>‚tÒÒÍÝý½‡w>Ez7ÒyëoÝ >‡‘Vö öüîË<Òïð˱€6mFHE¼ØD ÅlÀ<²¸%ÆôC€ú.æs˜ÿ[®Æ¸R(Š=­þ“ƒò¿Häøç†§á>x 6Á6¬ßQðAÌC¯= -Ð “$ÓqŒŸÃ.”ûÐ7’pŒg ^E¹<Áƒ‰í«aûçCÊþ ¼åp-l†ƒp ÞFÝ…ÐKàW߀ð¼F~Í2j5CôÃNØ£î‡"¨FMÃp'‘É­ê¬ÀÔvýþ~§¾óâ!I·± %ãH‰‰¸H€Œ g,  =Ó¡GZŠ=#mT±W”Bê`>t Ý[ánØ‹–‡wÉJºWƒêQõ·Z,±>ZQMp5 ÂáAŒÌ|K–R‹êQW'Ô—Õ/tÏsàûTC3ê]kaêâŒßw1MÂ'$…Ì%u¤•Œ‡ÈËäMbŠ˜]L„8QýrÐ3^œMZ]sÑîëàzèÆ‘ï‚q´ñ<|MÄCJIrˆ!¯ 'i]A·ÑÝôyú:}“¾GÏÑÏè_ãdÜèãSl#»œÝÏY¸ë¹­Ü0wÀPvé«XylYlel(vVåU‹Z ©ÛÔGÕ(FõOº'`;È?Fu!,ÂÔŠ+m¬‚Xƒ;ow˸*öâ®x ç·ãôk\K¯àì^Ǩ¿ŸàÌþßÁ%ˆáÆeÑÏÓp=™8£FœQ;YB:Èud%¹ž¬!}ä²…lÅ9ŽaÚC~г|œ Éqrž|E¾Æðr4…Ú¨D 12t ¦n\ýt+ÝEFï§{écô úÏT¡‡èiôÆç4Æ$3&)Çb2‹˜næfóKæ ææ ó3Å\d.1—ØR¶‚½šÝÊÞǾľ‹éOœ+áæpK¸ÕÜÜÍÜ(w?7ÎE¸÷¹ï e…—ù6þ~7ÿ ?ÂoàaÜi?üŽBü_¿ŸÃ³ô, ÁGð)z`ƒ{gyZÙåpOŸúWúyWV3ô‰gåšÁ‰ÙÁ<ˆûÔ?`žÂ|>Vç òbGÕ·j_§¾Í c GqǧâŽ8 çXY„çÇõL)®ßÕx²à ˜9czIqQ¡¿à*Ÿ7?Ï#çº%ÑåÌÉΚæ°gf¤§¥Ú«Åœ’œd2òŽe(Â<¯KRò»6_ž?¿H£ånlèþAC—"aÓ¼Ë(R—.&ýX2€’kþ›d .¸"I© ªŠ ¥,)gƒ²%Ëw`ýž Ü))Sz½E¯³ù:aFÂíÆRÈÑ”Ò%…”yC}£¡® ꛨÿüÓ¤¢B˜°eV'kšhèÞÖç@Ð$BJ– )Óä ÎcòBÝ«•ÖÅ¡`¶ÛÝYT¨†y•r½bõ'ºëš¾A14 jém0&,<6zwT€U]þ”Õòêîë:¦»SÂæWìrP±o™t|O^®…îN0?F¦Bóæu÷ŽÎC׌͓]Õ}7RÍ×H¨“Žtv(dKš¹šéñIôÊ!­¥k¤˜äz¹ot]úûqKw¢Å'\­ªûÊ‚Aþåºâ÷+sŒO/† M«Ñf)Ùò€ )Ùè*hE?vwV– ßÝn-dcѬBB^ܧ%X•@‰¿S¡]çØeNÆ3|™s¥{—Œ«ñ~yÉPŒùW~V!3-ÔW©Ìÿ…Ý«ójûÝ ãGû׫˜X>œ!DI”Ò’ |ˆÀ4#eBÛiŠM›ÀᾪºTµË–KUP[%\B‹Óe›ÛæÅœf(‹~WÉÍùëÉ(sòâÐo^9ê9æž;%¤1ðzºÇ#xrJ…Ò.-§Ù¾Â¾%w‹ç®Ü»<ûœ{Ý{s÷zö;÷»÷çî÷qqÉ=ây5ó”ý”ã´ó´ûtîiÏ©¼· Þò\ð±ÿ[Y2É$'ÇYTä/v$°8[lX–XXb•=Žìi²ÃjíÔnË”íÆÒçãec³™X͟싊slBN‘=3¬6AhK-¬ÅÙèB1gÛÖn‡ÝPâƒ$±Ü›¬7͘nJðà;Sâ¯"¶T{ÔNÕú5¿ÔÚ컸b¿e›pb—±Ø¡WP¤¢€˜Za«¨ðk .Lù/’ LáØŠ8§v Æm'ŒØ[+ãåêŒéä¼ÒÍÂÿöÙ¥ùüìR^CfÙôÎvgX—š9kfyY¹ÝBäÜ|o1ñòL PfV{Å:§i“~÷Ÿ¿ð7’MÛcwe—;ó*1ÐSW¬°W»W\Ç5ÙL…©ÔÍ[9š•tqidÇ‘Âäæ²ÆŽß^ݘñ“›ê6ß½,»Wožzžy‹¹ Äx’óºj}޼ʊô²«ÖU?ì}Ê;á=åýÍÜß{߬x{®•­fk¼9eU³«k;“—VotíJ½7#9¹ÌTî ™ÕlÀ+ù}ÎÂdRíNM^Ÿ$'7[gÍt9Iª¡Âc«°ú^·o¯Þ5kæL1ÕåtÕÚR¯ô¤¢<ÓÊ0Bž†Âä sµs§“qz\A×*×Nëj¬wº—«>‰P?¿®dèŒç¡Šl+Á¥}Bà†N®8¹Âq%ŒS—cxâÄ. F1Ä¡’¬ê3Ž,-|ZÔõ’ BÖIá èìê,dOŸTš9× «–dÚ™²ò²Y3µ¿EÏXHF:† £eà ®Ù¥eå—{ðÞBø¼ñLÞ==Ån©+—ž3Б-máÁB©:ɸƒM²YÁgÛô¶æÜZŽÝžÄÛ̓ ¡ÙÕõtÝ"wšÓÍÐܤ$ÞËr±¶#×>ns/u”ºbn«ßduT¯ÎZ_tuÑ\[¾…|⛕ìw/Xö«ß'^E0¼ì'Ë®·V] ĨÓÇ&¾Û|Õ)õžx“Óey Óžkûel¿1Ë”ª÷üà®Â°P§˜{ ‡Å7›öÄ7žEïÏà+Áë0S|0_mçÈCH]sjbƒv_i«_ÔÐTïo¿¡¿÷Ö¢ºoº¡'ñŽSÿŒ¹zÿæM‰Á¼?O!)øøéý‘Ö 1Jï øÆ0O÷-_@ÇÇÇè¾Á}ct\¯¤ûÄ}•t\o¥û¤}­4JÃÏU–ŠQ:iÓ£t!-JïBHÒݶ(Ý… DéÖ(A°DéNs”î@H‰Ò;’£ôv„¤(F0Eé? £t;¥Û Qz¥[Ø(Ý‚ÀDéf4fžÙ J‡VDB˜ˆv7êÒi5¹ðõNÖéåµzy^¦ë¥ —ì¡óús]ù-¾ïÌäe½ìÑË´€¥ÏüEŸy²ÏürŸùßúÌ/>|Üš‰S/¹@z‹ùl‹Yi1¶˜«ZÌ3[Ì-šª/ñh&“zéÖKWÀÞdþºÉüV“ùõ&óx“¹§É\ÚdÎk2GÉ¿l#æ÷GÌO˜óGÌòˆÙ9‚­Ï²6[Átï´Í¨àµHk¡ø<9ÎR$ÿ‘ŽˆuÓÈ1¨d5ú…N€¨ãah yˆ ]ÇgÀkÔÚ»"­³Å(Yi­F¸.Òºay¤u%Bg¤u± Zõ.íiR¬³‘6t•‹C´ÀÕp!â3ˆó#âZìŒ4¬ëL¤t±y)bŽfx™d$ÔØZ0k|ó!ñ¬8U%K#âyÔ“?n²$"~èÒgÉâÞIñLë½âéÖ(Åæ—Ú±9"¾èÅ.‡ÅgÅGÅ'½z˯¼º’}q±G¤¨á¸ôý>]å}¾(Ù{Xü™÷¬¸]µoC[|gÅ›ô±ûã°Ö‡½‘»Æ7)®oÛ¼zÿ«%»°]{AåY±Ñ§ëŸ‡&ÃbH:+Öûô¢Î¨Såqµeqj–¨k›1¦7–ÄgR„S,l×m÷£™y«èEwÃZq‰hMá#d^ZÂd{ ‚?Ƈ‡ùð­|øF>¼Ž/åÃóùð>\̇sù°‹O7¦£Å˜bL2#k¤¸/Ò£êGídI7X­dõº@µ’Æ4JŒšêtŒt7æ;1ïÄ|æaÌÛ1߆y æM˜‡0ª=§õž £ô¶CB¼zÝ’hÜBïLÔµMtH¯á&~N1Ò%êˆBîQ »ñ*©=Ù ^T÷t:23‡jµ©5¶ŠyÁ¿Qt%Jÿ÷ŸãïîàÿáGš[7¿ˆËôst½H^Ô˃‡yñU^ÜÏëÍ× @XëaM ü*N8œÊÍ×t(O;;•™ZEuv6+ÅÚ›c‚ÖÒêPp‚ÖhÐÙ1ÐÚP›Ö;Ql¹.†§v-ŠA¥(FžQCcžÖÅzâb­ÑÄZ5@1º$]L¢u±IMìà`e(x°²Ra .2ÈýÈØEÆt‘±„H¶.âõ¢HƒW9˜ëEƒÞ\íùžÝgÇÙÅ:»ü{¶/ÎnŒ³‘íÿüzëÿéÐ ×ÔgBm-ÞˆªH Ÿ¢ðeÊËÿ“Ž[Vþ ÷¯”¡ endstream endobj 168 0 obj 4048 endobj 169 0 obj << /Type /FontDescriptor /Ascent 750 /CapHeight 0 /Descent -250 /Flags 96 /FontBBox [ -10 -12 768 682 ] /FontName /RBNCJB+Times-Italic /ItalicAngle -15 /StemV 0 /MaxWidth 1000 /FontFile2 167 0 R >> endobj 170 0 obj [ 444 611 611 500 ] endobj 106 0 obj << /Type /Font /Subtype /TrueType /BaseFont /RBNCJB+Times-Italic /FontDescriptor 169 0 R /Widths 170 0 R /FirstChar 107 /LastChar 110 /Encoding /MacRomanEncoding >> endobj 171 0 obj << /Length 172 0 R /Length1 3600 /Filter /FlateDecode >> stream xÚÕ–xÕUÇßçœï÷{/5Æe ÓÆd,¶ØXDÈ "@œ°hLš Æ…§»2@k nS‘¢E‹”Œ¶å£7$œ(Ä*PFšã-ŠH©5&­w}Î{Wþ°úÇ?zž¾÷9¯ïçÇ9ŸóùžŸ @6 ¸¸¬$ŒÙØ/–V)/^³*eÅÜJP =0^ZV’f•øk—._ ßqè-À±unZ¶¤¤ôÉÁ¡€;HüŸ[&†¸WÔ)Ñ Dº¬lÕÚ@• ‰¾VôËË—àa\½ÆfQV²6ìS[D¯=eEIÙ’³·< ºÍ¢—W¬Švâ=Ñß=#¼rI¸¸qtàIÿþ8±)Øï±_äa‹Ûc–óh|üÇH‘¬Ð“­z&aZP¬Ú±Oí@µÊÄ6ñŽÇ3؇cRÆ" Í^©Ó64£M/À ÑBÈÖ7Ë{6 ¤V½Ö:«Ñ¢v¢EÇëIêiìÖõjž@;Ã¥f' Í~”!G7 Øùª®òzV«*P¬'ëÙ}4êœ+ëNü„öš2}ÑWŒ<Õ%Ñ—áw8‡1z,¡V/’L«6u@Voë9xUUÝê¤;?™O$¢ÃmÁ„{q@ô$L2NÌ?ÝÎÒ%[Bj‡{Bí–ïÏ—¯ï@6va»ØwI½²M2dŽK˜!¿tS'–·Rä£xsÜ6©z¬ö”±Ÿ9 ö!ÇÔ¹•êu»rÔ/ãœT=Ü+ÆV\r#z¢>ûP©¯HÍý8ëÖê½2 n½®T‹zdzÝ9¨vk1PF&UÞ dF»˜£êLÌ^ÕôáØ¸/ë‹:Λ†R·]u¨.o”—¦ö¹]²d*U‹7U·—£{ã¼xiQ)ãxx}Õ†lFVÐç¹ŽÑ )ˆNûbi$xWaÊñù©™QS¾”ò#}×¥4÷ôä:Iîüˆ;(bÒü'mȹÿæ<—™13¿0¥Yù¦æÅÂN]˜'ƹ…"ZMÌbŸš—Ù»ÎCÑNÈ}JV­‰Á><åwµƒQ­gZ³8Õzª5k@ÿÔþi©ýSCº+LR÷…èN_|×å•^zoŒB•èÄëc öõjÔèj¿Wù§&´Ž–@ÝígÚ³Têþœøîæ€-*±º²ÚîÞ‚h©ž'sìíÁÓèªF4¸M#]ð†ùíçm˜óíŽ,uƒd#EÏ‹îR¡kQ·­èS‹|åƒFO7: ^“_pÓ lœ í×ã 0c¤¨Pt—Ö×¢ÑÃÞ‹E]ÛyrHi8ÔgÏ=ý&| ”Ÿ[ûÈ W×]KO2rm¢z×O{bÕ_«—3i^´éêÿ¦;ƒ\ç$BöxqJQ¨›P`‹¨·Ê/OÖK [¸¸_Î$[‚ò5ð½+ç…Še–‹ë¡/0kÊ]SfL9w]Ù¢òå×Ï®èÓ²kþÓãòŒ²çc0·GoT.¢0Ê! jÊŠ„%zÈ(yì&¯’ÿ$»È¿“WÈÈNòoäeò¯äûä{dù²ü3³üåKx¥’÷%jV6¸Hùòyž|›ü#yŽF’ aZzkÈjÎéì³|#,{ޗܶҲ…¬Š­*Ù]†²‘`3¿§’5*9o›ù=›düΈg=›pD<±Azué1B;ÂðuL›õ¡k±»Õ¶|€\/g†­µ¾Wc?÷³Ö:ZÖ’÷‘køÕ«s{÷uVbª´¬èÕØÒZŒÜéaÎþ½ô„QÎÙsöÃÌ­+0Llåœýræf-_c›eäRr ¹˜¼‡,&¿B. ï–ÿ2v¯ßM­ˆyΧ\H~™œG~‰, çr¦æPÎ'ï$g“w³È™äôž?H¦_`üi´äqGO¡<™Ì%ƒüšI”o''’Èñämä8imdÍYy,ùY2‡Mf‹Í ‹ò(ò3d&™é‘”?M¦“#0\úpåmµá\¡Ã(§‘CÑO8Dn #÷ÈNa*í)2FFþƒÙú·Ð’Ly™”Û»>EÞ̾ob­DòFò†2:Ñ_ztåmmäš)Úö˜ó%p7ZÙH›(iÛöã¥/G~’üÙ‡ô“>ŒzrºðŽï(ÞCFn¹dÒFVÌ¡|ýB±n”èIyBJDÊ)>(5«ªVUŒüŸ<ù÷$ÿ õ®î: endstream endobj 172 0 obj 1919 endobj 173 0 obj << /Type /FontDescriptor /Ascent 701 /CapHeight 0 /Descent -299 /Flags 32 /FontBBox [ 41 -202 550 729 ] /FontName /LCQCJB+Symbol /ItalicAngle 0 /StemV 0 /MaxWidth 1042 /FontFile2 171 0 R >> endobj 174 0 obj [ 250 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 549 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 333 600 333 ] endobj 75 0 obj << /Type /Font /Subtype /TrueType /BaseFont /LCQCJB+Symbol /FontDescriptor 173 0 R /Widths 174 0 R /FirstChar 32 /LastChar 93 /Encoding /MacRomanEncoding >> endobj 175 0 obj << /Length 176 0 R /Length1 5096 /Filter /FlateDecode >> stream xÚÝ7kte–÷~UÕUyTÒ ytbBu§I“GwhˆÄ¤’tGHx„ ‘Ò €†Á,(ï0TtgÔqÁ*Màt…QœÏpÆÃè2ŠÌòУ“³3#à"¤koU"ÊÎÙý±¿ö»§¾ûüî½ßý¾ª¾ Ѱ8P[Ú(ÙHrã[ºVØ_(+‹%úŸº°sQû†¯Ÿïn°“‹^µpÚÌ Né×ÙÖXpå–ê&‡òQÔF‚è6¾ø6âGµµ¯X™´Œ¿ø´‡;Zl÷Sâ_'ÞÚXÙ)ÝË~I|ˆxûÒ@{댛Ïÿ±±¾³cù }Î'žâƒ§ó‘Öε¿wms,GI†`ìÇØ þÇ? •€àÿÁøáÆ…À„H§ÇÆ= #ô‹ô Ðóe¸‚ô¤ ¿©ÿ™IÆ}ÆÃÂe%à‚4XÏQIÖÀy(„dÈ‚‹XJ|œÏ` <'¡öãýÐÓ Úñ>…‚"ðÃKð­Xd[?­:¢¿M²"Ø!¸÷AyÙ?×OÂ^ø®é/ë_‚6‘ÅYýßÁM·rK*d’Ï%Љyl…þ”R¼çàœÇ$½a”€A´ÃRø éÞ„³ð¦ÑnòÀCqª`l…§àYÐàw¨àãø"¡·éK`6e°„Öí¤ÝœÏá‡Çñ”ž¦÷é:Åv¨0õ»áEx~aìN\‚œ‰s8'7N—õ±úM²¥ª©P?¢í°švò¼ ï|FQ³°ga'®Ç<Å*¸¼(LÓ7R–Õû>‚é”ÿrÊtâ>ãnð©ü þqþ·üiþ‰ÿ']° a–0Ûb³[º,¯XЉ¿ÏAjü8zǫޫØ.ö-¬e÷Ó{ö}ÅþÀ&ÑI¬Áƒø UêUº·ã>!P " 6R AíÊåÌpØ•‘éi÷¤¦Ø’“FÄÇYccäè¨ÈI´<ÇrýΪ&»æjÒx—sÒ¤<ƒwHø I³“¨êNÍÞdšÙï´TÉrá³T‡,ÕÛ–hµ—@I^®Ýï´køœö>0£èí>g£]0é©&½Ã¤e¢Z`÷ÛÚ|v ›ì~­ª«­Çßä#wý*,2/—.U"Êp¬Ae`M›aá×R>¿–âô™:.ÓX ÕÎhðûîq8ór5¬lq6kà¬Ðbs†—ëìdZ×@±órùÃÖèÎ[C*47TàG hÔX“#.GKvú´äÇ.Û¾g¿£üÛ~ ÔXfU µ§ŠJ³uÒÛdpmÄÕÌ´“[¶©±AÃMCI˜¹í¢Õé7$MKìZ„³ÂÙÖ³¤‰ju ÁT5Õï ø5¨m¦¨)&“—Ûo[;ÑAEéÏ+Ï+7ðD‡míþüÇCò?ˆ2íN^ \Sw».hDrN¦45{‹ÄI¹N0¦Ö ÐÓ2Ìh4"ír±QÙÔc½—ViB¦Õiï¹tPοÝ) K,™Ök`ÆqÞ¾¤¦éå _±géwŒ£ïCeÃÉ‚%„³Õ4àÅÉD üdŽc©q2BŠñ•£ªÎ–“3íjÉÔÁ’iÖë%S­ƒ%PV2Xb½JSÇçˆMCè ÝüV¨ùöPˆûË­L³]ø(ü ^§/ʨV]ïñÈ1‰cœEfœdÝ%F%&'§î± %gÄI9%!ñ¤cål3ÔÔÁÕئù[}W lê@±×‹qñÉÅ`ý}ä-âèR,çrŠ®ÂqEÞ±I‰x}gýˆ¦Éñ‘•cªî­([PûWVÑÚ11’8~\Ö”–Êåý }uÀz}ÊÊ(^å*u¤G»l™ .)3ÍeÍä]rrd!@"+D1(!–¨¨”˜BÀ4EÜc)D.ަæ4<6à²áÁQñqãF3ggILHNòÆ,‘92F»â¬ã‹¼lÍRGé¾}eŽ U»¸®µôÑð…w×uÏ}\ϤÏ|Á×?Øð—OÿóbwX˜øwOiáCã$dG³¥¾ˆËæAt¨)] ›˜+¡(E6K2¸ÍâgÂ9„Kƒ#šB¸V“£9ÆK‰‚$FÛ¨öŒ ¡çPt´œ’l;†+Á¯âƒ0|×è’ EIýÔk·ðZNNhcI‰q IɉŽBºqt2,ba¦—5c]çàéUÕ¶¬Ô™£°#Zh"nN™:†Oi)z€{É36ÝšF?L?Ïícó„jýD(WmôÝf(Pk€§xŽd¢Aù‰”Ÿ|ˆÞª9¶œiVºÅfJnºçKJJŠÍ[YàáЋÎÑbrÂz„ûoܸÁÇà¬ðþ?\ð]Ë,º\0?¶ä¢dò'úo®úëçßÐÙBlÄí¾4l6;á}á7Ä£w4߯…Sà`æ5„ô<ÁÄÓs‘í£Î‘þO¬†×pnĹZ„ùät%aV‚Ñ$úûI†fÄøá¢À7gFeuENýâöÖåyuí¥F cè­Ðz×FZ¤‡£®.ŽÞ÷øXøc=ÆÖcÙ™lÜSj¹Œ7)„Çœíæl5gÀ›j”!Ú!â þ½|:ãIüŒ£ù3þ¥h¨ƒFÔq&QŒD ŠÁf<µŽÒ[Ç ,Á“D?Iôz&–(³’t¤ƒ$$áa>qµa¾éq:qFÔé&ç!®Œ8ɹ)š›8·É)L ¢¤ÁË8ëÅ*o/‹QŽQC4šAÁ‚àæéÊ[øØAÆ'Íy£c—ÏÛåsvùI»¼Î.¿…[¡–›3ª1µòǵre­\V+ß[+ʼnԷÉÈ© Yò›Yr(KþU–¼:KîÊ’ó²hu/ý•ñWæü´j¯–¿©–ß«–Ÿ«–7UËUË «eGµÜœ&J“ïI£wpíáØ±;b!‚ȾòÎ$»v°À­”‡ðëC^%'·H á–`}.¡ë÷+剸²y¤­‡lfàÕà3ñ*ô˜x%zLý¿ÝÙ´ly°ô%BË‚¥—¨A¾©\ô^"é„`ý<¥<½Ã>Ç‚O2p^°ô)R æ~ ”ÇáhÈÇL¯©v‚×4ÏÆ–`½‹Ì…>JTÏ!•pwˆáa妻N¹žâIr-?$úkvˆí*Ÿº ©ÉÊ_Üó”+­VN’‡wê/)ÇÝ+GrÍÿê;fx‡×©Ë}^R^u?¥¼âÞ¢ü¢ÔTïõšþvÕ›è™lV¶›åùôÃTñ¢”‡Èã’Ü¥…ÄÏ«±J~îxe¦û¨2Ãýˆ2}(ÒdŸ‰&¹˜ÛùZ•ËÓ•rwºr_éÊDí$¨˃ʸ¡àcóÍí”NQrh{üaeL}’A!QÍSf-狳Äñb¡è]b¦8RL¤xÉ*ÅHÑR¤$I‰—èÞJ !ý‚šc¼æ «,¼1ó&meÆÌ†¾; %FW+„ú& ·'u•ÙÊâK㊫|w™š†çœ»tmWÍÌm_z£6Ö ôôÆ­ÐhÄúñs¼ì÷õã5ïÀÏýu¦Üákl´ÕhSjBxÅ¿8DŠÅÔçÊ+$ ~Ž j´Ù¦È&‘¯ê D~Xd~èÊ™f[†ÌÜä…Ì|2Ì.Û4s³K¦Ù†Yow¶ß×›mšùÐmšt ù† |(s-õõºÝ¦U¤†3oO¤f:J7y½dRê5LzÇzÉ ×;ÖT»¿Wç©ë†Ôu¦zî÷êü!õÞ!õ^RçüÖŠÿÝÁ¹/lØmtÆMN+=MÚÖ.jþ×7Ûí½^n™]MÍ-m´j/8[}Ú§ÏÞ;w÷]Ô» õ\§¯vûëzw«­¾à\u®ÙPܼ}™ÿŽX[nÇZ¶ý.ζΖ±6ûï¢öêÍF,¿ËoÄÚ¬n6c{ó/žY±ü.cÅ£Î[¾|üu×' endstream endobj 176 0 obj 3501 endobj 177 0 obj << /Type /FontDescriptor /Ascent 750 /CapHeight 0 /Descent -250 /Flags 32 /FontBBox [ -17 -143 699 674 ] /FontName /DWQCJB+Times-Roman /ItalicAngle 0 /StemV 0 /MaxWidth 1000 /FontFile2 175 0 R >> endobj 178 0 obj [ 250 722 722 722 722 722 722 722 722 722 722 722 250 722 250 722 500 500 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 333 ] endobj 113 0 obj << /Type /Font /Subtype /TrueType /BaseFont /DWQCJB+Times-Roman /FontDescriptor 177 0 R /Widths 178 0 R /FirstChar 32 /LastChar 246 /Encoding /MacRomanEncoding >> endobj 179 0 obj << /Length 180 0 R /Length1 26916 /Filter /FlateDecode >> stream xÚŒ¼ |TÕÙ|ιsïìsïìûÜ™¹³d2™Ì$™ì!¹!$„%HE•ª ¢(j¡VqA_©u×–˜ ¬%îÚÚ’j[©öÚæµÖ¥-ÚE2ó=ç΀Ðö÷~_&g½çž{îy–óžsfFÐVÄ yé•KúÈJò:Ô¼CÃÒõ×—˜>C߇F³¢ïò+ÍK؇ÒîCˆ}ùW´}VÕŠé$B3W._²ì‹Ì\‹ÐEMpÍJ¨°N3@]åÈÊ+¯¹îÐÛú(”¡?tàŠµK—LÞ5wBófByÑ•K®ëÓ\jm†ò“P^µäÊåm׌½å· œî[{õ5ª ; å@ù[}ë–÷­Ù=ç(BCÿæ¨Ãˆ¾}#Ð>Ð%Åšoþ¼káO…X%åiÎk£=¯¤ƒ ‡>2"ļR+ 3²@jUJ6ôßÿìȉ\È<È‹|ÈP'ÂØB(Œ$AQCqT‚¨T¹'‰ÊØo#‘©s7܇ò¿ƒ´È’›ž?Í®ARnuþOÇ‘B(þEÑvèó´A=è§„Aí¸ÍG*LÇ@p=š‹uðL Í@Ý0Êéè±íGèSÜnÄQ4=㛣oEßAûðÔüŸÐè=¼ =w?‰eóLÜ™?Žæ îü ð „ѽèl‚·›‰uXÊ=\v Ãè×(¢ûØ}ÐK7º]•-B¿À ñ%yš†®B7 ûÐ÷ÐKh ߊGTl¾U£ËÐ:¬ÆV\ÂlË?‰êØcÚçó¯åGa¶‡Ñg$©êÈŽdô‰ çWe­¨ >W¡GÐAô[ìÂÕLÐ, ÏêAßBû™c'º Þí0ÞŒ÷3¦ü£ð6µh)Ú‚Nàëð ±ÇØ“ùM@Û8ÜwÚ‰E/£WÑŸ¡·<—¹2×’Ÿ\¥:µÃ“¶£[Ðaæ^Ïk˜Ç!< z~„Ç\Å| =?ÆÑW踯Â7²­œ¸1ÿÀ öâô4 O‡žãø[x7¾?Žâ7ñ(þþÿ“¸Èänò"y%£ŒŸ)e¦03ï¨BªT_«—LøsGr_äõùd¾*¿;ÿ`þÃü¸Bp| jîZzl;ÚîAÁœ@?C¿¾;®|ÆÐI ÁטnrÈÂXÂq\ow1ž7àø»øQüþç "†O)©!ÓÉ"²|FN3:FbZ™ë˜{™w™©6²•ðy†}ž=É©£šwNïø(‡r«r{r{óÕÀ‹pžd.‹&ÏM*/CýðY‡Ö£ 0G›`ÆÎÙÑ‹è-кGáó!ú­2^úùPâš@9L€ž,ÖÀ§0ö P¦ ¸¥/Ú>›ñ6|¾>{ñÿàïÁüþ¿‹ßÃÇñð—ðNˆ¤H+™ oÔM.!=ðYL–’Éíä|~N~M>$¿'ÿbÆÌˆLœig.gnev2Ìæ—̯T1U«ªSµFõ¦êðæì4v1»”½ýû}öö'ì›ç¾Ë= sŸ¨uêu·z®ú6õSêÕ¿Uç5qà§.}âíø]|‰*Mvã<†÷þ1¹†ù)¹?s®ew–¡Åd˜y‰<ô­ÝÌï™gÉ6PÞS”Ë“@‹½ƒ~„ÞaßSÙÙOЛă>}x7³„ü˜ÜO\¸†iTݬz´ÎFç÷Éq¢&û¡ÅŸ‹ÑEØþªš‡¾€ù?Êî„9í ágÈd:pò1ô(yÝö¡å¸F· =þ…¾ƒ1A|øn EŸ¡ߌV•ž˜LZ8YÏ5…á9ù7I"ÿgúßá›Ñ‡Ì¿€÷çáY8Gªÿ g±¨Ê©¼è ùh/píÑÈàOT /Ñ!&‹ªNÍÓo禰×07á¯H+Ó©hîÙTƒ¾tÕ£&´8´ˆ"ÑF?Ãa˜Å÷¸Ðh:ÌØQ”yŒl%yæ-UÝ…N03á©×ƒ~òá,ôt%ZïÌœ{zXêP¾ /DSàJ' 䯄‘?ºHÎ/ÊßÏ.`“èçx&¶£# ½\0‹{XmnZ9üuâÛÑPn¬ÆŸ‚þŒâJà¦qv=»›}š=Àþ˜ýW®©Ý Tü=:«F/…¹øýx}2HOÈO+Œ¢Ö°+Èæ%Ô†=¨t` èíÉ0 ’WC/ÛÐ OÁòst xú1:’ã9_ Ï×@?3ÐE@õ«Ñã oÂCP³ ÖãR˜§a®#×Àó¨žÝzvÆô[ô1h޼2®2܈§õ–¢¿SY†'Ô nüêÈN˜…¦0ï ÿEX]'ƒŒ> ÷õo˜`ůgÿ€ *ËÍÊבUÌKØ«¡ ¸j.¬ì“p?Œ‚‡÷˜@v<U禢zXc·¢nö1¹u®ÜÒ<©©±¡¾®¶:[UY‘I—§Ê’¥‰’x,‘¡ ðû¼·Ëé°Û¬³À›Œ½N«Qs¬Š!•µK½ÁXï€*&uv¦hYZKΩèBUÇùm‚½J³àù-eh¹âßZÊ…–òÙ–X6¡¦TY°] ülŠÆ ç̇üS¤Áq%ߥäw+y#äC!¸!ØîZ9%8€{ƒíëWîlïÝ=§×µImËu©2ôœNY=äœRßsØÙŒ• q¶7¸g¼ž.ÀµŒ·ŒWdPîÁvN ³`q:œö2 ˆÜµ²bJ,sñŒlÏ_rÏáYìšò)­ ïÜŸ{#w,7¼¼£ºrþ¬`2¦ÈÙ c[ Œí9\£ÚÁÞÊóª=ä~íãä)­ Fg…ÑÁ, ê`qTæÙtT6„±Á`ÌX/¸ FwJ˜2ÈsFg­®©…Y ñX¼ÚAGç^YÑ/ ÏÎ=—[QÞÞºðŽÜvÑTep9cîG¹—sŠAQ%^K6’f “G6ò°Ø­úÁ®ä,aLø¥»àY8T"'‘©xíÑÂ} óÄO’Ñ£ð4Ó3ÃØ*ëƒÚŒ–h݆µ·ÑûO÷t#:V\ «&'…cÕÙŒ:–\ÖÞ¾d Î*I{ûe´¿À*KÙ•€²nú2áàj¤Á /V¯UÜjTjÔøŸ`J;ðcˆÇ‡e¼9‘M¼±µ*EÀ!à Õdêæ×òûyFà1ïv™~LÒ7‹8ñq…ÏÆ€Ëzzšº„‰Êi-–ú/ÇOã/“¸' 6ÛŽª*{¨ºª²¦¦ÚœÅ¤°:%{]âDMäâéKE°jšÿ]ùõ3×·—E£%[É‘KÓ¡`d¬8·ðNÂ;ùÐ'räVòCò,ÃÄ ÷0D§×é1b½–}Žâð•N¯ñ ãÞƒ–´sÀIœÃ8<ˆ-šáüÈÞ˜Õ 3‘&`šOÉ^Ä ,aky÷á#>ìóxŒ`ŒÝþÃ`gíF õzú_ú»NMôŒ¡––ñ$(Ùª‘Æì4Aäæ!2Ö'áoL\?„œð@hᤆFJê”tÐgnQÚŽ™ëëÍ–z ¡Ç\o©‡¢ð6LZê …ª‘¥:«ÌVMMU¥¯æpf±¶Šé>ý{¼ö¡m—>pQ´æ·»/ºwúòܳ8zEki8âÀÏãòÝ«nÀ82ÜûÄ´›o;”{Þ’l§óÊÿÙ ó˜DGeQÍ;ù•ÉÉ›í7;öZïq{õŒÛ«ëŸ¸á—¹÷ëKZÊ[Mš‡¯]xÛaböƒìžf^Ùu¢ÊCÈ‘Ýk–›†Ô†i=ÏLÓ–±c»Ûuì(}«S=ÀDg´"Nž+ÍÖs%{ž"ÎK–L)J8óÊ’‚„/™X÷¬ b€ž!@ñù»aAoiY!¬6H;„[¤§/ê=Æ!#Á‰ °$…t&½_ç ¹üN½k‰Æ¯u˜í~ŽèPØqµÄ A …„ I$”2 6³Yˆ"%&Þf2ñd½ ›t›Ì8¸]åBfQa§Ä‡#%À_ ²À30Õ:@ô¼;ãmHÂå²Ô¹3±¾ØÖؾØhìD Q,“cÝP³;6Sïº&¨_è9åötM€nvµ(Šº¥ÉCõÊD“ÅI%ÅYßÒR¿ÃTžÔ\/¼©‹fz^KRaª¯w!a #…¸çÜ‚ZhjR75×£$©9»®F¡j*\……BUe-ð ,q†aææBõ¾rïêܤi—¶ãÿµâ?u¤ÂÍ}ÞÙAG|«2Š·mŸœ¬÷ šhT¿t¯ªáë'ÿ'!²Ñ¨CX¬ÚÉÃïåR {sò¿c/†õ+‚ý‡#¿uH«Ëú† )WLÊ cðh½5Ö.Ï-ŽÛ=»¼·ù4kÌk,Í-·™Ÿàž4>æ|ÓùS¯Žs X›£Õ·Õq³óïvß ªºtl¥¸[o\ï½Åz˜Wך̖ˆ-$~ "m“!zÊl1±«ýŒiµ]‹§ÍØìé‹á˜%zÕ!\©ˆ_Û|YËëDÑu¹Ý§ºþÔã*äÆÌz¾êéS˜¦û³S0µã§ÆU\3.Üø\¥¦m£qø8£!æŒj´j-á¼1£CEœ"½ËEZÅÉ$ü'K“ÉoÄ=ý¨§Ÿ“Ø,Ñ5‚£Ä±P‘­µs oK„Š1­b/Ž—¼oË/+Z½öàÖ_­_÷÷Ç~“ÛÿÂOñ‚Wv=¼ÈL«Ù5¹Òá×îZ¹_ÝßwÛµÖüw ¿‚4GÒUϺä§Ÿ iëåEž­0õ%it¹u¥ëòè‰áöró*(Ük¾Ïñ¨•[jRý(Öý¦°ä+çM$\íõ"%åãý¢Ÿø›55îVcõõe“ž/H? 1ºRÂô (&ÄH¬ Ù[ÆÆØj`Rašƺ26¬”ÆÀj*Œ·4Â+Lí¥tj§KIÁc±š­„+‰'â¥q†û¦D8‡ÝiwÙÝv‰&…X—ÒHò@·úh”„ºdÔŽ¢¤ÐT A²”þÝx# Z¬¢«umq¹–ªC0ë»ÍDÔœÄÀ‚Ni@ÁˆHÌ›jlᵎ¶úYü·»ŸqÑ]GvNºi¡`õV=1ÿº ZWtF£Aû*æ[+³ñèä9¹á£»þòÐbA•ÿú£¹1¿î@x샛ÊD‘r„T=ÊpHîR«´º2&¬Ÿ®g9–ÓÁd11ULÓÇ ³™Ýlý ÝzÝ-:Ó¦ÄîòçUÏëÞP½¡ûXõ±î+ö+ÎôÛÂ’?跇ñ9eeäD^÷Çx ÖÌ1~ªõk©çòSίý‘°¤Q«cÄ0ÛHfãØ‘(ŽzÊq9ÂFÞ$šˆ©ÙÏ#x¦9ð»S6{YI„”àƒÑ±™üõ´"ŠJ¢bפÊ„ (åIX Ò”ÌÐ4.Œ M§š`¡O7+¬€s–7`‰¦&E¬ ü±ð±Ò( Rõ¾ìù·”ò•–~l®R°€".Ò90«ö\ÊÑ«ñ˜Dªâ ×Í6H’õ©5q'k¢1Õñ˜ô”pªë¦«¯lzD•›x¯fë•¿¼9·„’+j7…]+ ¤Ëm¾m»—]˜?ÁEØ+P¾Bvè6ÂDM‰ëÄ[Åí‘íÑ;·–ꤢ63ü›v+¥Ú­ 2+Õ+õô"‡˜«†¹"/Ä^(ÕM‘:réŽÄ-¥ìý±{KŸà¾¯~Rÿzô§ õt“KäÔç·ü®Ea ¡dÔlqbó[~gXª:GÁ…ÑÂÌSÉ€ˆÑèt¹Âlu’1V‡µ€éÍÄÜŒžjz¿Ö d«-%îlõð…@««ð J«Y§ºÚæäµ" o*Ïi•—üª©«h0PâXêë1$œÑ~ì/¢‚ÚNµ2XÊñz˜þh<BªŽ$m™BÂdy+…’.nŒ">hœŒ4 E#‚8ÒeOÑ‹Š<ö+IÉ-Å" É­x†Â AUš9` uµ€BE¬SËÞmËzø¾ŸÌ]ô³;+.¯q´WHä»3í¶Üï}9ÿjm¥¸|NÙë_Æ*3üÚ;Ïä~þ½Wsì´Û°§;‹FY1bžû¸¡qÕ3kv>ƒ+ñã‚fF¢žâÉ(ÑÏé¾Ú)§Br­¯Eô“pØô[ÂaoÐÃ’>è7‡%‹™¬ñð^ÑK¼Íz%«Cj9¡Ã¬ëÓèT‹!":w0D/z½þì‰î „H&$‡‡¶† ÀMZº´§]’êÓuIE£R³ƒÎ• Pmÿ!vÀ…Ê,Q)!ŸŸËüäušçõ Ñó¾?½òŠ ƒµÂïE»äšËð¼Yê‹«vK»#G˜o^{f¸ðÂ@+Æ+EŠ Ñ¾èÖè¾(Ƈd!*!0XC4ÑwÑCx˜ì—ßLŒ;–‰Ëñ}qfÒ|úžŠßÓtêÔhX&šNõ4÷™õÊë*P†ù¿^”µ¢(XcÕ×3Ïyï÷•÷vIîÞþ+v¯Jãßæ"ÿåý÷­¬7ig>ºé­^ sPƒgËëmêXØ ™ºöšîº'Ð[ˆújð´Á·Á ÚáÛá¿ßÿ¤ÿSÿ¿ü†¾ºuD´ˆVÑ&D„(Ë[x+o£ÊÚî\Æ)oðÇÂÅyüѰ”ú«Ã Wn•ÛßÄ•ø¼6ŸÏ‹jjJù6¿?€pßLj؃jª &±¨ßg1kª­ó ìiÖÕ×½§N‘_ « ¨Žj%­Ý‘­ ˆ%érzÍL¯•Ÿ('#å£å¤Ü][7Œç…€ó†qÙÍTIô(ŒJ;¹.IÕ6ÈMÕ¶ 8‘þјZu€V5;Ê“,UH]J&éJ&‹¼ÚÓ³ŽÔŸÄø|&=W•c ¬h*Ò´ÎQs.™QÜGJÊš"n^ï˜R_6ÑTÈOüÃ5q’5^ܓ˘R³Jô.&I)þ9sÐ5äZ~zÛ9 ~üë¤êÓíËœ•-Ñ(³iý%ÌÂË«âQJs?àÖ{æ!Ü?h±€lþcÐXOyƒ¡^ðùxÁç÷óÆ¿F‘xg8Lüê°dú3‹Ö¬Ã!Áçļßߌ° ºõ{ÃÈÌ›0ö;CXxq:4¼SKȱñún K‚¹Ä‡¼¸Û‹‘w-ÈõaEü…Sý=ë(ºèª¹®àã¢:€êNªœéÔSËšZ ;T׿† ÒU°èÔïš®m‡ð¦Thcå䤵ñ_‹ÖûB[ƒ[CßA»ùÝÁÝ¡è@Ȩ ªB¥ª¸>l-õpÂpþ’Ak5$ËVKµ #Á†a7Þç|DWÐÜ ÚÍ^ÐØ¼-Ðô„¬µ¸ZÆdmAÃù“Åoká‡ó‚6~0hr¶(ˆ,‰’É›ÁQƒ<›ˆÝLÙ ÀÔ“m_sä!)ÓGæ5†Â§×¬iæÄ¾ùþääfvæéÈÔMÉf‰4»÷ë{U«N?rí@à…W0/EjÂ$ª`à,`®Ç€¾Ä£‡Pèk¨Rú.Ò×ÏŽá{]_9¿ þ3¬*Õø6¶aôsaÉH…Uò–[P¹ÏÇY-5B‡>êulu<ì`;Ó`Ux Τ”é6ôˆáúhì<„Dª©qAWZ &È %˜ F`©Ùkj@”l—Óí$œd ¥±è(l¤qÐH#¤ÀÙ"¥E–`ÂÎúžªCAÅ7À1æ¢;@" oû¢‰Ù—¶y½SzûErî^òÇyÓöí7‘¹[¯ªG£RÝULÍ>¸ýGa¹oâ ùÎ}÷ÞQðO­ÎŸP…À¶«Ç)¹Þ•¹8±!Äp&¬åÕI.ãâÉŸæt8˜Œ”Õ”Ö$/OÜ–¸­ô©ìpéᬵþ,z™&ÛÑB¾F¬!5OU€F[ô‹A‹Ãø:¹#°yñå5gý¸²J£Õ¨“e%ɲh²,ÑTõLÕ‹UŒªjRUWÕõUwV=\õƒª—ª~^õÿTWéûªpU£MÒ,×\«QM£f¦f“æ6ÍÚÇ5oi~£Ñê5^MŸ†±Y4ŒË“ÐcbEº±“TÞ‹zÒiâ’É,ï]‹]k]»ö»Ž¸ÔÇ]Ÿ¹N»—K6 YÕDÏ—‰eé²–2UÙ”D£$ú)Bim‹v‹öˆV„„ ­@|¿( róÖf"7÷6“æ'íØî¥oWÒ]Ò’÷boÕ µ¤¶’•¥hv-{’%Vf»Ù^Vź'Õ]ëvÅÍ <Ù5Þª?ùrÐÓ Ö_€T=_Qo±Ô'Óp–SÔ@›85&¸~…FæÂ²R/¼­šLMM ãñºÏ0¸ü.‚z(:ª²®Á'éFÅGý±PT«™æ2µÀà Lm >cëÂÕ©To)À¿ øßx#^×߃ à~ÿP-ú£Õº"3g=†Ôå EEÝUÖ:©Ã$7s…VU•dÚ3·v¯ÆÕN¹¤µÔã‹Mkl¹hÝ;Wݼ×iÒÙŒo r͔ñ;U¹óÞU³×<óíKW×&ü—]L–T´Ï¬ê¼©£ré½¹{äuMo›q®Ÿ:§¦¶\òÒu$™Syaq¢8ž#ó– r N‚]nsDtãÏe¯ÛΨ1½Þ´Žç½!!ŒÃ²ÚcIP¯øŒjšÈu“²Ý‰ÑÉ$äDw¢/±/1I¨&âÝ¢›¸KÍYÀAº…aT`wɬ~eë©_ñ½ ù‘!wˆ.º#C® ’:Eês_ЫL}Z—Tš& MŦ‰sš~U\‡„1ª“ŒIP×S ±'ª2²ÑHÌëñy§£QU8ŽýwM¢ò‹c1@!M ~ŸWÛ|YºžíÓö·Döhž`×¼ ÒlÓܬ%[T[t[Ä-Ñ=ì½²þžØ\Ü(tc¶ È®oYª5ñþõwô>Ý»é›f®¯ßVë’Ux;§›ÙX5­¢&>y;sbbSÿè­÷ÿë¦LÍrÕcs¬>/‰N<šëÝ"5NkxöÄûÝ …5mV~ŒY zLB‘¯ü’Ã-^ }<ð:y]:†?Å¿'j—‘RÛÅâ íåâzízݺÀ½Ög­ÏÚ†ÉaÛÁÀaéõÀѨa»1&ß(:\2ŠO`¢Â6@!«Ýåv4cóŸ]1½:Ô©Ò 4%1%E¥»+f Öœå1Þ‡àÏþè %xŸè#¾Ju±M–$³£j¬.Xö¦¬Ú©û¶²’%ŠuÑÅ €ÈQר:e9ïšqO}¿âU.n¼€Ä­ë*+Nmq/AY“âE¹Sü_5Œ,N~}í‹'Vl>ögÚë»´œÓ)fÂÙ¹ÓjgTÌÿ‹ë[±ç#ßÙ×Âú)³–µ¸ÝU]oÿKc²¼à{œ òÒò@)¼I–î3>i¿²me£Ö™¼cúš¨+šÎ¦œ%óg±3¿~çJ[ †®»ç5ïÛöÒ½_lʶbχßW:qË·mâƒß{îé˜uç>`z@Îì(ˆ«åùœe†­Ç¶Ö¶Ò¾ÜµÑ¦Žêž o·Í¿ ¿`ŽÙÿÆüèÛb­iµgç1+˜µá Ì–ðMÌ-¦OŸØµ¥š¼k´Ú$e„ †Ñô°AÂŽa\rÀ³ªÙa2èµJ_=Ð×!»ÃYÇ*D¥ˆ’D_Ù+5e‘â¤1W#O:Ü^þ"¬ 8_)¥OI–BËd¾1C Xp‡ŠR¨X]ðǨ&“”]’ÉÂFØ© jµêÃÂÛýoø£ﳈä±98`ö°ÓQä'oÄ=IJæ~*HdaÝ£$´ÕÙ3kgz&òÚ…íKš.« ÏÞ8ºfÞÄÓßþÅçRÔ.eCøËÃW\Øv±cïûn<ò)¶ÿé‘ï]'Zªì•=8!f2`ûNÊ‹ä4æ¬b„ðR‹œ V•&Æ ³`4, ø“oˆˆê×Ã8"r ·^ÑÛâeöD©Œm³ã”é¦2hë².MwŽù´˜>žfÒN§»èÄeÜÞ¬+ˆw'ÒOáÔ¯J§½Ô0Êcþ×£ 'm4Z†âî2Måt¢24Œ@ Cưհ۰ÏÀQ³«WÉŽNÔw0I“òôOB‡ñ2ÌQó«–âJåk]ÿX?@"%÷±ðUòÔË@¿öåS>†ÉnQü`lƒþ¤ÊTD÷ÔhZŒ©˜+>)*Vµ`y5“j³T]UÏ~£J©^-,WœÝi¯²ãã¶à¼‰ß´TÛn½¿w`ó†é“²“8•Apúãd'Ó>±áRW”‰D°73“ÜvY{z÷È¢ºÔäšÖgæí:>S½Ãeô„LW®ƒùd)ƒ&¡™øyNTÐó-eÑÚ[SßM<¯:¤L,?ùrŠNW¥­æê¹Æà,V¢›Ð&Ä:±S¼Cssé^í©'ÚôrgdrȘp ˆiPGlÍ cÚ  w°{³l©o–cñl3ؤÙ]ÙL3nVvÃ]ÙæaF%Ûm6*¤6í½ƒ?M9]‘e†Ÿl®¸7­nùùNEØ,-4•u0Ú`'îìt5 çGõklÀ •®uj‚׉jœ¦kÃɉ²É2Üß’žŒùÉâd2¹3$ÐJA©0/ˆ†V¶Å²èŠd1Ÿ³$+‡bÉ2ú<jËä’D¶Œg¾lmÙ®2¦»l´Œ”mèج *ܱ&Joa¼ä¸OôôŸWªé妉¤²Å1N±tÛd1”M.O*: Y¨=„šáµ£0}TûÅ,èb ®‹‡!ê‹Á\¯p á$õ)ö¡"ãÔdtTÕV: Ƨ€|ÞòYŽ?“ÛHÐ^ˆ¼d:FþDþedýZ>æ ‡ÃR­ï"ã2ãÕÆ æ­Æ;½ß1îá÷OyøcÂ'‚ðŒ õx,%¶è á@i–ȤqÀÏ«¢š”XŽô œÍŽŠGDGsâõ×_o™x½e¼xØ¥¾>=Ñ䕯FT.D„òŒÄ‚åì÷ûÆbQgÒ‹:‡Ï):1º€@¯vÁ&Úň(IRiD,—$†}™~»:&Ü(ðü¥~Ÿ úâ¿OàMk2"*G:-:àÄAÿ%À²+‘vÝñ̲%ƒ3WìStøí0îJè°nï4­c°Ðq@vøº G 6ba×¼´´T1îÛ4Xó£‰ UÂÎü3(„fá±¢8Y8HHOhŽMŒ:Õ3ñ±pj ý=ÊæŠ»K8uÊ51FA1Üè‹ézá5Ý`项d®wÑ•êìÑŸsó‚¦IÓ´C‰1uÙÐ奄µ–ÚÐÀ3ÊŽªÚZ< ¤¬ŒÚþïŒõòoÚBe2þ~Ó›Vüöf€Ð9Ð_z¨©¤9ç/Jìéí¿jmðz#šh”©Úº,÷ã×\aà6—ÉÙŒùÆ'9>Wh€ÌF€÷‚f¡ÛkÁ̳ˆC‚È œ pz€–ŠÜÆd¹È)P‹C‚;9V‡Î€E=•J}A*i2”ÊfõE餩,xèñ.=FzAOô›EË>Ë€…I[Z,»,#–ÖBÛWd³4=˜*Ïšá¤êõ<é<³[ЀýŠëýüúFg~½þ¬à1o]FOÁÚ3â®üÖAfÉâT‚-QÖj5¼5¡Ñ Š»ƒÃ5µîˆh&ï§"b dd[¸5"6Ia>"Z%IŽãpDŒ“c/Hr#®ˆ—K¥É±C’ÔáTMHU¦ÊªÀ N¥F\ScIÜfÕuÊ€‰0vQ œEû::G:UÀó&žy—zܰlºéù°ûˆû¨›‘Ý»ÜÄý§P¸´<—RÊ¥Ô‘ÔÑ#§v¥HêOˆ¯kIméäV@úÃÙÞÖ­d_ë@ëH+“†h´•iuOí&…袖œõÍö¶š&Τ=My ¨«¸ÛØBO’gµ†r¡p”§¸¶)†U$]áõë,—‰ùblysj¿ÞÀcš« `¯!P0¯„¦‚£Š:"Ñ´¹e‹Ôhƒš@œµ¡8 †4j¬œS@GV¤·óD'á CÖ wþZÏÎfgkfigëG:Ù:2››mø§¢vAÿº‚QÞIOÇú•‰ì-ÜpþC°Ð*),¿`Ïœ<›š…zH•2¯/”ùâu¡x¤´üœ¾}³äã‚•o/Xõÿß 2µWŠVõ°ðÛ]7ÍZ¸)ÔýÝî%W§â éõ^‹-éOÎO™­9_<ÅÛÒÞ’Pº®-À<±ynÛÜy »ܶ'wãYX§Ù¸w ¾ëú)¡––œn¹'Jå@ª¸ßµEŽØÅ9ÝÒNQ WAQ ÌX r‘$*Š?y^_¯åpJñ–ΨîNaðb”c~C~ÍüÊÃØ¹j@’̯ñq/±ð&ЯIÑ$„„ä~þ¯Á^Ÿ-"òüÌ(…u€'ü¤øÑ.ªLJR(äy“ν‚eTjï0^<4Š1Î?/ÏsUã%9‚(ív…”6à}Þ†ƒ¶£6b£ðÒÐÒF¡¥M®®¡Ê†‚LÅ—6Š/m_ 6l£ ’S)’NõØ¢L¥’B'©"²L‘dªˆ0SE„©Ì È2å+.<ñxì,´Œátl$6cbEh+BËXRF²1wÙ7RA”Â92I÷ ¾á-E‹ÇÞá†~€”Mãxù¸2XÀ•Á3¸’§¸2xWòŠ7€âJžâJþßq%˜A먧£gÝ 8ÃÍÿ…‘ÿ“g_íÜ>ó’ël°d¼Ú)X’žyÓãÕ¹x‘=7Κº|Fý#¹»¯P`eÔ½ﻺ)´9§_U§> a2§çǘ€(„çÊ®7=8nÀ–‹5¦˜#µ3¦Öjô~YuÆë¨’cÉ,¯Â*Tð:*ÉÔBÒ¢$Cõ“²4•#%Éìˆ4*$ÉR¯D³¬,=,‰·ˆb‘GõX_ô9))tMÓƒSVï¦gC¶ˆW×õSÍY ^Á?YÄÿ_Qßï8*¨i\Q‡SpHˆ’¨g³Ú­„ãb^ŸÇçö1o´Äá-ýìÐZÈ¥öDZÙ`Šãc `«Î@>ÖGE£x*©[”aE ®ÇÓð4a£íã¶¶}î­Ü.Ã.a«û-ò†¨Û¢î3öñ[\»Ô[[ù]. =ÁÞ¿€.žóWœÏg˜S6p…“ ”ž1œÛôî•Ë7½ÿÞØŸŽVMsšôå©@Üh‹E=Ì«7|²óÍ[Á%¯¾“S»þð“5=S§»Ã“ãÐÓ[üö‚ß9ž›®‚¦`V¦ñ5²Û’ÖPg2Sw–`æ¬i ð~„:™?—õE?VÑB½Rj»Sm¶€5ÀEc¢žS›„NÈ^¥¢@ኢ_¹BñfvWŒVL…\Ñ]ÑW¡ª°¡‰Ñ"pÆ º #†QkpgÎÛÁ1œ¶†¢ÓÖðo;8EdzҴ¢Ð´¢Ø´âÜœâQ‚ñ‚Õ@EòÉB>®ÄqÐ à„ºì¿oΕö±}ú¾h_r 3’á@u[b}¥›Ëo+¿ßÏ>Xþ$»¿|˜=Rþv¹ ÝlȘ1SdÆÌ¹› QÅSõÍCmÕСO1ŸqX›•=ÛrhRuÇÌs6¿]÷õ©‡Â‚göÄXs]J»¢3K'×Ç›#—\&{"]ÿÃïäwÔÔ^ùuû"gG£¾ò©ø%|ã÷VƬm—ç>yÿâÆÊ¾žsÐ=ã²NÓ×ëm¡ Na1ÖÓsH^1›,"~H·ŠÕJÑ(Tó‚’Êq›#+$ñýî$Ñ»æ,O'&!ú…€à°Ýát¢ð#b@1Tœoˆ~ÅP‘"b‚2–_ÒUòr  V;_m 9(Áü:¾éãÅH…¿°[=ª>A¿Ê‡Ëz”࢓8K¥p¹Â Èf•ÔTR`eGv$ŒûÂ……0 P:«àÅ,X* :À¢Æ ~„&z¶žªµ¢çu­åVq©=³X<¢gw6 '±Š;±o÷ÜÑZ×ÖZ^=K­3ú= {« 麜zRR£‹e˜'~ùÅí-mÓ§¨8G¸eɵï×Õ ^7€°~a»>U¾'2F~ 4ª$;äEúŒ]hQ Æ„Mð'TœÍa{#úFì7§Â?uBˆ–Ö 5¥;ô÷H÷DžÒ_Öô¬5jvÃTý 'ëe±TŠh/1¦˜SñÃÈávÙŠöZÒP‘Mÿ-éÝ{½¢ÇCUh²Ûƒ=Ãx,¹÷:þf±°±¤ÚˆYôE .[ìY|‰¥p¾OÙKÒóÙB)LÝbr9ˆµhÂ&ŸÅéìììâìÚì–ìþ,—µŽÉpC!ö$JÎl?Z8£JÜUt=§Z”ÀØxO’® Ïk‚€Uá„4²-Ô¢i²K9¢P„¡A]ý¿ZGÕGáÆP°àÊ;!k¡‡Ð¥p7ùt ¤Ð‡’B74<ÛSrÁ˜ÒƒìÆr‰ fÐg†HðBDëÉFG¡áÔ2Nø–Àpþ÷C[!…4¥§û”†J»Cˆ,m¶l²hÅÚÎ4¡gË{’gY)ß9äÓ²ÎÜ’–µ&´6æ\°Ù¬ÛtÃs“U¹§—N™“ö/uŒ,Þƒÿ)-xm#ÕÕ-ù1Uó 㻡Œîq°ô"£¢5x ¥†iU½áßS¾aŸê õç¦'úB4âYdYÁª:®Æy5¦n"I*xFt»@b9Vç^®Õëô(† àWZÄeŽnXro5Þ8j·qÔdã¨ÉÆQ Ž£v§ì p˜çp;ÊÄ á¨§‹P{0ö[¤h¿EŠv[¤h·Ñt°´pzŽÍ7šÊn€#,F"$鋈M´c{)OõÊtl*Zo¦¢õf*t¦¨+q'M8m1š“[šuöÀ‚²(;çî üÛ,ãg÷¨µ €zX‘:›• g€"g¼[\aë©€âŠTW¾š¯fÞ)™”»©í– go.7ãë­ oÄ_RGm®‰õý]ß=mɶGðÕÔ¸š¸qYCÀê™Oý÷YÁÖúèïÃÛe… ‚-È‚U™ÀçWwàÉÀÉ€:@×hcu€¾zÌ'f[³ó8FmÒˆj•;½ê tÁ¬È9»èÎß&¯æ‘/èõù:xÁÆóFèRÞ9“Ï„‘Š‚ "ª.éÑ"x¼WàM˜õÁ²§Vsœé½6fx™ïæ¾Çô)¦_‡V˜ Þ‡ e§£˜ÁÝtdCM³³Ê½R<|VPüþ'*!€à=ˆ3zd.Y Ç)úÍ— ÷©žS®qtölwÑ+— [tüî`Ë]J&ùß¾ûy&QÈ×CqÙ ƒ ÐÁÁìkÁ4î91h«W;Mþ1¨ç‹g±A!²˜ê8€ê…£wVë9ÎbŒÿœ{½>èLῤͮ²6W§êqeY]]î-ùÕM’GšèŠÜ÷pz['Ñ(W³}"LélÎu0ã@ç4^ú¼²›b jû‡V{3=&5M7vzxzç—¯ö¬ö®,¿Í;ì}Ëk*±–ØêP§u/ç.W_n¸/ý$zÒó¾Û½ÓFCÚÄÔ"gw;D»@K%Âêbm¥öxI$iJ§;òiÀnƒ5€åkZÒ_s°Ú†ñŒ³<hrBYN¢K¹0^8á(¸V÷ñÏ[è MŸS—ºÂ_ôm-Tá¬S€›1‚b: É Šñ =Lq(eÁ^Hy¥þÄ Ézî¸þ5Ú—ð¶ð6R|zÔ,Áëú ›™JÇ ÜðΠ|A´qAÝ|þýÂ`±ä‚P¨£çãCvLÑVÓvú]Bö,™›õIŒ5Gä‘§“>3WêZŠïéWÝUà7`7ÃÏÞ}FÿãÅ|Ó—wáGDG}½ñLJO¼«W²W@[íÙ_"…Tʵ£‹ôõm¹ „öÿøÒW}„ºžF@pC¨„òBB; TBAÝ~öM$@˜Á«ú*çêÑ…Œ%Øy(¦¾Ò7‘곪«ÑjÊÃ}‹ ŸdîD³ élèg2ÔwA¹ƒÔ£RH§@šäžF3i\›iÂ,h?úŸ÷Ä Ü׬ÌPOÝa5ðÙŽ~‰NbÞFbä猉Sý]Ïuªg©_Óthe]F÷®þÇúcƹ¦&ÓgüIaļÇò‰Íg¶åXï"îO‰·Ôóý#pKà´x:x2ô¹Sf(…þŠšÐ*Ä*¿ÔFÁ<î0 †þ¤´°ç‘C~„æÍïœraWrîª+—_=kù† Ö^¹äªî S“×^±¬k.R|½ú_·5Ei«üê+ýW¼z(¿ÔJ§µ žŸA¨ Þx2š‚ÚQšŠ:Ñ44Í@3Ñ,4u£9èt!š #‡.FóÑú;¤‡ÑÜüˆŠjo¯”‡!M–+é`I¢ò½0èñU¾¤bÈýð(*ð Ã«\Aƒ“'35u…ÌPiªòx«Hð¢;•î*)¯(…÷¡O™96ätU®}‘ù¶ò*»‡\^zÃ/µ˜ºÍZÀ›( ^b¶2Û”™¸Q™C#ž¹I¹9?d0WnêÏ…âZˆwA…ð0!NCX æÝC&¾’‘Y¨Üý€~D?ªg¸n”;ÁäØn®—ëã¶r»¹}G€­E-sª“­mäC˜Ô}@ h+Ä»•œ \xT)ïVʽ÷)eân%'Aœ¡9ôõ´Û ñn´-Kgh‚*ü7P×ñn„üFö…39B„H0BPŸŒàÑȉˆŒDÈHk9¦ŒòŒò˜2Êcpç1åÙÇ _ÈA`´ï+íÞ‡vï+íÞ‡v4÷ßêz!îSr2ÄÝJN‚8CsäýA©–ou’½Ðãbˆ†pƒÒ·@X«”DÚ‚ì…X& ÅË*·“c ! ’@!ñ)ÉÛS¹¸•'@—@—@'´$Bh¡¥ü¹p m{ÿà¤BÒPu¼µ–J:”ûÑ~ÍýÐÍ¥!nQrû•6üÙòÄ'”\ÄûÎÞ·XɉŸ¹—!Àç~ÈñdÔn’õ9€,fe˜\e‡ÉÁ’¡B2H“V+a`îÊ @#þ¡?¬Äw+ñÅJÌËzÉøOÉøºd|B2¶êÈtÀF|R‰ÿßb®/6Š"ŒÏìniY(…” G;×»².»¶šJ¥X»½^ïªæØm5wP›¶¤K RîÚ„BM%l¢H´I´ÑÝ©+EÓÄÄø'$}ñI­5BTôE ˜€Šß7{RHxòÅig~»óûÍ÷}3ÝéÍ4ÛùI”{£+*•+•O*•Ó•Ê[•Ê ýž„¨ˆ® +WÃÊ7aåBX9VÆÃJgXÙV¶†Ñ”FBD‘ʰ¤]¢\]Rþ )ß…”/Bʧ!åTHI‡”ÇB §¿Á‡¦B_å«¢¬½°Ia›Ø5]”à7ÝÅW’e3’DwÅWÈu“å|ËHÜÚ°ž[MAnµ¬ãÖA€ÕÜgMˤ•Ô… ƒÝŠ+#.çú(ÐEÈ\ïXÂõ-,Gÿæzà·Ënr»à·7\G¸D'¶fè¯ÜžóôÑÐ,ý¨ÒYÀ·A}ÁóN? &ÝÕœD1 ú.×!8:Éu à®W¼íÁi®3€SÜ®˜àö8Àܾp’kƒhï5¢ ;'`1Œ˜áVè!n¡…Üzà9nÕìãæe€n^Á¦{¨Káɦ6ÑE¤=ÜÖñòy–h‚î$µÂòÜÂ!iA#M Mä;§Í¸°£1ê +Q®? 2“ë*@ƒ7rsÛ¨ãŒ1Ý̵ ¹Gó6âÏç­„0ÐP„ëgAĸ½‘á ‹v ˆ-!¨Õy¯%ÄA­â:ªŠ¹bÑ"b ‹…D¥'ϳ¿Àî-3GŸáìf4'SÎþÐγ_¬^ö³•ƒe-»Søìyö-HçM¸Œ±¯õ+ì+;Ì>×A ²Ïôjö±zˆå´6e•3sì^ö¾-,¼§B3Î&µœD¡õ›öVvB7Ø«jcxÄ/ 04¦bÏ«£l…¬u”eô2v@ëb{5t´– èm¬:²ÚôÙ{X>κkEÄ]úeÖ^+ú´Ež2ñ¤ÝÆZ  ‘€êṬ¦Õµ38F¤Š6O]fOo¾$Á§0=ù`´Úÿ¡ÿ°¿×ßáÁçÍþ þ ¹\"Ë+äår¡,ËKåY’‰L¤5øç+÷7k–#,-À²@\KXzÛ‚g ÀöÃYíKJÉö˜³ÙHæü·Ûœ:#éø·ïJ¹”¾”¦Igv7Iö†œí‘-ܱÓY‰Q§$I’±ˆéÅ%©½-Æ‚x ñ4¡ôÁ±ãAÄ–±ãé4)i 4–˜«¶´ÄïStçËDü®×ņqÏ]™óJ²=åœ)K;5xq»,t6â¡ÇÓÒ ´7Ÿ–ö!¤SÓ´_L´a=í§AV/dÄ”öŒX “:‰‰2¨ï¼KF]¨Ž»¦é‰¶QE0i¶ ÑNOÔ|·ÈwŒ6 Q³ï˜MxuˆF@[{]8Ô— Ye®ª‚%[E‰[£‚ÀUk½c‘Ö<úœGŸC:Gé"_«zÑjDTIñ?¦¾ØhD§Fö§ð°êîH¢r·sl¤?àé …Üý#ùS¬ÕîÞÝýˆ=}ÎH¤/îìÄCnCê>t é†HÜ%©DGÊMEûâ¼!ÚˆôÄÓS­£uC÷ø:zÇWÝè}Œ¢±:ôÕ:tzéVô5„¾†ÐWk´UøJ¶Åhr{Ê•I ßU8%ÂléV¤c¥ÅL1uê+‡ƒ $EFÚY‰9 d¤ªšªš‚)Ô <> endobj 182 0 obj [ 250 778 778 778 778 778 778 778 333 333 778 778 778 333 250 778 778 500 500 500 778 778 778 778 778 778 333 778 778 778 778 778 778 722 778 722 722 778 611 778 778 389 778 778 667 944 722 778 611 778 778 556 778 778 778 778 778 778 778 778 778 778 778 500 778 500 556 444 556 444 333 500 556 278 778 556 278 833 556 500 556 556 444 389 333 556 500 778 778 500 444 ] endobj 7 0 obj << /Type /Font /Subtype /TrueType /BaseFont /VXHDSM+TimesNewRomanPS-BoldMT /FontDescriptor 181 0 R /Widths 182 0 R /FirstChar 32 /LastChar 122 /Encoding /MacRomanEncoding >> endobj 183 0 obj << /Length 184 0 R /Length1 5056 /Filter /FlateDecode >> stream xÚ­7}\W¶çޙɄ'!@>Œ (…D¤ µb¢¨E´ZžZEl«E¬OW[Û­¶ênÛíZW‡€þ‚Úê¶öÙnío}»ëÖµ_vÕÚ_]ö«jwkɼ3Úú~þñþxsrïù¼çœ{î;7@ º€©¹Í· âÁ‹’³ØÆ6w¬´ì.*ŠDú_l‚e Û6|óâg §>²zÓþðÇüÔ;[[|ó¯9‹®£C=ŽÉkEAx+Û¼„ü˜Ö¶•«âFÑ>äç#ŸøH{³©`g!ß…¼¡Í·j™~ý9òÛ‘·,õµµÔlßtyY¿¬}ÅJe7ìBþÈ;—=Ú²¬ó}ûÐGu>êŒt0q„¢„j2Ú‡:àVå*! ›™y¢”ËØ±},A=ê‚o*dT/ýj£Á¢°C"¬ƒÐ×:ø r!#\&…È÷Ã9ø¦ÁCp*à 2z`:äCyÆßAxàex G¬†v´-ƒŸ€GSÞFY¼¸!@=zy~ªœ†}ðÜTö+_ƒ 6¢ÅyåÏàÀÕzç”)ès1,#Yt¥ò4b¼à|Fb•BˆñPnX­ÐKá)Ô½ çá#’ˆ³É'Æ)ƒÙ°vÂó Ñ8‚p³:'ð ?_À ÜsßcB´:˜±N’O H!æYJÜd*©$3H®ÏlRO|d1YG:ÉSdÂKd?Σa€'sä#„+ä/ßRŽòÔLmÔN%Z‰0ÁG›i+]DÛèV„×èaÚO 0…LãC™SÌyæ#æsæßl»’}œý5{–½È^aÿÉÞâ œ“{›¥3ëòuºWt}üþWüEðcÁqøñÓ «é.útÒ)øž½‡§Õoh9®Ä:ÒG^ÁJ½Šûv<Â'BB(ÂXCRí)clÉV‹8:)qTB¼9.6Æe4DFáa¡!z^DZ %鱕y-²Ý+³v[yy–ÊÛ|(ðýHà•-(*»×F¶x53˽–Z.ø_–Ò°¥t×’,P•iñØ,ò‡n›%@ª©Gz«ÛÖ`‘5ºJ£·k´€´ÕŠ,s«Û"¯Å#—u´öx¼nt7 ΡY™¸1°aªcJ}ëZ͈T œ`s{äx›[Ó1)ß|¹º¦Þãeµ6deʤ´ÙÖ$ƒ­DŽÌ®Ž³ im=ÆÎÊ\¤æ[ÂçÛæo HÐäU)ßÃõ2ãk©WaÌãln9nÍUóìÊóÌ”2M)óµô”ai¶”³^•ó=ƒ\åL º¥êe²±a8 -÷áY´Ø<ªÄ»Ø"‡ØJl­=‹½Xs¨­÷'H ›ÏÝ Cu½?^Š×˜¬Ìsçd+e «8«XÅ“­æÎa|íÉaùïN…iv§/!®¬½[¢F²MÅ4eK³ùNT»–‰ÐÓ<Íði 8ËErH©·Ç0 GÉ\ŠÁfé¹ ¸P¶Á¿Ü+ñHt)†› ’êrÞݨ¡ñŒ²âWìyüŽ1x>”öS2•ÓÈ,)X~*¡;•ahBˆŽŸJ ^rÝZVkÎȘ~£ j¨`ºáVA•a¨Š † 7°ËqºŒVc*6+׸ýWùÝ‘óñ÷)ÚW·1¸“¶s­`”.°Œ fÙp1 ÑÑqq ì!}¹1>*:@Âú¬Oªº1ÝÓâþŠŠ¢òó‰1*¼ox?Ç7!NÇ댆¸¨8ÞžJçºEï÷¬Î®¹”ðø¶A¦‘ðû›¬]«Üüþ—Á ;­“’$²´|ò0Ÿ)˜ *$K%‘^‡?&,’ÔŒºèXÌÉTv(2>&VË©jÖpN7†îÍ). ZJ0()ñ©yòŒ†Tš:!6.ÊH§L¯œñÔìÉÑ/NéœT󇄗»ÿ›4out¶•'Y[s4ñ(!;­õþà_ƒ1·‚Ÿ[xúFcnö÷XÂP=C@½aƒ™íÕ]Fôi!ÞsÚºj$³¡µƒšG’«Ìw¹îd—ã$sYÌ«äŽ·Ûød{îø<׸ØrkG]´wjTh騲I%Eó«ÙÓò:ÇFèù ãÓ¦5×c.Ÿ(_‘“ø»Í 0º~,Þ±®úÏ‘Àwƒæ8Ù;ÎM:]Rêp”;Í**q8J±ö¢”A¦—óâ×w4ì’’ëáWMÌ»ðG¸ Lärù3M¯Û7š‹Ø+Ðî¨Õ÷YB»”ïµˆŽ³7 ·¡h°ã•®–&BR¸Ýœb²ëSí†Ö.Ä…æÄÐ\Â'!ÅE"‘ $»Qº\±ËÀGëFž dù\˜;&Ê8>•Ú’]Œ).Ö¥î<µ&§Ú† y.ºn©µðÀ"k²$_^ßRøXðÒ»ë»ç<®¤à'1盟ˆà×Ïþórw›üw†ÎÈÁ#}'I9¡Ç†Ô}‡wH&…k„Xh—â;L›LÔnÊ3Ñð¡&ý¥dæßMü%›é’ KýÑM¦é”ŒB8CY} §çÃÍX{ʈóHx¸g>AV•¼JæÂÈ{‰/äÈRáÒWÝüžÜÌÈÀ½‰‹1šbãb¬¹¸ Œ¸’u|nŠ‹6‘ÚeCgWW˜ÓfŽ!íá\r{ZÕX6q´.ï!æeç¸$Câq¹7ÃÁ_úb^dÁMBôjàöê»8*¸O”VdCîØ«XAí²<<È¿«¹óðÜ°ÒЈ-¯âO`{/âQØ.«ÿ Î’(¼u£fm4óÐé*Ä ©(úŠ  Œh£Fbè÷ìšÒŠ’ŒºEm-+²jÛÛ|KGîû ´@ Üïá±…á„H<¯¢Á$E†ü¶ŽDÖ‘¢sédo‘ŠrC8µÞ¢õ­r[ SEÛy²]Gþ^<ƒ²(þe°?EÕ2Q@Fê$ÕãÉ{©ÃHQØKÕ¦Rë1½õTÅz؆ô6¤»(‡X™µ£¤%í(iG ó«Æó43S£ÎÐ8'rEÈ95ÎÑÈ94N¤z?ÑKÇÈUREjDŠo/Oà…® š@$9þM3Ä·Èk`lÓú'¤‹ð™E¸h¶Y„õá-²ªQñˆÖ)¢Z¸P-”V EÕ¤já8™Œ÷N0’)Mx3M¤ ¿HÖ¦ iBVŽîÅ¿Bù…Ö?+Y*„o+„÷*„*„š aA…`­š…1‰Â¨D|/:FîˆÜ !HöovlGÙ;‡X ßq‰™yb€lö×e"zÒ_÷†XC6@:KpF]NU¼Ü^Mœ^Eœšþ?üŽt¶Â_ø2¢åþÂ+XŽ%­)û]WP:Ñ_×(‡׈ÏqàÖ«8Ë_¸Õcý™ŠÅF’ Ù$ÅcÀ¥©màÒÌ“G°Î_gGs®UÒ„øÅ`w€’£âmG­x+;À¢äfv@è‹ô}Ã/~ê@$ʼn;Å?Vˆ§ÑÃ;uWÄ“ŽGÄc™Ú€_ºO¨Þáu¼¥¿(…‰¯:vН86‹?+ÔÔû\š¿]uz.…GÅÍèfE6~øýâ£.5B˜¸=.ά›Qü¢)fgNg:Ž‹5ŽGÅѦº5Tî8¦MçI(N‹Iâ…Š“Ý8¿˜¯÷‹ã‡ƒËÖ¦—S8MÌÀé±Gűu9b2†$R–øàB~ÿ ?Ïå¼OáGóI¼I¥7è#ôáúP½^¯Ó³zÜ·zS@¹$e¨¯¹IgP‘ŽU{V£ FþÏãËH‰žâÖ e£L¶Æv™‹¢ ùeîûtÞ‘>ã~O’¼«rf½| ©A§JRC¥œ«^$È5rÕã _ª¨y+¹æ©ÕäVwCƒ¹RžV] _zP±ïéªòKà} *åYšHG‘{êT„~h¤«~pËæif›‡ÍèÍÜ*RÍ®€C3sÐ+šÙ‡ªYowºÇÝ›ž®™pÙЭ™tsÙª |8s'u÷:šU¨LœZÞÎPYs”¤9r¹Ð¤Ð¥šôŽs¡A¯kœ¦vü ÎV׫k5õœÔÙÃê}Ãê}¨ÎøzZJþov}svoØ£Þì½6O 6¯¼¥ÿ¼t5Y,½v\ùíÞ¦æVûZäݶ·¼Áæ¶ôÎÙsõU=Çæî…=žºúÞ=R‹Û?Gš£ý!èÛ´u¹çžX›ïÆZ¾õ>ζªÎ–«±6yî£ö¨êMj,Ë£ÆÚ$mÒb©só,šY²â>ÏÊÇk\±¢þŽN  endstream endobj 184 0 obj 3648 endobj 185 0 obj << /Type /FontDescriptor /Ascent 750 /CapHeight 0 /Descent -250 /Flags 32 /FontBBox [ 8 -179 699 676 ] /FontName /DWQCJB+Times-Roman /ItalicAngle 0 /StemV 0 /MaxWidth 1000 /FontFile2 183 0 R >> endobj 186 0 obj [ 333 333 722 722 250 722 250 722 500 500 ] endobj 72 0 obj << /Type /Font /Subtype /TrueType /BaseFont /DWQCJB+Times-Roman /FontDescriptor 185 0 R /Widths 186 0 R /FirstChar 40 /LastChar 49 /Encoding /MacRomanEncoding >> endobj 187 0 obj << /Length 188 0 R /Length1 4368 /Filter /FlateDecode >> stream xÚÕ—{\UUÇ×>ûœs/ˆpx\@yÅ+!Þ! z1-Ë2ÍH|\øT†&”僔cì19ŽCÏ)¦¬)¢£#ަ8YPTcSNˆ9CŒ5@ŒÂ½óÛ šÏg^ÿÎç3÷Þý=k­ýZ{ïµÏÞ—ùÐ&’ä\QQZE‘´–¤øw­Z½°N‡<@¤¹ªÊ*JCª,"i‡­¡ìŽZWñ„Qˆr‘¾²|UéÊÞag<‘mÆ+Ëað9.>"²gA¿¬¼bmMBm9ôb¥ßQ¹¢Tÿé }ô ŠÒš*»%¶AzÔêÒŠUçRklЛ¡GVUV¯uï¥ÐOAϪºsUUÉ‹/yÁG»l‚ÔxÔˆL Ã3šìøj°JÒÉ ìDýt’fP½ö Í¢EtˆJDµˆÇh»H¡‘;ƒ^¡:Š”C)´L6¡ÌuÒ>êÔ–Ò h.J×&á¹€nB©FMÓ"h;éæ«Í/Ó“Z£ØHOÓŠÔPr€ŠåTA™Ú T¢ß¦mŰªµgi°¨šJ´ÙÚ/véC”c\5x‹š©IVhçl%4G £õrú”ÎP¶–CË©A[OÛD§hÝâ ­ˆÞ‡Åˆ8iÌ㯠£ ¡~ãµjá´†Z¡‡Ó,©çÏSóIIð_%—xÌ8!žÄø 1ú~J§Ýôì»Q®™Ò±º)žÓyºß$¹ –L£òa¬F‘ÑIKD#­3ïÅ\!O¶ŠÊ”»Œ:q”uDˆ³fåêÑZ‚YBõtÞhÖòµnZOuÚJ¾AŸ Zæ#ÀhÔêÄò±9¡Fm7(3çR¬H¤1@E‖B–l{¾›ãíœæc^M+>Ñ/†ÍT3N´ÃQ8dfS¾13E›™kú¢Fæ±íž­=´…Òœ6ÓÐ¥&(9ÊjÖâ®]Ùìü^qÔ±ÅÑ)Éÿ¢FY¶¨f*lžXµÏã),ÖÃÅÍÆäfgoÖãbÏü·Ì3)Éó ‹£ö ÛÜ9ãÍÎ]6Æ…Å•3ìs礨ÖÈåÞ©»Œç¹6 q"ÄMa74R;Nw¤“ÕÕÑÕ‘èíííÒi¤Z†œuï´ùs§™D¼F¢!‰Š)¶‰‰“%M|.&X†Ñó1k‚Œ°ð‡E‰R÷ŽÐã¬Gd\bœx¹ÕÕ׎ŸÕÞ‹Ÿ.¾¹¹é”š×;”מaõC‡57-.ãÊœL¸1Sdgi±1š#(8jæ1CdÇSvEG‘#ˆl½­ì[êhçSû/œ8~aï3£©æ5e#߸‡DÈÙb½{èë}×–¹w‰5‘—öw ÍíùèÀߢÜ;D¹ëºÚdüÞHvw rŸO®åñeã½sQ:‰®uÆxùØu Þ¦?A¡ûùl›àkLÒí(èiñf ôd ôtSþ«AaH}í}}Ê€_šˆ½BL1¦Ã?(8ÓùgÅOÙÑúᤴƚîÅÓ–Þ;ºú¾…Eë¼õRyvÇýÉ·Œ¬½ýƤ$9«FVÞ½p|îëdµXo4ÓŠrZ^äÝ.ûx{‘œ0}“écu…õ… oxƒ.gŠÌŒ`Gi“±'½S“"“¼½ÚbùÓ£¬Ä@÷"´'Zݺl0†É‹bº·Í#ô­1ê­K*3]Þh©íõ ô©ÕJ_áðõ·®” vÖl Ï =2p1Üööo‰[×òÍL ¤Tg¸¿ïo›.Ènøî  Þ:•ûšÒÒ]AÖ@ÞH^–ZµÞwyN2ý-Óæ˜"&‰XÌÏ’·Ÿªï¾x¼þiÑ¿,øÈÇZúh7–ÏÇß§ÛC£Zæ'Gy ³eƒ™KÍ,pÀ _òÃûÙà·6B’‡ü ø«C–2”p‘ÿ?£N…™#&>6&>á 化¿§É µ-{37#¹¾hÁkGüòµœÓwï4ÜÜ/a¬Ùh3ЉpÐIj.ÝP¶·§ Ì“–_of{ž­zö´À.#‘÷^­-H"CØÕD[ê<±ð>³cæ …DP8$oÒ…ÙI€g ž¡¨cBa(JN¤)Ö‡_}š7˜gÖƒ£ƒ”:úÁ¤¯¬OGGÓÓDtN´D 4c£0ØE!6 Wm¥ÌŒ=áÒö4½ú¡KçÓô—~éqé¾_l¡"´=mï`¯û pö^lÑN¬v·®vO{|,Klh¯<â>Ø‹ìwÆb”Ó£Á« oõËTCSŸƒû/Õ~÷ô´¸ñÁŠN᳕ë£8s¹÷\:mßüœï>^úIr™qäÒ;)[\Ä^­r€–Œ=E+Þà¸P =JŸ »H·‰&ѦepK^t7Ö>s¦fÚ‰5 Û—8“ŸÇãý™˜Gš=oñM…WM]X[±¼òõÞäûeuOø¯7x´M 7I†¢¤{AeÁ$EĦ¢›9Êa^b^d3¿e1™Ì¿2¿a~ͼÀü ³Ÿù³ùgÞbù<}I+?çYS²¤s,÷2Ï2{˜_0ÿÈ<ÃüŒùæiæï™Ÿ0?f~Äìf~H÷#n &l*G‚NØ”EÒ¯(|g¿,ðÐ븩e¢Üë¸_HP•ká^c_›éUôhà©l¯"lJS=½2Þ‚Ê‘ já%šy×y‘ùóÜfMŸgù9¶ÿœ{–-ÏŒ·÷ î¨JSí)‹¤§¸Þ“T>5‘Ôȵƽífù§Ì]*Žé'4 ÜÉ–Ç™?æãÜG™pŸsîD²¤q™Î}ˆ¹×ô‡\æAæ¤Þx.À·z¶lcn­4š’%n[[xʃMåHP͈²¨Ýªjn`Þƒw‡*uϘÆýÜÍ¥jÙRÃ\ϼ‹G½®`l_WÓ45«Ç4®©,÷ç*^ý5œSE•¼úU¼úUì[%­¦xØ*yõ+Ù7e‘t;×)g–1W1W0oe–0oa.eÞŒÿ j¯ßÌÚös1ËÅÌ01¿Ï¼‰¹WªˆåBæÌ̘×3ç3çy>‡§×pûW³eïè«XžÍ,`:y4³XžÉÌgæ1g0§3sQ["攜ÃÌbf23˜é°IJc9•y3…™LóÀ©,_ÎLb&Rú0ðTZGh<ËqÌËp›ð?ŒAÄKüÿSö(Ì‘ÄÿU~ ["XžÌ /‹ƒ0æ$î;”K…0ƒ™ŽqZ˜ ÜOâàGÛq͇È=ŒçðnT²D7SÕõãÝåË–‰Læ¦7Ó‹igÚHÝZL¼]%ñE|Fñ9$qÚE0UË‚ý_†Ñ/ƒuZéi¤f¤ƒH6Ü^®ßÚ ª§þO>4õÿîñw+;Ò• endstream endobj 188 0 obj 2671 endobj 189 0 obj << /Type /FontDescriptor /Ascent 701 /CapHeight 0 /Descent -299 /Flags 4 /FontBBox [ -39 -250 718 778 ] /FontName /BHYTPC+Symbol /ItalicAngle 0 /StemV 0 /MaxWidth 1042 /FontFile2 187 0 R >> endobj 190 0 obj [ 744 603 768 247 494 494 494 494 ] endobj 105 0 obj << /Type /Font /Subtype /TrueType /BaseFont /BHYTPC+Symbol /FontDescriptor 189 0 R /Widths 190 0 R /FirstChar 33 /LastChar 40 >> endobj 191 0 obj << /Length 192 0 R /Length1 4532 /Filter /FlateDecode >> stream xÚÕ—{X”UÀßs¾Ë\ øf`F.LÀ  :xI¼¡ë*)‰—+.…–d­B*c«UÉuÙ²6ݲ¶[,3WVH ÜZ¥ìbÛZ¨¹‹lÛBñ(Ìì{^pŸgoÿîóì7œßy/çúžs¾ï a3HàYUQZ QP‚–nLñ«î]g«\X'£<ÀC½Õe¥áÕ€¤G[cÙ]µÞÒƒ;Qß  èË×”®¾Ôä‰ÐïEÿ¤r4¾Ç>FL(¯X·!QÓMF}XèwU­*U~«+0ØP­(ÝP­×Ø6Ô'¢n«,­Xs)eƒõE¨ÇTWÕ¬ó‚ÇQ_‡úÄê{ÖT—¼è~uLú@´1ó3R!s;èñÇpvdP@‡v€~8S ?Ó`1´C ëƒV¶¶3<‚Þ)ð ´Â L™à‚Ò~,3 gà 8×Aj^Hãã0/€EXª™së¡5A;âÓØËð4of›`/CŒœ€%`‰ô:T@:Jä;x=N«†?ë™5P§ó‡Ýòw©Ü Ëà´À~©‚_Ò•ÀL6„­—Ãçp2x&¬„F¾Gz”amì,ûŠÁûì8f§”|úyq–áЯ´C·ÂÝІº¦Iò˜?_Äœ8~‘¼l‡ÒÅžÆùâìû! öÀ“h߃åZ W×%áÈá2ÌÅŸSÚ–t¥åã¸EÊ(fͰ^}c…>©µBº´[©c'HÇÝfvA‚lÙÎÔh€ËJ Ïågá>¨ãßaÉ×á ¥‘ïÇx˜•f^ÇVŽÆ ”"Ø®4B(FÆŽù2\‘eŠØaîMÚÏ\ò.¿ÄÕ›aµÒÇúÙš¢Æ±VeˆÔ±v5rÙ°šÎŽªÙjÖ¨Ã8ÝX¿É[!Õ£SYâ ’mZ ›³ºÅsëÛÉ¥vWò¿¨6Mgk–jmoøý…Kd«²´Eß"Åé[ä8Çùÿæ<ïJžW¸ÄöÓÍš9Öì¬3Ѹp ŠBC3ÚgÍt‰ÌÁëk’½Êó¸wuî1È 2½ÂeHé>×ZOwOwjˆÉnг›ì^†k$ëð_“.hèÛ{T§hC•ù(®b®v¬õLš¦Ù´TMÖ÷E›cÌ)æifÙ\ÆÂ&ìK ¶1Û»`Ÿd&«v›¢…˜eEi5è’ÉZÏIüë9éFž#¦AJÇrwï€@Ïr¤RãìîI™é8¸ôhÆÒIvÜÄ’X¬ªs[j;iv¶˜×¯™«s];èÒÍe3»ªfÈ.—<ûή;òå”ypéf¯ÙR6GuÉysÊ|ÛÙú²9<7c¾oî­YY·²¶ùgÊóçzYxàr«Ëp×L:ςĘØh‹Û¬d§º"ÂŒ,Ùš:y[†YqF?Œá ìŠ‹ÝæHMK´X‚¬‘êXu¼1Ëš–m´Ël‚<>r´žœ^÷ò^wOG¯†BÏÅ“9ÿ0ýî‹-Ïéwkî~·)\X)¥2ÓÄø„ »%ˆYLSY.›8)ÝnqĪQ,TV,¡aá:{†ð$ o|C‹ 7Œ·l䕵·i¬}":c\œÇíëó])ÜÀGvn,¢;/.<#æñ± ¼~ílÅéTf¯Ù°ó¶·ž’å´~yú3C×Ú¹’Ó)ͪì2|vúËG¤ÉòîÃm'w`¬ê¤vŸÒ‚ûÃæÑ `ìŽ LÞ¬j=‘}á89m 'Bò„ª:ÉqʘâŒq GʔܬD›–â[Œ±gm>YjT†ÀY6ê6 ß+#FY‚2ÕkÄ–ú°½Þ>S¶ cCQq˜´IRãᦆO”¡©W­Ê0Ó÷ÒÛ¼Ø'ó\5B Åc5u2½<¢øBŒ2”©’&{Cµœáœ^S¶mo¯9‡‹aÌ0¥›4Ug‰fã˜סøígº‡®¾×°—õ¯ëü„§œõù?4žõÃÈžþé šÃt©QÍ ¦æYpAŒß…¾,xÌPòC0*&:a2”a /˜þyn8”Ô8±¸–ØxGl|ÂMb0<÷À~5B·â­lwrCQÁkÁ¹|gòž&ÅGýÎ5Û ñà7K‰{em@4ÚÑûÈaâ¹ jÆ÷]ú ѳ¿‡Ó£$Òû! Öå9Aazñ’À¶ô¸©5|çê1r¤†3ˆ+JF<ÙÐaLZ͘‡`uT”Î0KÞÑÚGW>ÏÌÑÚ‡ƒ#ƒ2òa'¦+Úç#ƒ#i©Ìži—0…¨Fì¶pN,¡îΔ®mO•k»v9UéW~ß×¾‡Ø,‚Et¤¼è;Æ<¯¶ò®J_[¥/kר‹=ÐQÕé;vÝïíJ÷¯w•Üœ3(¦&žco^«½žû[}xâqÅðà}ÿ©ŽÒ<ÒŒ÷‚ž×Îé·üÃsý1ȧÀ«8ánupvÏÂk“ x4gmø•Y‰åb¡™¹Y1ÛÊŽ°!®ñ‡¨%Üko؉H{p @÷5ÞØØˆÍcý©G˜ž¿tQጤ…µ+«îïvz|/‹»Ìx ÿnÊóóÍLH¸1%xÉIfDĽ)è#އ‰×ˆW‰CÄï‰ß‰Ä¿¿%þ•ø ñ/Ä~âbñÏtþDòeøVãþ¹Lš%¸DòEâb/ñ+â—ÄóÄ/ˆ ž#~Fü”ø ñcâYâGðî[sj§Éve~Oòc–÷Iþ±›Ø'‘ï‘ü.ñ$ññ{'ÉÄãÄvâoˆG‰oß"†7á×áQÍÿö/,Þ áÛBÁ<Œ´Íè9„·3mÂ#!=h ~ näëx?‘òüpo“éXî Þ$¤(×J=¼FcmW±Gsa{÷⽨ ›ÐDO¯Œµ <R´ðÌCùÕy‘øñ—Ôæ~˜ŒÜGòódÿõþYžkïY¼G M´',I}>AÞÇq'Kðc*ÓHÞLjÛiM¥2ñ†|Øÿ Ž­,Ûˆõc{§¦¢&d o„[i>uT¢ŽÖm+Íg Æïz¶g CÏfØ„½*ä‘"›àGƒ6á‘""Â"N«¨ùq#¾;D©£õs?•ª%Ëâ}Ä{iÖëóFÏu ܳ°fͨF5…EÜôªiõï&O5TÑêWÓêWÓØª âÑVE«_Ec î¤:åÄ2ââ*âíÄârâ2âmø¿8ë·‘VLã\Jò≋‰? .".¤•*"¹x ±€¸€8Ÿ8˜ïÿ#Žt6µ3YfÒ‰žAòtbÑC³™FòTb.1‡8…8™˜µ%ÜsBÎ$N$¦ÝÄ4´IJr ñ&¢‹˜ ùÈ$’o$:‰‰€}(˜ -vh<ÉqÄ x›püVd,îx ÿGvÆHÂ˨(M–(’Ç­y£û ’8ŽúŽ RáÄ0¢eŒF'ï'q8ŽP²…à÷hj!Ô£yÌg¦Ó(d ëøˆ¢n0® ²Ü@ $DQOÔ¸µ¨øv•€¾Q@ß(ú‰ÿ¼£ˆ¢eFã_³_ÖÍØú˜öbjÁt “o/óëYMÒÿä¤ÿ»'êï¿8ò‚ endstream endobj 192 0 obj 2807 endobj 193 0 obj << /Type /FontDescriptor /Ascent 701 /CapHeight 0 /Descent -299 /Flags 4 /FontBBox [ -39 -250 795 778 ] /FontName /BHYTPC+Symbol /ItalicAngle 0 /StemV 0 /MaxWidth 1042 /FontFile2 191 0 R >> endobj 194 0 obj [ 744 645 247 795 494 494 494 494 ] endobj 80 0 obj << /Type /Font /Subtype /TrueType /BaseFont /BHYTPC+Symbol /FontDescriptor 193 0 R /Widths 194 0 R /FirstChar 33 /LastChar 40 >> endobj 195 0 obj << /Length 196 0 R /Length1 3532 /Filter /FlateDecode >> stream xÚÕ–TÕgÇßÏó|¿÷¢!^A‡Cï"’’ sê‡Î¦9Âe茉"rJäNÔét‰2ç ÙlFFæÖ"ç–»c†Î–ÁQS'n¦nö[¶üUJËÄ<îíó¼/îNýÛ9}ïy^Ïç×óû×…‹*äÌ+/¢'îK«¤;æ-[â_4½Úù" û–”'}"wŠ­vÁÂ¥5ÛÌF@Í.›_\r>.'p$_(Cì;êàúE\V¾dyï%²›g[]X1¯÷à¸èù¢Ç”/ÆôTO‰^(ºQqùü¶kEt— +*—„ßÀ³¢×‰>4¸x~°è•‘ÛEo–â±bS°ã±#ò Nò´ü¬­Ç0ëõŒÇ ´ H]F£Ú„•Ž âƒhÄ!IÙHÇÓ 18‰=8©gã¨h¥ÈÔ·K> IT½Ö:KÑ¢6£EÇéñê5lÕõj5¶a:©y …fÊ‘¥·£Èùº^ç*õKXª|¨D‘ž §õШs®#Û„Ùx!4˜r}Á[„âÝz]­æFçÓÜÔ¸µè+3|¶¬È@÷ Ô^ŸiP;nÍ{D_бžI(q/«vuÃ3“¢Ý¨V-žQ§:=YjŸg´'NJTË<î[¹nuk‘‘ãõ¸ŽÑ Ãý¾NùbI(çË…þÃ3éÃÿMõû¼þòC½Vø÷D"ù…N’;3äÞ2)1!'eÐÙÿæ<›>|J~¡òNÌë®vâœ<1N/Ñjbûļt»k5JÛR÷e9^$æôpàQ1®v0¢µ­5¾S­§Z3úú¤úJtVš¤ÎsáÍÞ¸W{ÒÀP¨¶:±:MêHȉÑQã@9¾S¤|çå pb;§š]jkÄ›H£œ×SîP¶™Œ%¹ipUŒmJ’†OÖ1 è'ô!Fb’Dê Gõ€W$±ÆKž y)ãYÁE‰ì…¾®œÛ1Ö'ð½ßÑÕ]ï”tÅw¦«£+S:•0’<ƒüèãCÀŸè2è.ô달‘ÙNêÍš §rãÍKNâ«?„/†ŸT«TÕÿ@ÆîŽóáf•sþ“F}tQ¸iQøî¢.µê@ÅÁpóyq‰Î Óª«£Þ}¤÷Ø;4û5¿usÅ­<Ò(³Jfr{Dï–që»êå~™Þq³-fͧž[ŸqŽ¡Ô)A¡ìй¢ß%wÚNF<GΠæ,æÈüÂ{‘¾hoâ»ëòÈ¡`´û˜0lúŠò¹ í^à~ÍÞwÿá3Ñ,7¢«”‹0ŒrHƒ'„š²"a‰&»ÈNò&ù yƒü'yì ¯‘ÿ ¯’'?&ÿF¶“WÈËä_ÙË¿P¾$/H‰ì‡KÔ¬lpòyòùgò#òOäYòCòdù{òwäoÉß§Éð¤ìCWòA¢ í„È~Mùx7­å=Êï’­äQ¾Cùy˜DNçJPÎ'$§‘_"§’SÈÉ‘?JOïgý“hÉ㉾ò2—ÌáhÆS¾—GŽ%Ç÷£¥´‘=gålòód9’Ì›AåäçÈtr8& ‡Qþ,™FEª´áJnµTîÐ!”SÈÁè-$¯…‘d³0@»_æÈÈÿ6?€–dÊw’I¹Ñ}py;ÛîϨDò6²_7}2;}ÑGZt%·¶yƒ¦ˆ–Àã»}ñ> endobj 198 0 obj [ 744 549 ] endobj 20 0 obj << /Type /Font /Subtype /TrueType /BaseFont /RBNCJB+Symbol /FontDescriptor 197 0 R /Widths 198 0 R /FirstChar 33 /LastChar 34 >> endobj 199 0 obj << /Length 200 0 R /Length1 3376 /Filter /FlateDecode >> stream xÚÕ–}x•eÇ¿÷}?Ïs:Æä²18æ X0&or†c!Ð\Ãè€4Œ±«;2@&ƒãD š©ÙBòÒÓ\‰&»°@iÀ%½Ì ‘ZË i—Ì­ßý=GÿèåŸþðº<Ïužßïû»ß_žû@H@ ‚++JÂÈÄzQ:%­Ü¸>°vQÄTÐÃË«+JRÂI€¹Aâõ«×T—óú.ñ_ÿ¾òU%¥oæ3g¡øŸ-!á%uRü{ÄS^±~ÓÕÙhŸmuMåÊ\‡2ñ[Å÷W”l û¯R÷ŠHüÀÚ’ŠU]#·‰ét F…+«Ö÷·âiñûÄ^·*\üÄd©Ë#ÅDS°ã±#òoëÀȸòÿü´¤œÀ l×;0‹ÑbÕµu* ;$:O¡G%ME–›fÉÓ‡S8€SzŽ‹W†l}­¼ p«äjÒZ§a:T:t¢ž­žÄ^ݤ¶à,Å('Sr^BÈ´¢9zНêZP¥Ã•„*ë9º`F£sSÝ|,Ã!DÑl*ô_1òT¯Ô^Ž×pSôT¬@½^!=mW§T›:£ÞÐExYQ}ê„;Ì?RÐãv M§â´‰ŸŠÙƉÇçÙ¹Ç8é¿Mej·{\í•ñÊè{=x@ô=’/ŠlÓˆ,#=ÇEÌ—gœi%Lj}»PäžÂRÕ„ ÞÝ2W3mª9¦Ñ¨£ô¥µduÞKÃ4']gzÅØŽ‹nTÏÒgp'"ú²älÅY·^7Ë|$»M:¢VÄænêÜz —™I—÷2Y‘Qî%©ƒ: I¦Yíÿ`nÜõàå£ÔíV=ª×›èe¨·W–<¢:¼)˜¥ú¼ÕîMó¥DDæ±}sí–lä Ïs£&’¢:ãæÒhð‹¡À±%éYþÍ $ùQFW †œTwIÔ5þ¨“1úÜÿ žËš° 08 |sóâÕÎ]ž'⢘ÖYô¹yY±}ZÖßà”¹Ë)ö!%8ȧü®v0±³«3I§;OwN64}hFúÐô2}U&µï|ƒ/±÷uÞ¸X!•â$ê(ëìít°S×ù¸ÊŸtzfçd©¨¯»«{’JŸÂÇIì›oÚlR)u‘:ð¤Iz­ðù÷n2ó]¥üƃøœ°ÊwÉﰆ݌~›|€mÞÏè.ÙÉßbžzFw’u\Óo2Ïò>Œµx[ú¶Ê½dm|ïÔâFñ¬mä »ã‰0G„ë¶ãÙ*ó×%‘­ŒlÅa‰Ô`‹´ê2b„v†·à˜)š¡«ØÓjK~Ü,ß ›ksÌc;w1W5•MääFŽzCnì\WaæJɪ˜Ç’V1rg†¹úw0F%W?ÌÕ³o•X‹ëE«äêW²oV1øË”“«ÉUäJòv²˜ü ¹Œ¼Mþ+س~½¥ìçÚ!òËäbòKä­ä"®TíBò²€ü¹\@Îø£ôôó¬?ŸJOôM´ç¹d£™MûFr9“œAN'§Ii#{ÎÚSÉÈr2™-šÁ$ÚÉÏYäÌާýir9Vþ½N—YK/“;ôzÚä Ž–ÛÂÈýÑ L§92òÇæI%ö257¶>E^˶?É\)ä5ä'âL’ÙŽ¡Ò¢+o« “;hxÃØbr<–ÌÓhm#eúI[vOW"•Ády5y9ˆô“>Lzòu5àÞQ¼‡ŒÜpi¤­Y±ÿËeôËE­‘Úï—ôˆ¤¨¤Ã’|Pjam½ªÿ‘ü0þc÷KûB½` endstream endobj 200 0 obj 1797 endobj 201 0 obj << /Type /FontDescriptor /Ascent 701 /CapHeight 0 /Descent -299 /Flags 32 /FontBBox [ 42 -177 550 706 ] /FontName /RBNCJB+Symbol /ItalicAngle 0 /StemV 0 /MaxWidth 1042 /FontFile2 199 0 R >> endobj 202 0 obj [ 250 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 549 ] endobj 28 0 obj << /Type /Font /Subtype /TrueType /BaseFont /RBNCJB+Symbol /FontDescriptor 201 0 R /Widths 202 0 R /FirstChar 32 /LastChar 61 /Encoding /MacRomanEncoding >> endobj 203 0 obj << /Length 204 0 R /Length1 3532 /Filter /FlateDecode >> stream xÚÕ–TÕgÇßÏó|¿÷¢!^A‡Cï"’’ sê‡Î¦9Âe茉"rJäNÔét‰2ç ÙlFFæÖ"ç–»c†Î–ÁQS'n¦nö[¶üUJËÄ<îíó¼/îNýÛ9}ïy^Ïç×óû×…‹*äÌ+/¢'îK«¤;æ-[â_4½Úù" û–”'}"wŠ­vÁÂ¥5ÛÌF@Í.›_\r>.'p$_(Cì;êàúE\V¾dyï%²›g[]X1¯÷à¸èù¢Ç”/ÆôTO‰^(ºQqùü¶kEt— +*—„ßÀ³¢×‰>4¸x~°è•‘ÛEo–â±bS°ã±#ò Nò´ü¬­Ç0ëõŒÇ ´ H]F£Ú„•Ž âƒhÄ!IÙHÇÓ 18‰=8©gã¨h¥ÈÔ·K> IT½Ö:KÑ¢6£EÇéñê5lÕõj5¶a:©y …fÊ‘¥·£Èùº^ç*õKXª|¨D‘ž §õШs®#Û„Ùx!4˜r}Á[„âÝz]­æFçÓÜÔ¸µè+3|¶¬È@÷ Ô^ŸiP;nÍ{D_бžI(q/«vuÃ3“¢Ý¨V-žQ§:=YjŸg´'NJTË<î[¹nuk‘‘ãõ¸ŽÑ Ãý¾NùbI(çË…þÃ3éÃÿMõû¼þòC½Vø÷D"ù…N’;3äÞ2)1!'eÐÙÿæ<›>|J~¡òNÌë®vâœ<1N/Ñjbûļt»k5JÛR÷e9^$æôpàQ1®v0¢µ­5¾S­§Z3úú¤úJtVš¤ÎsáÍÞ¸W{ÒÀP¨¶:±:MêHȉÑQã@9¾S¤|çå pb;§š]jkÄ›H£œ×SîP¶™Œ%¹ipUŒmJ’†OÖ1 è'ô!Fb’Dê Gõ€W$±ÆKž y)ãYÁE‰ì…¾®œÛ1Ö'ð½ßÑÕ]ï”tÅw¦«£+S:•0’<ƒüèãCÀŸè2è.ô달‘ÙNêÍš §rãÍKNâ«?„/†ŸT«TÕÿ@ÆîŽóáf•sþ“F}tQ¸iQøî¢.µê@ÅÁpóyq‰Î Óª«£Þ}¤÷Ø;4û5¿usÅ­<Ò(³Jfr{Dï–që»êå~™Þq³-fͧž[ŸqŽ¡Ô)A¡ìй¢ß%wÚNF<GΠæ,æÈüÂ{‘¾hoâ»ëòÈ¡`´û˜0lúŠò¹ í^à~ÍÞwÿá3Ñ,7¢«”‹0ŒrHƒ'„š²"a‰&»ÈNò&ù yƒü'yì ¯‘ÿ ¯’'?&ÿF¶“WÈËä_ÙË¿P¾$/H‰ì‡KÔ¬lpòyòùgò#òOäYòCòdù{òwäoÉß§Éð¤ìCWòA¢ í„È~Mùx7­å=Êï’­äQ¾Cùy˜DNçJPÎ'$§‘_"§’SÈÉ‘?JOïgý“hÉ㉾ò2—ÌáhÆS¾—GŽ%Ç÷£¥´‘=gålòód9’Ì›AåäçÈtr8& ‡Qþ,™FEª´áJnµTîÐ!”SÈÁè-$¯…‘d³0@»_æÈÈÿ6?€–dÊw’I¹Ñ}py;ÛîϨDò6²_7}2;}ÑGZt%·¶yƒ¦ˆ–Àã»}ñ> endobj 206 0 obj [ 744 549 ] endobj 60 0 obj << /Type /Font /Subtype /TrueType /BaseFont /RBNCJB+Symbol /FontDescriptor 205 0 R /Widths 206 0 R /FirstChar 33 /LastChar 34 >> endobj 207 0 obj << /Length 208 0 R /Length1 3476 /Filter /FlateDecode >> stream xÚÕ–TÕåÇßÏó|¿÷¢ ^Т†(wD„ʉ9 ™ÓF Cb$ˆÈÙDn¢&¹&ÊÈÜ•~YŒ9rÕ3ëÔ92לÛ´ÄÕÂå~°•537ÆZ3Ç™tÙçysëÚÎþÛ9ûÞó¼žÏçÇçù}¡Ä  y+ë*˜Šõbé•T²rãúäµKš@%zbM`u]eBÀ˜kÅߺzMcMÊ¢‹RÖÑûE¿ª¶ný¦ñª+WTøÖÔ¯¬Äýˆ.mbl]å¦@T´ºSôI¢'¯­¬[õÆäZôѧêÖ‡…‡D/}j`ݪ@Åc³ö‰~#6;;" m˜±|ôÓøïŸ‘4ˆ“˜‹ízr± =¨PèR»TØ!Þ¹x]8&i62°ÂtJ™aôá út9NˆVƒL}¥äEX*¥:´ÖIØ€Õ†«sÕØ£;Ô<Œ2LqҤ䔚¨C–Þ‡ ç+ºÅ 4èG±AùЀ =_Ñhw.b¶[ˆr<‡:M>ç­@’Ökñ{œA¶ž*´ê*‰ô°êSÝê´zS—à%uT «“îBþjd” t{Эq+ºEOD®q"þ…vî‘.ñÛT£v¹'Ô±Œ~™Øûľ[Ê…iÚ‘a$rœÇ"ù¥›v±d¹Í"Å=(qûP¦:°Ás‡Ì•øL·êB–iw›Õ1êíÒ[¼:ëIÂǯÓ<ØŽónHÏÓ§qšõE)y¯¹­ºSæ#ÞíÐͪjtNPä– è¶b¢ÌŒ_òrY‘)C:>Ó©ö07î úœŽñ¢ÚPƒjÈ3ÓªºÜ!ÙͪǓyjØ“¥{æxb¥F³ÌãáÍ-[F° 3ó¼×1Zaz²/¤S?WÊûBiòñåþŒéQ“}ÞäŠC㓎Œ—:‰îò;)dR£BNjÊ™ÿä<“1}qqiòAå]PivÁŠ1.)Ñjbû‚‚ŒÑ½\nsjܽ²c½HÈãÀ£¢\í`Foo&|§zOõΜçKõÇùk 7˜Äá³á6oìлë<éàÉ)“scŽ!©yÆ£°Ó£ƒŽŠ6ˆñFqc|ý9Ã9™˜1œ#ùLå¿Ì—çÏöÇeéFµ+\ ¯Quz0\¥öe“0¶R•àÄêc›”7γÓÁNŒràª(ß©œÞYàð@¿m0›?'vx‘é¶I%›ƒà –”ÿøÝ·ŒÏyO©(Ï#Ï^jü0/Ìääpâ%w;Þï»aYxÿ¥þ¨­» ç$jìUàT£LR©ˆŸ”_‘½•XÚÁí’e>äÉà}[μŠDiÓƒq@aÁÒÍŸ¶¤±®ª~͇wLø ÙùÿîsxÇÄÊ-…üݤ\„a”CÜ!Ô” KŒaò}r˜¼Dþ“"ÿA^$ß#/'ß%ÿF¾Cþ•$ÿBf”¢|o£Z®ïóÔ¬lpŽò[äYòä›ääò5òd?ù;ò·äoÈ_“§ÉWñ $Io¯"E´Wh{Ed¿¤ür„Öòå_½ä ¾Hùò8yŒü9cÿåçÉ£dùSò0ùò9òÇä!<‹›$®C£ÚÈËÒ¿µ¹õŸ‘õt%¿œZ“xž‘Õ#6ë1Â<±Y‹Á0Kx@î“?‚§åÈ’rO˽e„¶\{ø!c á)éÑ•ÜÚž’=¸Q4k³šíéÉH Öc„¶…DZXäý¬ó¹üÛìÄuÂïSÞKû÷Øû£´<iïyû¬fÛ³ƒï²Þä ’51è`íï°·Ý”¿M¶Û}Œoá3Â6Z$` »è½Ÿ¼}ÞKï=²“ îf™Vzw’A®é7Yfy®±yGbÛNËdKdï´àzѬlä߯ñ4³D3×mdzUæ¯_<[éÙŠ#âiÂéÕ¥Çí oÁב#6ë1B;#ÖbO«­ù5r³Ü¶ÔæQýÜÎR´l"o#7rÔòGÏuÖaÔlÕXÓZŒ¼Ë®þ­ôPÏÕpõŒ­kqµØê¹úõŒÍZ ¾Ê:µäjr¹’¼…¬ ¿L–“7Ë‹`ÏúÍÔÊçrÊ¥ä—ÈeäÉ¥ä®T åbò&²ˆü> endobj 210 0 obj [ 250 600 600 600 600 600 600 600 600 600 600 549 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 549 ] endobj 91 0 obj << /Type /Font /Subtype /TrueType /BaseFont /FDTCJB+Symbol /FontDescriptor 209 0 R /Widths 210 0 R /FirstChar 32 /LastChar 61 /Encoding /MacRomanEncoding >> endobj 211 0 obj << /Length 212 0 R /Length1 5648 /Filter /FlateDecode >> stream xÚÍW{XT×µ_kŸyñ82¼fÎŒ‡œa‚(ˆV¢œAGD|1•‡(Š((ÅÇFM4ÔÚFc[%ÖäšZu8Rš¤1©Ö¤šÛ˜Ï¿ª‰¦!I­yZ9w3\£÷óþqÿ»g}{ýöÚ{í½^ûì9Ѱ8êšjša´ÓÈjéum­öC?~îõ¿ЧÌo^дþŸ»z ÑìĂūæW$¦4˜Î’¼³¡¾fÞ'ÇŠÆD5К‘ 4½[÷,É]ê~ M­+cXHò Õêâ¥u5pבLëÁÔT³²Ù”Ï“üÉö%5Mõå[v”ü-ÉbóÒå­Êð>-M!9«yY}sÿ ÛßIöD¼Ecj°)Ÿê[õ­TÜRH¥f£•ñ÷\µOû‹éF§¹þW•÷¹4òl “23œéâ‡]HKMœœd³ZâãbÍ1ƒøè¨È“Ñ ×q !Û'–TÛƒÕA]†8q¢G•Ũ¹k :h§¡’{u‚öjMÍ~¯¦Dšóÿ‡¦Ö”îh¢Ù^…žl»O´ßöŠöΚRIýg¼bÀìÓú“µþV­ÏSßá vŸ­ÁkbµÝ,ikh÷U{i»^‰ÂŽôdS¢A‚(uã Œ¯YÓ`#P5|ÁdÑë &‰^mŽsújæžRéóv8žì ޝkƒ cÜËÕuvR­¨$Ûžì…ªÿÐ=Oœ×’ ¶ZíÕTU¹š@U«6bÝA«è ZW_µý þwÏ÷ô]“Aæ,©©o/¡ÔtL ‹ÕªTó4I¥Sí´-Û¨ âÆ@Ø Í÷põ¢O©^dFˆÅbCû¢jÊ9TTÊÉR²O¬ñ‚ðp¥œ$%i‚'»×¶vŒƒ’Òë)ò©8Æa[ÆO¿wmáÌÉÍÅ Z:óà¹þ¾Y±¶àùÔÆmI/ùëéç¯Õ$ÞþX÷üí¾›»ÿÆÉþþ>)¯UwQòD W¿®:/ŜǥՉQ‰ve‰²²K„ÕaÈL²$Y-–Ì¡–¡ÖY–YÖ…–…Ö†Œ†Ìç,ÏY_²¼díµôZ-f“88“³d&‹ñÖ à -kLºNL3c ÒGŠŽd‘Zl$g²t¼ ì”?oÌÊ´$FNv™cC¬æ¨+bˆèÒqj‚\C)A…·¯Põ´ÚŽë›­¥Èª¥Èívƒ¹°ðÏZº´dµÀ삱˜¯åÄ;G ·$Æ&X¬‰Ž|m8SËaxÄ1*?»Ÿ×1³mWNA¿P5È6!¿%« ?>טS¢‹0×4üöñ²©›_èOð¹£ss£2Æã—%â¸Ú¸ÛŽÏˆÊíË4üZ´†Í)ü ѤÉÇ{o­ºƒå²vr"î|µ _ý<†þúbüúžïYõá £Á©["5‡ö­zË4-޾d ôd Ój&Ê0^Ã?‘ŒÚÎq{  ¢¸|ü¤b÷´…MõË=ÅKÏ#gÔ•Ð÷{8j>(ýíVÃV#K ±y‚bíñ!¶™ .Äž" ‚=I`±M1!¶‘`Pˆ=AÀ‡ØãÑ!¶ *ÄÖD†Ø:zA#0…ØZcˆ­!0„Ø£úû7]ˆ­& s°Š€…ØJ K@’”8AøÈïøÑîB{n àÖtÜR”ê)z3q3«¥H÷°:’6ø?«i¼ÃꉿÆjˆÖxXs‹Æ—²ùÄ¢þClí"hÚ[ £I*ŠbyxZ€Ç? q£”Пiá׿ØÂ¯káÇ´ð#[ø¢H|—~×yìÖx½Æ3¤¨~ßVÀ‹ªÊ'ôÊã$§hÜ*%ø+þõ¿'ÀWø>=ÀY°^S×ø¯ÖxƒÆ+4îÒx¬›ÅÅïÎâžÅ×fñ£²ø—1†>=yŒ”õð—{øÌ>­‡ïÌÿŽNP ’c ¢ÿ„4›6x‰Âïä*ÁÍ0Ü«R ¾«œŸËUBQ~ U&Ê^…*œAø7èÒ©òEld*~ˆš|\è$ü@v½LËχáý0üYvÍ"8+»²Þ–]CN‡áMÙ•FpRöÛ ^—ýÇeÿ¯Éþ‚—e-AHö_!8†#²g1,{Ö ¯`<ì™_'W%ÑècrU Á¹j$Á£rÕ(¡Èƒ+ Kó±u †å$ï"l!Tck†Nm~)tjóK°Q“›ÕùEبåb!ý7T×- ˜U¬“]“ÈÌÙ•Mý¹•²¿B(âq:øµÍ¦_óp*øµEËž¤öì¹BþOð¿Lö¼-E`)ä ºÊNM{¢ìÜMÚ¹Uɨ†g 7y®âP´ªd‚K3ê$U=1\‡!²k;CvM °Ë®¡©áØÂ™·È~5–x5»¯ <Úú()ì_%ßU¥ ßv]¾¡v³W=²ðW’UøÒuEøÜ5\èså Ÿ¹"…«Q8ßù²ê œ# {¢pÎ+¼çÞv^NÐyûCÕnḫVxÈa)¤C)F8èÊ~ãø /ùÕ±xá´f—»ðSZ÷Œk±Ðî o’…õtHVÐ>Ë<)B³'„»Ž K=ùBSue¡ÑIÎ9· Ήܭë 1”¢„GÈ—Yþlaº_•#£Á%pÌ¥ÞSËÃÛ²ð־ؚ÷ÖÒð6'|]Í ßosÃWÙœ#„ 9´ÝQa¼ˆð Y: …ª³²0Ú¯™á ©IÖ¥&-_Èöd ‚?R˜Þmœiü‘1ߘg|À˜atS)ÆSœÉldŠ6EšL&ƒIgb&0%„”KRºú{`0«`Щ\ÇTÎÂ?A M &ÙX;˜ØSÔ6Q{‚Új먭¥ö(µÕÔVRk£Ö®\:¢®îeíìÑs¸û([=0¸šmèmb+z+Y›Ö ª6 »'A•A|Æfig76vt‰÷>¬z€»xlÿÛ‚ûéÞÕÅÔà³¥S+ƒ¿N ‡«%5Pª~b÷²‘,Ïçíeù**{qé«PÇq™7@ješt±|Rƒ*H]ªtqC4µÍªZwg—ÏÛÝÕ¥©èwB§¦Ò©ß©©ïä"´“¤©"Á¥©¹ ‘ª MA¢Í$IÓJŠÁFU “b´Í,š=§“TüNU¥Ûí$…n§[›ÎüaÚãЦÃÓaøÃ|Nx¹#<ï y÷ÿ§§¾øÿºâHÇ¥ÍûÔ¿HÕ¢¯žZu°£þ®«µÛ»7_øï”Q][× bM}ð’Xï n½öîŽ}÷™Þ§NwˆÞnØç›VÙ½Oª÷ÊR‡öÏêHùÞ²m÷ØÚ|ÇVÙÞûl¶WݬLµU¾í>ÓÛÔérÕÖ6ÕÖ6ÕV¹T®Ùò-œZ¼ü®çÇ­­áÎýÓ°œÞõÿév¨• endstream endobj 212 0 obj 3892 endobj 213 0 obj << /Type /FontDescriptor /Ascent 750 /CapHeight 0 /Descent -250 /Flags 32 /FontBBox [ 16 -15 757 676 ] /FontName /RBNCJB+Times-Bold /ItalicAngle 0 /StemV 0 /MaxWidth 1000 /FontFile2 211 0 R >> endobj 214 0 obj [ 556 778 778 778 778 778 556 ] endobj 98 0 obj << /Type /Font /Subtype /TrueType /BaseFont /RBNCJB+Times-Bold /FontDescriptor 213 0 R /Widths 214 0 R /FirstChar 98 /LastChar 104 /Encoding /MacRomanEncoding >> endobj 215 0 obj << /Length 216 0 R /Length1 5316 /Filter /FlateDecode >> stream xÚÍW{XT×µ_kŸy^: pf< âÀ Ri<àŒ:âûÉÔQD@)Š×5j"$¨±©^Û*±&×^ƒGj†&iL«5©æÆÄÛšÏ[¿Š‰¦!i­yZ9wí3Ôèý¼ÜÿîYß^¿½ö^{¯×>{ÎÀØ(µeõ` 4ržš­¢©Ñ~ìÿzŒú=Æäªúeµ›ÿ¾¿ÀDCìô²•ÍU={gäXN`iueÙÒ» ÇDÚIaL5 8`xžä’Óªk×E¾ “Iæ6,+ë*Êà伕dSmÙºzK;Nò3$ÛW•ÕVî|~É/“,××­iÔÞ„V’/œ^¿º²¾ï–í/$ ñ6!ðxxD&jå|ÄX ÉÔ$j6á8$h—¨]ã­o¡v×X ޾sÚea$mà7zr`l…‘prsŒð"¨P„^? q蠙Ű À‹% Ò®ðW\UПC+‹„ZPHÛ £i¿d˜gÁ˵>ðA´@¡¹YЦ]Ю’µ‘d­¶ÃNL¥~tÃ\© Š`…Kø¨v„W…,M0d’ãÀS`í¼–ÀRÚñü ÞÃfm»v–"4“½K~½')‚;8›…"a?ͽ¿ÇX¤ÍÑNho“ ȧ½üð Ñ.؇áè…>ÌÆYØ¡Õh«µWÀI¶ªa3< {á§ðø3ÑÍF±:^5Š2›ˆï=Ÿ¼ù ùs.c$Àù¸ ›± ¿b~á¤V¯F{"‹Gáuø5¼ ïÁMÒŒÄd,ÂZ<Ë:„8apÀØd<¦ÉÚ òŏ5”¡pœô?€+p ¾‚¯)&¡„#0s±½„Ç™À¶±—Xë,ÂO…3†}×´?i_RVÒ!“rœK;zÀ S)fžÁÕD{)W¯Ã›T«·)c¿‡?]‡ÏЀq8ˆ, !;LÃá8‰¨˜â*ÁÕxˆèC¼É((ÆX—àvÀ°Í˜clÖ†j9ZÑP e~0e)¾ê•+¥lVC Y~¶ÁS”×68HUì‚3äÁçð7¸·áü4¢™<°R†dÌ ªŒÀ1Dy¨ <)Æ©T§y¸€Hˆ…Ñ0Þ‚rŠ¡Žbh¤{d'ì!ÚKtrùot’OÒ9:E5>KtŽè<üeõCª^Ñ_èŒõRŒ_S|‘”ã0ñŠ&éÍÇGÑCÑÍ!*Á*:õ¸'jÃýx2ÐÉê¢ï§wñ*ÑGxƒ¢¾w(îx–M4Uù1öÛD´ýˆNH;Cô• Œæ ÍÂ>áˆðsáœð Õ±ÊÐb8`ø•á=#%ãdc…±Ùø”ñÇÆãÆóƋƛ¦4S‡y§yù&Ue>Õ&|â脵ÃkPÍšXÝ©` wý86·ÌBQ­Å8ªu3e/›ÞúE¸¬lû!fQ~f,öÒ™xžîŠsßd9'–U¶L¤Ô´N‹.•=CRñ;m˶ùK‚¸ÍvB÷=E¥ìå#ö`„\$W·¬PÎav‰š¤$yå2?3KÔD%QÜYݶã””nw¡»ã8‡mc?~2<þþ©(]ïôUÂâÙ÷ò‚Ü’ì#7ƒö ݈L¾Žå¬r,´TŒ%5züHQ.FL´X¿G«‚F§U¶·|T(¹÷ÓGÊúGLNëÀ»¼œ÷NÍ÷÷õß0 ¤ßw~Ã*ÉF“DGÖ`–ˆ4$A`I&³„h‰±GN8–Í´efN¿]0ínÁtë—Ó¬w `|ÁÝÞFŽãˆFÍi¼yö΋Æêo÷.ÿ#ìÈÚ5ƒ‹ìˆ ÃVeò<˼ø 'ÿ6þ· o ¾ÿE|„#>Í–™Re©Š¯JX¿7Þb•Q’SåqrrŠ(E'GRœ sãÌ‚351ʤì¤û.Ä*”ç@Ñ•ªH(…X Ó™–}þö"òÆúå¢^r­w|ïøØü˜Øü|ä,‹`QÚàA£GÉÍI—‡šÙ˜¼1£GÅ&ă<4}˜YŽÉI–‹'bÓæ._0­¾hƈáÅ :.öýý­Ùó^Hydüδ‰:÷²„»^¸Û›mËì»u¦¯¯WÉi4\QÜ£ ÿ{ ÛõÜ’è‚/-ºxªûNó=¤¬èÙGˆ¸§ü+±æAß‹}Ï™¿¼7óχ™òÁiXC™äßZÇÂk(ÇKháj ¬DÃÌ7ðw$£®Û¿ bfú 'L)Êœ»¼¶r»¨nåR¾^´uü;ñ!Ÿ÷üb—i—™%„X«:Iб‚¸ÛAbOÄ„ØSÖÛNbÛ†ØV1Äž$b[¢Bl3Adˆm" ö%Ä6˜CìqSˆm 0†Ø¿Bl=bÍ,ÄÖ`X’”„IÒ‡>|ׇvÚóp—w¥áÎÂl è­Ä­¬œ"9È*HÖØRâŸëü‚®ñ.«$þ+#~\çaÍ:¯cUÄgP[F»Hº¶Ä–©hQ £Xž‡ñ´ÎêܬÄ7ˆçÄ_6ˆ/5ˆ›Äq ☱0ߣß%;u^©ót%*O<’'6å‰rWù˜>°Dœ¢ódVâýb_|Ó/ô‹¿8ß/¦ùÅÂAØBŸ¡">©ó-:_¯ójÏÖ¹Kç1JL†øA†x Cüq†Xž!ŽÍ_Åhút1RØ%^ë‡u‰©]b×ñ—t‚¢q  Ýø;¤ÙÔ!«¤~£–Ún‡á–ZšBð¹Zê$øL-M— ñ#(µP~ð:”â|Â?C»ËW°†qü#Öèòep¡“ðÕõ*-¿†?„á?U×B‚ ª+ƒàÕ5”à\ÞR]©gTŸàMÕ—NpJõ=Bð†êË&xUõ•„T_Á+a8¡ºW¨ª{³ôÁÍŽ’ùMji">¡–&<®–Ž!Ø –Ž• ݸÚuûcXCò~ÂB[=´éóuЦϯÂ]®%äó+°FÏÅrúoÃ×-£˜9V¨®)df±êÊ"𫾑%ªo¶T(â<ðé›ÍŸîáðé‹fªî£¤6Cu÷ÿÓúýŸªºß‘ #°²‘¯òSמ¬:öÈþªd÷WÃÝA&yÎq8(zU†K7ê$¹ž®ÃPÕµ‡À¡º&ØU×p‚”pláÌR}<–8žÝ×Ð n}}”Oö¿-•¤oJÓ¤¯Û{¤¯¨Ýîæ‡@•þæ ¡S,ýÕÕ#}æ%õºFJŸº"¥ënYºÔö*÷.’†=AºèŠ‘Þ÷ÅJï8{¤ÓtÞ~Sz@:å*—Þ r\ P‰–:\9Ò˾ÒQßJéç>>'ý„Öì÷í‘~Hëžu­”Zœáñ-J’´™ÉZÚgµ;Yªw‡pÿI©Î+ÕfSW•jœäÜIi…sTí YÈÝŠ¶C%JzŒ|YèË’æù¸)™M.I`.~O­ _l«ÃwXCøb«ßZuá;lqøºZ¾ß–„¯²Å'&I“²i»“ÒßPéûdé¨*pgU)ß§›íñ¤hçIË•²Ü’ä‹”æuš˜¿gÎ5ç˜1§›æs²9Þk±ZZX"-‹Éb°0 XâCÚU%ÿÄ›¬LÎ Œsþ)aha0¥ÐÆZÀž¦¶ÚVj[¨m¢¶‘Újë©­£ÖD­E»z‚¯îf-lC—5ÜÝÀÖ÷®gÛû{ÛÙºþÞ:Ö¤÷B„Ü&aç¡¶-ˆÏÚ5·}4&¢ç!,ÐÏ3¿{lÿÛ‚‡éÞ×Å”àŠç”ÿ=ÅÅ;ZŠ¿88œ"v³1,Çëéf¹ü%ݸšñÎæã¸Úã'µ©º´³\RƒR¤& …v®íÂP]mWëlk÷z:ÛÛuã>hÓUÚŒût•£á\d€vR8š)\ºšËÉÕèPèzX m¦(ºVb4Öp-¬IŒÖ7¤Ûs:IÅçä*™NRètfêÓþ›v;ôéšðtMØ~7Ÿ^îÏ;h>óÿÓSYô]q¢õêŽÃü? {+©‚­Mô/fS¹ÝÞ¹ãjÿ·z ¼¢šcYeðª\é î=öÎÖÙ>̧[eO'öÎ-é<¬TzÔV¥Uÿgpbú¡©»°µãž­©‡²Ù!¾ÙTnkúî‡LïæÓÓ¹­ÝÜÖnnkº2]·å]>§hÍ}Ïǧa ½ëÿ ùgà endstream endobj 216 0 obj 3609 endobj 217 0 obj << /Type /FontDescriptor /Ascent 750 /CapHeight 0 /Descent -250 /Flags 32 /FontBBox [ 17 -15 757 676 ] /FontName /PYACJB+Times-Bold /ItalicAngle 0 /StemV 0 /MaxWidth 1000 /FontFile2 215 0 R >> endobj 218 0 obj [ 556 ] endobj 18 0 obj << /Type /Font /Subtype /TrueType /BaseFont /PYACJB+Times-Bold /FontDescriptor 217 0 R /Widths 218 0 R /FirstChar 98 /LastChar 98 /Encoding /MacRomanEncoding >> endobj 219 0 obj << /Length 220 0 R /Length1 6348 /Filter /FlateDecode >> stream xÚ­X TE¶¾UÝ==ÌÐ3üÌð3ô =à ð3ÀLH D‚$B $$ƒ$Kþ M04gvý‰‰F×·OŸ?Át0/;œÍž&&q£®¾]ï-ºž(êz×]ÃÌ»ÝC¢¾³ûÎî9¯{ª¾ºuoݺuoUuÕ€Ø x;{;ú ~5ç0uul´½õÞ–}$€«XÕ·º÷ÆSb M#¯^·eÕÆM?ÙeúöžîŽ®?î÷žv`û¢¬0œŠ©@:ˆ´£§wãæx  ýÒñëÖwv0ó9Ò_)VôvlîÓVÓG¾‚´íÖŽÞîñ]ûÇŒ©H;ûÖoØþ˜HûÎîëïîûí×›x¤Ñ~ÖPÆ£ŒH-ˆÍàš©ùGªæÌßá²ÜFôÄHæ–@Ó Éáw1}ŠéO¡eáW9¡gÂÿÅ(ÿb&E;<÷Ã˰¶cùNB&dÁ<ìë)h€V˜$^ô>…‡a7Ê}¨…[ÈGØÇ³Ð¯£œü°±¾ °}Ô ì¿Ã{P 7Á8gàÔ M°&èhøM˜Áò+– P“Š vÁÞð!ÈrÔ´î"Ùž‚6|{Ñ®ŸÁ¿ÀoÃoâ¸xˆRm,CÉÅØÓ¢#iÄK†Ð»О€ÑÄØ)ïN|÷Àcð$<3ì0¼ˆ=ŸÆ¾_‡7á}ìÿ3øm˜‚Kð-\i´"†ø&T|$½VQm$‹É$;ÈN²‹ìE’£ä8y =YK[hÝN÷Ðèô-úý”~NÿÌè+cGŸakÙeì!ÎÀÝÌmãvp‡5EÓ—BÅ¡C+B¡óa>lg…ÂÛÆƒÕ¯TOj!Ì aDÜÕ…°ßFœim°:aÜ‚±ÙŒÞ܇þ|Gø4Â8ý çÒk8º70êïÃ'8²?Ãw0 !\ü,ú9 çsÉÇÕ√ÉÒB–“äf²ŠôÛÈV² Ç8‚ï^ò3åãä09BN‘‹äùÃËÑj¤6š‘©¥KðíÀyÐK·ÑÝôçôz€>FŸ¤ÿFez”žEo|ACL4c`œL1¾~f!³ˆé`ncö2¿dždžeÎ1˜)æ 3ÍL³…l {=»½Ÿ}™}߯8#—ËÍá–p]Ü-Ü­Ü0÷7ÊqïsßiŠ42/ñMüü~? Â+°WÚŸðïlÃsô<õÃGðz`'ƒkgyÙe0»O*ý+}¼†3«:ÉaHĽŽrõ`ÅdaöẆð0MaºªÆ}y¡áw˜4Ô¾6ü·c8Œ+Þ„+â<|ÊêÈ"Ü?nf qþvá΂_oþ¬¼\ON¶;ëºLW†Ó!¥Ûmbš55%9ÉbNLˆ3…Xƒ>&:J§å5ËPÙ~i^»MÎh—Ù iþü…–:°¢ãí² «æýXF¶µ«b¶KzQrÕÿ’ôF$½×$‰`+ƒ²œl›_²Éç}’-H–-nÁò½>©Õ&O©åµÌf¨„ »[Øü–ŸM&í6¿Ù¼uÒò=yµä¿g†ù12eêœ×Ñ=<]32?B¶+TÇ=HÕß`Ct¨µE&C¨Ø¦˜«˜D·äWjÚ×ÚdT-õ ¯mGŸ'ËдÅ>–œìã‡Íonn‘ìreŠÔÚáK=ÃM[žOòÚ’~ÌÉÉ· ε£ËÆsªrªœk· Fð;#õožŒVå&>B¬oºæ5¢"-ÀQȶNÐ"áPæ(Y÷bø´tÂYWÓ>,”*>圂d¾ Fiêó×tÌÔhœÂePŠJ°¯Mä_-Ën·œ•…1Çøtc˜Ð´ µbvNö€œ"õ 69]èÇŽÖÒ\ô»Ý®„l$è…•HÈ;·Dh¬Lo®»U¦í çäUNÂ…³ã*çZóv gãQõ” k3®ýb…Ä8O©Lÿv·Êª¬w„gå«WíÕ±¼8Ÿ’ ÍòÆ1 Dix?$-eüÛª “u`q —ʦËaÞ0]•eÂ4’˜ÍÊ“Œv£ Sœ¦(ø])7篧ƒÌé+s@=½­Ç]…ǾRáQo Ÿ:ϼ4z©yî~óæWRµ^ýö[bFbhL®9]gŠÂ‚·Ð«}®Óq1z­NÇgŠ3qµ,E!Ùš¢3™l&.Îfb9ÖšÉ ,kJ³æžs e$×]æ.ðœ[p{•l¹$ \ȵ\jK.ŸN¶ÌÊ#mÅEø’t 3®â 7!^“ŸhN°o»ÉY‘D®ûü¡ni [³ÌÁ-ìMFqººuÓ²³/gKjòdnhŒ«]Ñv…³'»Ìeø%U}þ”9Œ{o.©õ¾ïpŽÔB¡0•‹K­7·™·¦ouÜ~·ã õ€ý@úÇ!ë!û¡ôCŽãÖãöãéǯ'ž1Ÿ±œµžµŸM?ë8ã|;ëm÷ÇY»ÿ"ÙtIMµæä¸=–ô¤‚ó\à æÆJKJ’d‰5‹fj6&JfméÉä%m½žÄê-™’CÌñ¤…Ô"9fÅ¡Éäb=)8D*ð¤Ö¬‹Y“› Qb±+Z­š•+äâæ}NŒ&s TNUº•¹Qi4—ìæÆÒl Rz†ËC\<“J¼”)h.YkÕmÖÐïþûîZ²©n0teOJ³'^'z;«²|%ær{Ûrö„ΨË6Q;ËÑä¨+KÇö:,1Lz:ÛòaèÔY)µ ?YWµÉsϾÐ}j|á‹ÌÛÌÝà%FïSœ+­2Óå,-‰/ºnmù~×Ó®q××+sïz«ä¹±l9[áJ-*›]^[Ù½´|SÚnÓ} ÑÑEºb I,g½.[fm¦5;š”ÛMÑ룤èúØ‚ü4+1iJÆ’ØL¯Ëž¹ ³:­ ?_4¥YÓ*&¯W4¡%ʼn±¼#ä¨ÉŽöY»¬»¬ŒÕ‘æK[™¶+M«­¶¦ iiÕQxߪž_•;p΢,ÀE³=—÷„À œn;Ýf¹Æ©«1œ˜ØmÀ(ÎqWÐ9K²>%êjÉe!ù´pTvy2²ófE"§†FÂ……Áª$‰fZA¾r4ÐðŒà+ÈÇháZÃpÍ.,*¾Ú‚×ðÂ;Gy{^ŒÙPUl{^C‡¶6ú³måQÚl”AHö5X›òšêÓ+9v0Š7[ëûkü³Ë«éÚEö8«¡éQQ¼‹åBMÇozÜh_j)L ÙcݺXKyWòúœësæ3 ä“Ì‚h‹´gqßOüHøÛp+žƒ{ñ„~ØÛ•HZ2ÖdlÎx(ƒs8ÝÙ®W³$wj’!†g:Öçðd‹©<Ë $i29N»H\q:WÒ~GÜV{‰˜!»Nº.¸—8/'[1ÚMP /N,É€s=¹ï}súÒÔ:*ñ)˜n³” —¦ð§:¹ÝïÞÍmŸP—™I]B‘’…x¦>áÎ(›˜ý›(â•NYèDtgA¾âi)Ý•‘K¿ÕîÅ›×’i¯Þ$z­™QQ~n²h÷HEíBT¼ÏnÅï ý.ovJ]ê3kÓí—oŽ-»LˆV¥OŽ·å*†§Â­øÂÓ(è®Ýæ•! „-„~:¤MÖ¥á{pÞåØ?„§Ø °ž¹RY'cÅ[ à 8Hž¢&OÕÅá­Sk1Q¼Ñ ÀJBš¨½˜fzÔ(çß…5‹kêªÝÍkz»7ä,ØØ±nMçÌá?aê†î¿yòæ0ãÝo6/ÐGH ^¨EúÀXc‰¤÷{݈M€§Œ. £ý£#ô`ÿÁ:*Ž–ÒƒâÁR:jm¤miž/-‚td¬VŒÒa„¸ ½Á¤{ŒAºAÒ»bƒtÁ¤»ôAº?Ÿw"Déø Ý  ÒŸ"hƒtÒíš ½ ÒmlnE`‚t ³Ï› H¼±ˆ„Ðår§õVÅÓrr+ôž¬Uó›Ôü5WsAÍÙ£}úõ}úª(òèAúU5ïTó8¯¡Gÿe~²Gÿjþ?zô/’h@†UÍ9o|ƒþ|ƒ^nÐ7èËôù ú¬EÕ×P‡üI5·«yš×\§ÿ¦Nÿvþ:ýh¾³N_X§wÖéƒä?½Æ!ýûCú§‡ôCziHoÂÚçŽÆÖÇ‚î8Þ“êQÁ…±Ælñr l8J‘üzÌv\¬J"'¡”UègpDA q"†fŸ—V©okœ-ÉŠ±Ær„åcË–5®@hk\‰]Üj“æ1Û¤Xe$M`SU.šé¢F¨‚ ŸEœ?&®ÆÖ¾±š•b•ŽTA*V=/ELU ¯Ò“„5Æ ˜¾þ¨x^œ* ’¥câEÔã?n²dLüФÏz£Å\“â¹ÆûijAŠÕ/7cõ˜ø’ ›ŸŸr©5O¸T%#bØ‚Z„#Òdª*ïÏ ’ÇÄŸ»Î‹ƒJ—¨};*Øšy^¼µFí»7«3±5rWeNŠ+Å;Ä&—Úþz›Ê]جö½ ô¼X›©êŸ‡&c¢ßv^¬ÎT;öŠ*£2BGÔE¨QÕ6kD­ÌŒ$‡˜Ý¬ÚîF3ÞXÑ!ö‹öšÕâQ'êÇÉN<È ·„<Ævð |à>°–,åóùÀ>àáé| ך´‚Ö ÑFiµZ–ÕR\ñÁðGÞ,ew‰× hX%gÕ²@•œF¶8J´êª,t´t¦»0íÂt'¦˜1ÝŽi+¦Í˜0 ‡?z^i=N‡éíG…Hñvºu¦r+½k¦tÝÇê7ÊðLî•5{ðz"“½)2^~ö¶Z*-•¦ cÉ<ßßÈÚgr÷÷åŸnàþáCê·¼„Óô t½H^Ró#Çxñu^<Ä«õ7 @@¨E ð:˜°Xåëoh‘Ÿ±¶ÊùJ!lm­—=Ê=vœVÒr¿oœV(ÐÚ2ÐJ“RøZQl™*†»v%ŠA©(FžQCcžQÅ:#b6Z¡ˆ5*€btØT1ݤŠM*bGúKý¾#¥¥ª{úU‘~öÄDF~,2¢ŠŒÌˆ¤¨".ŠÔ¸‘#é.8âJWÙŽïÙͶ'Âö¨ìâïÙ™vm„]‹l÷ÿãÓ]ýÏHû×ÜPˆÇ‹z;ãcdT-óÒßÓ±aæÁ"ÀÿMvJ endstream endobj 220 0 obj 4566 endobj 221 0 obj << /Type /FontDescriptor /Ascent 750 /CapHeight 0 /Descent -250 /Flags 96 /FontBBox [ -10 -82 768 682 ] /FontName /LCQCJB+Times-Italic /ItalicAngle -15 /StemV 0 /MaxWidth 1000 /FontFile2 219 0 R >> endobj 222 0 obj [ 556 611 611 611 611 611 611 611 611 611 611 611 611 611 611 611 611 611 611 611 611 611 611 444 611 611 500 611 611 611 611 611 611 611 611 611 611 611 389 ] endobj 96 0 obj << /Type /Font /Subtype /TrueType /BaseFont /LCQCJB+Times-Italic /FontDescriptor 221 0 R /Widths 222 0 R /FirstChar 84 /LastChar 122 /Encoding /MacRomanEncoding >> endobj 223 0 obj << /Length 224 0 R /Length1 3532 /Filter /FlateDecode >> stream xÚÕ–TÕgÇßÏó|¿÷¢!^A‡Cï"’’ sê‡Î¦9Âe茉"rJäNÔét‰2ç ÙlFFæÖ"ç–»c†Î–ÁQS'n¦nö[¶üUJËÄ<îíó¼/îNýÛ9}ïy^Ïç×óû×…‹*äÌ+/¢'îK«¤;æ-[â_4½Úù" û–”'}"wŠ­vÁÂ¥5ÛÌF@Í.›_\r>.'p$_(Cì;êàúE\V¾dyï%²›g[]X1¯÷à¸èù¢Ç”/ÆôTO‰^(ºQqùü¶kEt— +*—„ßÀ³¢×‰>4¸x~°è•‘ÛEo–â±bS°ã±#ò Nò´ü¬­Ç0ëõŒÇ ´ H]F£Ú„•Ž âƒhÄ!IÙHÇÓ 18‰=8©gã¨h¥ÈÔ·K> IT½Ö:KÑ¢6£EÇéñê5lÕõj5¶a:©y …fÊ‘¥·£Èùº^ç*õKXª|¨D‘ž §õШs®#Û„Ùx!4˜r}Á[„âÝz]­æFçÓÜÔ¸µè+3|¶¬È@÷ Ô^ŸiP;nÍ{D_бžI(q/«vuÃ3“¢Ý¨V-žQ§:=YjŸg´'NJTË<î[¹nuk‘‘ãõ¸ŽÑ Ãý¾NùbI(çË…þÃ3éÃÿMõû¼þòC½Vø÷D"ù…N’;3äÞ2)1!'eÐÙÿæ<›>|J~¡òNÌë®vâœ<1N/Ñjbûļt»k5JÛR÷e9^$æôpàQ1®v0¢µ­5¾S­§Z3úú¤úJtVš¤ÎsáÍÞ¸W{ÒÀP¨¶:±:MêHȉÑQã@9¾S¤|çå pb;§š]jkÄ›H£œ×SîP¶™Œ%¹ipUŒmJ’†OÖ1 è'ô!Fb’Dê Gõ€W$±ÆKž y)ãYÁE‰ì…¾®œÛ1Ö'ð½ßÑÕ]ï”tÅw¦«£+S:•0’<ƒüèãCÀŸè2è.ô달‘ÙNêÍš §rãÍKNâ«?„/†ŸT«TÕÿ@ÆîŽóáf•sþ“F}tQ¸iQøî¢.µê@ÅÁpóyq‰Î Óª«£Þ}¤÷Ø;4û5¿usÅ­<Ò(³Jfr{Dï–që»êå~™Þq³-fͧž[ŸqŽ¡Ô)A¡ìй¢ß%wÚNF<GΠæ,æÈüÂ{‘¾hoâ»ëòÈ¡`´û˜0lúŠò¹ í^à~ÍÞwÿá3Ñ,7¢«”‹0ŒrHƒ'„š²"a‰&»ÈNò&ù yƒü'yì ¯‘ÿ ¯’'?&ÿF¶“WÈËä_ÙË¿P¾$/H‰ì‡KÔ¬lpòyòùgò#òOäYòCòdù{òwäoÉß§Éð¤ìCWòA¢ í„È~Mùx7­å=Êï’­äQ¾Cùy˜DNçJPÎ'$§‘_"§’SÈÉ‘?JOïgý“hÉ㉾ò2—ÌáhÆS¾—GŽ%Ç÷£¥´‘=gålòód9’Ì›AåäçÈtr8& ‡Qþ,™FEª´áJnµTîÐ!”SÈÁè-$¯…‘d³0@»_æÈÈÿ6?€–dÊw’I¹Ñ}py;ÛîϨDò6²_7}2;}ÑGZt%·¶yƒ¦ˆ–Àã»}ñ> endobj 226 0 obj [ 744 549 ] endobj 76 0 obj << /Type /Font /Subtype /TrueType /BaseFont /RBNCJB+Symbol /FontDescriptor 225 0 R /Widths 226 0 R /FirstChar 33 /LastChar 34 >> endobj 227 0 obj << /Length 228 0 R /Length1 6688 /Filter /FlateDecode >> stream xÚ­8 tו÷½™ÑH¶%>–dÙÒHÛ–¿`üòål°c0›ÄÄÆ à8Äü‚KމM8nC>%%m¶M7œ ›Ê¥4lÃ&P ͧIÛœæ³['Í’8mzHú –öÎÈÐv÷´çì<½{ß}÷¾ûî»÷¾7ó’`0êÞÜÕðöœÇÚÙ=°Õóú¯w<@r¸Êu}ë7¯|á]¡ÙÀÈë7íX÷½%R5@B´·§kío¿Y] `:ƒã‹{±ÃðBR€IÈèݼu»£žE:iǦ-Ý]š»Ù6¤+6lîÚÞ§­¥ßBú:¤=·tmîùá¾ï¾ˆ4Ι}[nÛ >¸ˆô!¤óúú{ú~þ‡m<Ò§qþUØG@Y²" ,CÜ™³=×>þ±‡Q!«BŽÛŠ œÜr°0›Á { ë‡X?®ŠE¹"È>ûO½ß™­ñÇ OÂ!ø l‡Ýؾ "à‡l¨GýC3´Ã ¡ç)< Ã(÷98 n&ïáOA/¼Œr™†Á†ýkaÇgA-ÊþüJàØÇà,¼‰ºs –Ãi:{ á!x…ü€ebc¨)Ša3샃±£ AÔ´î&¹-6 X6£]_‡ŸÇ^Ãuñ ÚX’Kq¦cDGÜ$D†Ð³ОhÁ™VàˆãDKbý8ÊE‚jXmh÷.8‡Ñ²à-²šneÆcu±“±Ÿ)¹€ã³ÐŠ2ŒÐ臭8Øy“ðg²‚b±Gc“±—b¿ScÅ D„&ÔÛëá êàŠ oa™‚HY@ªI "‘—Èë4Ìä2ÃÌ+pbìO†žñáj²ÑêX€vß7AÎ|/|ÆÑÆ‹ð9q RDêÈ£ÔEçÐut =MÇ2ì(;»¨ZB1Z^ ×aYŽ~Û#hÑ܇±{-{NÁ9ŒÌ»0 †Ë„#<Ñ?ÉGí‹Ð¾_’w¨Ú¨Dkè»L€©d¶°¯²S\8z0ú‡X[¬=vkì®þœKY¹â§`5Z¼×>€ÑÄØ)e/–ýðmø><ö üg>ƒs¿ ¯ÁÛ8ÿGð1Ú0 —àOpfЊ$"`I&iX2I.z­£ÚB–’2Hö½d9ˆ6!ÇÉ òSôdm£t7ÝOD_¥¯Ó_ÓéÇôŒŽq1^ôñY¶]Åå ÜMÜ.n÷Œ¦xæR´$º2º::½ãc†Xvl ¶;öH,‚Qý½êI-ÁF$€Q½ciÁLë€5Ð ëàfŒÍvôæƒèχq…OÀQŒÓ0—~Š«{£þ6|€+û#|3ÅÏ¢ŸS0Ÿ³É\\Q®hYNÚÈd5¹‰¬#½äV²“ìÂ5Žb9H¾Ž«|”¡Q&‘10™L –0s³˜ébne2ße¾Ï<Åœg^a¦™ËÌ 3ñeìv{ˆý û–ßs&.Ÿ+å–sk¹›¹[¸î~nœ›àÞæ¾Ðkd^â[ù»øýüƒü8</Â7q§}õ9 Éð>ÃÓô Ã{ðz`/-ŽSHž†vœÆÓ'þ…>@~Š™ÕÝä°áYG¹&pau0⾆Øo°Nc½­ÁsyÑ“±77jß{“Ûƒ1ÁoÆq>dud1ž71E˜¿kñd)Í-,ÈÏËÍ dÏñû²23¤t¯Gt»ÒR)»-Ùj1›£AŸ”˜ ÓòŽe(œ°Tß鑳:e6KZ¸0W¡¥.ìèúJG§ìÁ®úkedO§*æ¹V2„’ëþJ2— ]•$‚§*rs2ešYßÕ3R®]';ªëRM×{P'jo“É*ö(æ*¦ÇÑ#…•žÎY'ÕH½#;ÑçÎZwx'œÎÐd _laÏȲ6É+W¥Jí]uiǬ0ÒºãÙ”'åZNnΤcp]6™[[­à^Ç`ÿvo¼ÿµS‰ªÜé÷7µ^õQ ‘á*dO· h“p)¥ è)…‘îRç 6ȺÚΡ\ñ)—)Hž‘ÏÃ(M|mO×l&Sø ”¦ì« ƒü+m9³³1æŸ šV©vÌÏÍS¥>Á#§¢« ýØÕ^ž~÷z•FB° yÏÒ¶8í5©Ê´Ë´S᜺ÂI^®pö\á\Þ)a6W?~’emÖÕŸQ°Y½å2±ýì•TÙï ¿y”·^MHÇòaà4aJ"4;daHÐða)ZÊ„9¶]$›À.UÌT,FØ­Þ¾"q…}¿îý1û‹iÚþ1ïÍI£I4)B7OLl4'`#TÒ>æÕé¸$½V§³°À™-f®å(8]©Z‹Ùì1s™åX—ŸXÖ•àv埿êŽWx. òò j¦¢J;£­P•X”<óeIèeL4)žvüoBK\f.é£Á–·´'ðí`³ Îú•mþb†=L£R{¾¾ °þabhé.¨Käì¬FwyïW .±TØ£^k¦Ñd ¤Þàè-X>7_o7ÐF­I—b0ü¢oÉËìI½Y0±JLÒb2Ïàw@>i½jÍÈ2ÒŠ„¢4Î’Ödï°ïLß™qOú=G\‡½‡ÓguõM?šqÂuÂ{"ýDÆË¶³ö³Žs®sÞséç2Îf¾‘ýFàýì÷–<:‰¤¥¹rsyŽYœ—*&„ù†Yœo”2©)’ÃhíÔn²Ivméõó’¶IOŒz‡_ÊsóÒLBZ.‘2 &Ah5ç Æ¼T<ÒD3*ÈK5 ¬]»&ß b‰/Qí*,0 ùø!¢›(!»æŠ*<®DzX‹6ÌFº ÊQaÆs"j<-⎟q$œ´»Okq´í•&fÁ­˜ófÃ9?žvæ+‡ gžÍÁTðåϤ‘eæ-+ÛèÒm×Ð/þë;²­q0zyäöÚæˆ¡îêìº2{ÐÛq#{RgÒ嘩—7rÔ™pyÅÄÁ G“žÎ¶½}áÎìÔ†äÛ7UoË;°².zßÕ=÷s„ˆ)ô8çsWù}™åeÖâ9ƒßô=á›ôõ½¸àW¾×ËÞ\`dƒl¥/­¸b~°¡ª=qEp›{Ø|_rbb±®ÄAlA6äóøü®œDôš·$H‰MÆysÝ.bÖ”e˜ÊŒþÏë_ä¯qÏ›;W4»]î*“9ÍhGY‰Íȇ0Bµ9‰u®µ®}.Æ•á®s¯qïs³î†—[p»kˆ5 «óÎ;”] ¸Mwçã«æ´À œé8Óá¸Æé«»õ¯¶«3ˆR Ÿu5‚ä3ÁyF8³»Ù…ñH©ûP݆¬*b³Çw®ýš­û·;GðêÎÍ·ñÞ‚$»¡ºÄó¬†ílëÏñ´{Ùƒà¬kvµ´6¥Wqì`ow5õ׆çkèÆÅ^‹ËËÐô„ÞÇrÑÖ75ùÅŽ+86{ ßæøeº«ÿŠ(ÿæ@Zˆ~7zTëÔ¥±{¿rwа¿‰M3÷Æ>eoƒ-x2d2÷Bš‚•ÿx`ï´Qú óf\*ƺ+Ë\þCòÒD•0ÏάQî+ZZkkË6lî¹-wÑÖ®Mºgÿ‰}еzþîmFƒ5ïñMxg\ ð#ú-’ Òû'ZÊÄ= ÓŒñôÈ¢ñEt¼|”é?2JÇÅñrzDГ*¼A…׫ЪBA…ìñ>ý–>}uùô"ý’ »Uh zõ¿ëÕOõê_êÕÿG¯þǤš‘áR!²6ë/4ëåfýH³¾¢Y?·YŸÝ¬¨ú4"J…^ºCöFýçú7õ¯6êÇõÝú¢F}f£>B~2 éßÒ?1¤ÏÒKCz×ö>}ÜØdÝ ¼6¡‚W&ZrÄ‘Àƒ«É¿OxNˆÕ)䔳 ýãY< ¢ŠŸƒZ’‰øX¦â§À§Uú;'Z拲z¢%ˆèƉ–UˆVM´¬FÔ>Ѳ§X -êež)±ÚDZÁ£ª\<;E3ŒR_‡ø)Ä 'Äõ8ºn¢vX­#ÕP«ŠUâÌ+§)†WëIò¬Ó¬…¬ _\¼ N—GÈŠ ñ"êÉœß_aÉ„ø®/BŸ %Šïø¦Äó-÷‰çZ"»² »'Äç}8ä9ñiññqŸÚó˜OUr$.ö-OD‹è¸ôý~Uå!„~Nü†ï‚8¨L‰Úw£‚þ â-µêÜ›ãh½G#wJ\#Þ)¶úÔñK<*÷ºeêÜ‹Ê/ˆ ~U=š@žÞ b_8$ªŒª8UW[§æ‰ª¶ÂQµ3?¾’\\bÎ2Õöš™2Šb¿è­]/.u¢nìÙ‹Œ12*ãǾÍíáÇnãÇnæÇ6òc+ø±…üX)?–Ç¥ócnÞª5k¼$i´Z­FËj)î k$ö^([9a¬AAõ#†UÛU Q”h)4V;èhé~¬wc݇õ.¬{°b½ëN¬Û±`‰½÷¬2z’ŽÐ;Ž ñætçlçNz÷lënº}¶µ¨-ÜÄÏ*s"žhˆØLî•5ûñÚ'“ƒ©2^*¶;l¶*G•¹ÒTV_÷w@ç, |ù8þé¯>¤©eÇ󘦟 ëEò¼ =Ç‹/óâQ^•hºÆT1U`L{™›p¸äš®o“ŸtµËs•FÌÕÞ$ç)ÿLÒ* ×MÒJµ·MÂ;´*ܪôÃ;uí(¶JÃS» Å \A(FžQCcžTźãbZ©ˆµ(Åè6ð¨bºM›RÄŽõ—‡ëŽ•—«"ìIèWEúÙ“_½VdTIUE|>©õ)"ÇÒ}(pÌ—®²3¾d/‹³óâì<•]ò%Ûg7ÄÙ Èü?>=5ÿŒtxÃõ56¨ªr¨w>IÖH52/ýo:n›}° ð?-žX endstream endobj 228 0 obj 4796 endobj 229 0 obj << /Type /FontDescriptor /Ascent 750 /CapHeight 0 /Descent -250 /Flags 96 /FontBBox [ -10 -19 768 682 ] /FontName /VPRCJB+Times-Italic /ItalicAngle -15 /StemV 0 /MaxWidth 1000 /FontFile2 227 0 R >> endobj 230 0 obj [ 444 611 611 611 611 611 611 611 611 611 556 611 611 611 611 611 611 611 611 611 611 611 611 611 611 611 611 611 611 611 500 611 611 444 611 611 500 ] endobj 73 0 obj << /Type /Font /Subtype /TrueType /BaseFont /VPRCJB+Times-Italic /FontDescriptor 229 0 R /Widths 230 0 R /FirstChar 74 /LastChar 110 /Encoding /MacRomanEncoding >> endobj 231 0 obj << /Length 232 0 R /Length1 5056 /Filter /FlateDecode >> stream xÚ­7}\W¶çޙɄ'!@>Œ (…D¤ µb¢¨E´ZžZEl«E¬OW[Û­¶ênÛíZW‡€þ‚Úê¶öÙnío}»ëÖµ_vÕÚ_]ö«jwkɼ3Úú~þñþxsrïù¼çœ{î;7@ º€©¹Í· âÁ‹’³ØÆ6w¬´ì.*ŠDú_l‚e Û6|óâg §>²zÓþðÇüÔ;[[|ó¯9‹®£C=ŽÉkEAx+Û¼„ü˜Ö¶•«âFÑ>äç#ŸøH{³©`g!ß…¼¡Í·j™~ý9òÛ‘·,õµµÔlßtyY¿¬}ÅJe7ìBþÈ;—=Ú²¬ó}ûÐGu>êŒt0q„¢„j2Ú‡:àVå*! ›™y¢”ËØ±},A=ê‚o*dT/ýj£Á¢°C"¬ƒÐ×:ø r!#\&…È÷Ã9ø¦ÁCp*à 2z`:äCyÆßAxàex G¬†v´-ƒŸ€GSÞFY¼¸!@=zy~ªœ†}ðÜTö+_ƒ 6¢ÅyåÏàÀÕzç”)ès1,#Yt¥ò4b¼à|Fb•BˆñPnX­ÐKá)Ô½ çá#’ˆ³É'Æ)ƒÙ°vÂó Ñ8‚p³:'ð ?_À ÜsßcB´:˜±N’O H!æYJÜd*©$3H®ÏlRO|d1YG:ÉSdÂKd?Σa€'sä#„+ä/ßRŽòÔLmÔN%Z‰0ÁG›i+]DÛèV„×èaÚO 0…LãC™SÌyæ#æsæßl»’}œý5{–½È^aÿÉÞâ œ“{›¥3ëòuºWt}üþWüEðcÁqøñÓ «é.útÒ)øž½‡§Õoh9®Ä:ÒG^ÁJ½Šûv<Â'BB(ÂXCRí)clÉV‹8:)qTB¼9.6Æe4DFáa¡!z^DZ %鱕y-²Ý+³v[yy–ÊÛ|(ðýHà•-(*»×F¶x53˽–Z.ø_–Ò°¥t×’,P•iñØ,ò‡n›%@ª©Gz«ÛÖ`‘5ºJ£·k´€´ÕŠ,s«Û"¯Å#—u´öx¼nt7 ΡY™¸1°aªcJ}ëZ͈T œ`s{äx›[Ó1)ß|¹º¦Þãeµ6deʤ´ÙÖ$ƒ­DŽÌ®Ž³ im=ÆÎÊ\¤æ[ÂçÛæo HÐäU)ßÃõ2ãk©WaÌãln9nÍUóìÊóÌ”2M)óµô”ai¶”³^•ó=ƒ\åL º¥êe²±a8 -÷áY´Ø<ªÄ»Ø"‡ØJl­=‹½Xs¨­÷'H ›ÏÝ Cu½?^Š×˜¬Ìsçd+e «8«XÅ“­æÎa|íÉaùïN…iv§/!®¬½[¢F²MÅ4eK³ùNT»–‰ÐÓ<Íði 8ËErH©·Ç0 GÉ\ŠÁfé¹ ¸P¶Á¿Ü+ñHt)†› ’êrÞݨ¡ñŒ²âWìyüŽ1x>”öS2•ÓÈ,)X~*¡;•ahBˆŽŸJ ^rÝZVkÎȘ~£ j¨`ºáVA•a¨Š † 7°ËqºŒVc*6+׸ýWùÝ‘óñ÷)ÚW·1¸“¶s­`”.°Œ fÙp1 ÑÑqq ì!}¹1>*:@Âú¬Oªº1ÝÓâþŠŠ¢òó‰1*¼ox?Ç7!NÇ댆¸¨8ÞžJçºEï÷¬Î®¹”ðø¶A¦‘ðû›¬]«Üüþ—Á ;­“’$²´|ò0Ÿ)˜ *$K%‘^‡?&,’ÔŒºèXÌÉTv(2>&VË©jÖpN7†îÍ). ZJ0()ñ©yòŒ†Tš:!6.ÊH§L¯œñÔìÉÑ/NéœT󇄗»ÿ›4out¶•'Y[s4ñ(!;­õþà_ƒ1·‚Ÿ[xúFcnö÷XÂP=C@½aƒ™íÕ]Fôi!ÞsÚºj$³¡µƒšG’«Ìw¹îd—ã$sYÌ«äŽ·Ûød{îø<׸ØrkG]´wjTh騲I%Eó«ÙÓò:ÇFèù ãÓ¦5×c.Ÿ(_‘“ø»Í 0º~,Þ±®úÏ‘Àwƒæ8Ù;ÎM:]Rêp”;Í**q8J±ö¢”A¦—óâ×w4ì’’ëáWMÌ»ðG¸ Lärù3M¯Û7š‹Ø+Ðî¨Õ÷YB»”ïµˆŽ³7 ·¡h°ã•®–&BR¸Ýœb²ëSí†Ö.Ä…æÄÐ\Â'!ÅE"‘ $»Qº\±ËÀGëFž dù\˜;&Ê8>•Ú’]Œ).Ö¥î<µ&§Ú† y.ºn©µðÀ"k²$_^ßRøXðÒ»ë»ç<®¤à'1盟ˆà×Ïþórw›üw†ÎÈÁ#}'I9¡Ç†Ô}‡wH&…k„Xh—â;L›LÔnÊ3Ñð¡&ý¥dæßMü%›é’ KýÑM¦é”ŒB8CY} §çÃÍX{ʈóHx¸g>AV•¼JæÂÈ{‰/äÈRáÒWÝüžÜÌÈÀ½‰‹1šbãb¬¹¸ Œ¸’u|nŠ‹6‘ÚeCgWW˜ÓfŽ!íá\r{ZÕX6q´.ï!æeç¸$Câq¹7ÃÁ_úb^dÁMBôjàöê»8*¸O”VdCîØ«XAí²<<È¿«¹óðÜ°ÒЈ-¯âO`{/âQØ.«ÿ Î’(¼u£fm4óÐé*Ä ©(úŠ  Œh£Fbè÷ìšÒŠ’ŒºEm-+²jÛÛ|KGîû ´@ Üïá±…á„H<¯¢Á$E†ü¶ŽDÖ‘¢sédo‘ŠrC8µÞ¢õ­r[ SEÛy²]Gþ^<ƒ²(þe°?EÕ2Q@Fê$ÕãÉ{©ÃHQØKÕ¦Rë1½õTÅz؆ô6¤»(‡X™µ£¤%í(iG ó«Æó43S£ÎÐ8'rEÈ95ÎÑÈ94N¤z?ÑKÇÈUREjDŠo/Oà…® š@$9þM3Ä·Èk`lÓú'¤‹ð™E¸h¶Y„õá-²ªQñˆÖ)¢Z¸P-”V EÕ¤já8™Œ÷N0’)Mx3M¤ ¿HÖ¦ iBVŽîÅ¿Bù…Ö?+Y*„o+„÷*„*„š aA…`­š…1‰Â¨D|/:FîˆÜ !HöovlGÙ;‡X ßq‰™yb€lö×e"zÒ_÷†XC6@:KpF]NU¼Ü^Mœ^Eœšþ?üŽt¶Â_ø2¢åþÂ+XŽ%­)û]WP:Ñ_×(‡׈ÏqàÖ«8Ë_¸Õcý™ŠÅF’ Ù$ÅcÀ¥©màÒÌ“G°Î_gGs®UÒ„øÅ`w€’£âmG­x+;À¢äfv@è‹ô}Ã/~ê@$ʼn;Å?Vˆ§ÑÃ;uWÄ“ŽGÄc™Ú€_ºO¨Þáu¼¥¿(…‰¯:vН86‹?+ÔÔû\š¿]uz.…GÅÍèfE6~øýâ£.5B˜¸=.ά›Qü¢)fgNg:Ž‹5ŽGÅѦº5Tî8¦MçI(N‹Iâ…Š“Ý8¿˜¯÷‹ã‡ƒËÖ¦—S8MÌÀé±Gűu9b2†$R–øàB~ÿ ?Ïå¼OáGóI¼I¥7è#ôáúP½^¯Ó³zÜ·zS@¹$e¨¯¹IgP‘ŽU{V£ FþÏãËH‰žâÖ e£L¶Æv™‹¢ ùeîûtÞ‘>ã~O’¼«rf½| ©A§JRC¥œ«^$È5rÕã _ª¨y+¹æ©ÕäVwCƒ¹RžV] _zP±ïéªòKà} *åYšHG‘{êT„~h¤«~pËæif›‡ÍèÍÜ*RÍ®€C3sÐ+šÙ‡ªYowºÇÝ›ž®™pÙЭ™tsÙª |8s'u÷:šU¨LœZÞÎPYs”¤9r¹Ð¤Ð¥šôŽs¡A¯kœ¦vü ÎV׫k5õœÔÙÃê}Ãê}¨ÎøzZJþov}svoØ£Þì½6O 6¯¼¥ÿ¼t5Y,½v\ùíÞ¦æVûZäݶ·¼Áæ¶ôÎÙsõU=Çæî…=žºúÞ=R‹Û?Gš£ý!èÛ´u¹çžX›ïÆZ¾õ>ζªÎ–«±6yî£ö¨êMj,Ë£ÆÚ$mÒb©só,šY²â>ÏÊÇk\±¢þŽN  endstream endobj 232 0 obj 3648 endobj 233 0 obj << /Type /FontDescriptor /Ascent 750 /CapHeight 0 /Descent -250 /Flags 32 /FontBBox [ 8 -179 699 676 ] /FontName /DWQCJB+Times-Roman /ItalicAngle 0 /StemV 0 /MaxWidth 1000 /FontFile2 231 0 R >> endobj 234 0 obj [ 333 333 722 722 250 722 250 722 500 500 ] endobj 59 0 obj << /Type /Font /Subtype /TrueType /BaseFont /DWQCJB+Times-Roman /FontDescriptor 233 0 R /Widths 234 0 R /FirstChar 40 /LastChar 49 /Encoding /MacRomanEncoding >> endobj 235 0 obj << /Length 236 0 R /Length1 40856 /Filter /FlateDecode >> stream xÚŒ¼ |TÕÙ|ιÛìsgßgîÍd–d’™I22! aH”°L ‹€‚’DDA)q+TR뮬.ïkX h5ú¢­ •¶Öª­5õE«Õ´´Ek ™ùžsg@}ûý¾ß—›{ιçnç<Ëÿyžs΄BÔ‡¤¬¸|Y7óo¶jÞ¤ûФT½=Bø^„„WWu¯¾ü/߃¶ !îÎÕë6­º*~õR„L§úþÈšK–­üË?gßÐmoÃýõk ÂVa€òí8._sù†kþú3£ŽÓp|jÝú˾xùÄJ„vJp¼ùòe×tóûÄÇáøA8–®Xvù%Æÿt8~Ž+»×_¹{†ßÇŸÂñýݽ—tŸl¸ó„nBÈlƒ:Œhhx4LŸ–”j¾ù#ÐWúÇ"®‚Ž! Ò"ÒÃ]FdBf$"Ëwî°ÂnCvä@N䂲[­õ /ò!? ¨GABúÏ?ö2Få(‚¢(†â¨U¢ªBÕ(‰R(jP-ªC”Eõhj@9ÔˆÆs·…g£ì~æNx*üö“°šŸU8Ë­Eáüe…†öú¿J;‚wÜvûNáô2P`z MBmèN4½…žÞmÂo@ÏÃh Ú‹"8Ô˜†\˜C÷¡÷ÐŨ}ŒF ­èØ Ï™Šº¡Ï¹Âg¶¢[ Gà*jAÿŽâux´¿Í U8oÞYêÄ Ç ïÂÑÑǸ¼°Í€Ò'@ÏÚŠ~”¼ ½^8K¥-Gãëðg@¡.´ƒÍ°ý…µh<:„~ƒ[¡4mâÞÕBëஇ± >,ü ½Àbt <ét ´x?&I¦…Û”¢ è´ Î^‹ÞÃ6\Ã(…Xará>¨}ý$È«ŒíH ™h)º =ÔxD_b=Îâã§`û%þ ÷.´­]…6ƒNü¨÷8zÁ5¸†¸ˆ ¨åþ͇s;Ñ£ðþènÅx¿Ä<Ê¥óÍ{ÁQøS¡<^-Ü^‚wœÆi¸ÞÀ”1Ø »«»z¸=ˆN _B;þtÿ}+aû#ù>ÙZXXØ[øÚ¢¹j@¢Åh=Úˆ®F?®¾ŒŽ¡¿á3D W¾Å¾ÂmæNîÚFÑdhû\¸z<{pi?‚íè¥KЋ|¾¯Æ;ñÝx¿‡ß#<‘Iù33ȼÁüž­ç¸B#<É©Ês-Dk€ßjßýÝ‹^A¯aŽâjèÑ;pÿWd<™ÛÃä-òæff'{–ûA~$ÿyþL¡4k ÈÝ" æ“@…¿b'´¡_†¯Äÿ - #2a&ËLbÚ™ææNæçÌ/Ø^ö)ö}n&·Œ{JX–¿"ÿËBká&U»yhW t'š²­iZ í놭]‡®Gýèv—;ÐôôûEôú ú}@X†6_ o¿¤îf|;l÷á§ñKøüþ#þŠn¤ ¶8©'ͤ…L#«ÉͰÝINwȧŒŸYÁleú`ÛÅfÞc˲®¶Üîqþ !.Ì–kÞ<;:V9Ö1ö‡<Ê{óKòwç_Êÿ©° ° ÚQµþ:´ ZyÈࣰ= ’x½ ˜û[µ­Çs ñni¨®5ãéx&lsð…°Í‡m!^ Û2¼¯m+îÃ7àñMø6|—ºÝ }{?Ãö,> Ûoð‡øügüwBL扑ÉAO[Èt2—\Ûj²¶nÒK6‡'Èòcc"L5³Œéaîcþ›y™y›ùKØ*6Å6± ØÕìì[ì/ÙwÙ3\ˆ›Ê­ávq/ó>>ÃÏç/ãïåŸá?åÏ ¼Ð&,®Þ š ÕϠ߇¾ƒ”)þ-|%gg¯!‚^¸™nnžãI;³Ž¹ù· Ÿb$ü>îg.eÖf¦‘¯™õxy—1!®‘Y…nEüù#9MþÄ:p;ù ÇÙâgÉz¦…P¬GܯY{#öƒü5’-x˜¼ÂÜÈÜXø)jävá¹]ä—HbGˆ }Z½€µC¿ —’h›áΠKîOp×½'’[p%ó6» }Ì„É?ð)|7 Æq<‹-'ß#9ü î¢Q܃ºñ]HÁÏáðÂx/ó8žM À­AbÄãÀ@gdü6£C´8J¸œ"ó™çùLc@‰_¡Í˜ÁisythÀ$˜6Ðä׸,Ó=€÷§óÏSÄæÞåv€œ=ÄT¡‹ÀÎt’7À²ÜHó1èäÀ꼥ɽèºB^ ¸?ð“ !|Ja= ¥ Ú¶ì…“”‚¥G_þ¿¨ßŠÿ‚®ÆhÖ0гôÌ­ìT@¦.Àß°­Dpô ºƒ?ÄýÍÅ`7Y)¿ ¤ü÷è{`sþÞïEMоÅè!¶ Z-2÷Àæg ¶ 70A[ ÍAÏÛØ€¼w.ƒ^ 6j6ØÄ×Ð¥…{P ðî¢Â…hiá¡ÂÅh5šWØ ø»±°,ê6®ƒ,àl0ö5| ìÑïðÀíè}À£v£?ÃößÐþ‰Üs¨Ÿý-`gsáÖÂoÀÚÇÁrß83 Ðërô Û fÕå/ û Ó˜n°P¢ BX‡ÖÖò>8Àž>äÙEÊäùíJóÄ Mãs ãê³™ºÚšt*Y]•¨¬ˆÇ¢‘òp™,…‚¿Ïëq»œv›Õ"šMFƒ^§Õ<Ç2£ª©ái]Ò`´k†g̨¦ÇáeP±ì[]ƒTMûî5ƒR—z™ôÝ+¸rÕÿ¹R)^©œ¿‹Rjª®’¦†¥ÁãSÂÒ^|á"(ß6%Ü! Žªå9jy@-¡,Ëpƒ4Õ½fŠ4ˆ»¤©ƒÓ6®éŸÚ5·O¯k ·\¢«®Bûtz(ê¡4è wïî‰X-×ÔÆ}iŒÐ¨AoxÊÔAOx mÁ ™ºlå`Û…‹¦NñÉrGuÕ nY^>ˆÂ“Í õÔ¢¾foÔ×H—ÒÞ Ò¾ªáþ[‡D´¼+aX^¹ìâEƒÌ²úKÞ;eеù¤û›Cx¸µeѶoŸõ1ýSÝ—Jô°¿›4¸çÂEß>+Ó´£ž1H"Óºú§Á‹o¶Î“à]äæŽEƒøfx¡DûAûTìÝ%á©´¦ë2iPž^ÓY0ÆÛ?ˆ.Ú$ï÷z•#…ä*õ·/ ˃;pDz)þ}vÔѦEò|÷LuÕ>ÑR$ë>“¹T0¿]¸äü9µ¤^NK­§+¦- Ïq”VHÐ’EaèSM.i@ý+à2øëÀp×àJàÇ¥ƒÚ–®~±êEzÿ ÃRÿ—øýâ»5ËJ5|DüÑ"•’ó‚çÏ•‰ÁÊJ* B pÚ8Q=ÎVWm"ƒánQ‚ ȇڀ¶Ë:S@|Y¦ìÝ1¤ åp0Øwá¢â±„–ûö#%•è$]ôÌð¹3ŽùôLß¹3çoï ƒT#Ç &zþß,:mS×4bçÿÇéKŠç[ç…[/\¼HšÚßU¢mkûwŽŠçΟ+•pñ|¥f†Aô.Z¼ˆVÀ?™žzi× P5hã ­eã#Åñ1ê£@~/>ÿdz°È@ŸÅFxUþW `µKÓŮŴC'Ëÿ?o*œ¢w©Ù7·•ú4ؘøîñøï§y†~ÌFIkûâþ~ÝwÎM°ê¦õwõ/*ô-Kb¸ÿ³ˆYÔß=µëû‡ Gwø§ÝÚXƒA´ šL•±¥}ѷɬÊnG5"”sl hÎ>‚Ÿ#/€o)÷#Ž"/dN …Cy4<÷"œ‡¸W -^‹¿‡Ü ñ«¦±¦ ÄÓMsÆšP3”ųԤe‹l‰@‚Ájž•˜á³ ‡Î€G1¬ú¯íùYä:ˆíl¨Q ßmyÜB~`Øn!º{µt/D-é´{Mem<æûìíߣ¯ékjá£Í£5`Åq'vDcQ’Ñ8χÝ$äº{.x×~uí® dï¬-ùõ‘Ù«~ˆû߯õ¸pEå”/òw¿òÎ3ýßmHB¨mÈ)ål¥fÇÀË-Ð8'Z4@âÓ¼Â3|ŸcÑ#ÿÙÜiË:]N«CDB¶¾ÞšÍÄ’$yï%;Ì¿õÏkwÏ‘=­×q++[WÝ‘¿ú7ù×óøŠÈÔÏñÚW~3ØÿØý*®È?…ïE?‡hjžë ®cNFëêòœð0ZŒ–5k¬è°U1èÙF³#äès0Ž!\©èCæ¥fbö¸„fõ;çŒuŽB«NZsØbuåhÛp mІË>\Ífêëj;Åê­ è#V{MckýäÕ;óOU•íl³µvmc]Í´+—®Þ§:`hî#‹ ÞcP³"®/°²~+~Aƒ ƒˆˆÛ·ð|óHe¡>¶}1¥ÔX'¥SjRÚ˜„MvÈó7v†¸î)>û‡…“x=øFz”PüHáõŒ¢U³Z¥9»T‹wkŸÑí͆Ë6Ó§õô&´5éˆÚƒbo0J)“’ÉI“^VÓdJ¡£³ Ÿ2Ïrk±õÑýË4`°ùýç ™ÑèÂfŪõ¢¨%J´+º':e£ZmZ ÁåVi÷€Nx"GqºZ¢ïèbgÏWsFK¬oÙ¤ÌÆåáò²rˆÁ!%¼ñû¾ ámQsDu{\Âˬe9 ñÞåØn‚’Ó¥r,-Ç> $Vѱyt$àÓ¤RÝ++¯·e¬ã€_.§ÅN ¿±è8Ñ嬫­Wo–™Jfݺaq׃×=p˯—¿|ýåǦæzê7“éò\Eã”ìŒ Ùõ)ž{ѤݯäŸù"ø®_úgþÓ}w-ë}ç>}àÊ´ñL÷lwí”·‡—×cððFÆC8œ[‡]°±Æ!h†V«Ø Í}Z¬bêƒÈywzðnÏ3â9ÊÔán;€‰!8„oSŒˆÿh®m©m½m«µ aA±)Ð)/’©Obº¤=‘<Ïá®±¢Ø—B»•ì$/’·È‡ä¯DC<¡£쟗è“ME™îœsºsTÁnëìijëÙÇS‹ñìN-~Qû–– ÎžŽÄI +*g¬¹‹—Üâ¹Íç;LMÛDnË1Ó1ÐõžÞNàˆ1J`FÎ"”Í«x!\_„‰ ×Ö×cžZzvœi×+wG#ž·xôƒô¬Çþ5/_·pšsù3<ßûÄõ]ÕsäÕ·V¯þÉ¡ü©±¦šbèùàg-ž}é #û 9íPaXi2ä&i§ê¦é[ËØ·´¸¢¢¡BÉteÞÊŒdþ©POÒn oN>Y~¤ühòµä‡á#¿Kþ¹ì³ˆa¦¦bßz Ñ9yàD§‡˜Ì!†Ø9„w (‰T&0„[ˆÆŠøsx ²#-ù_Eß< *€“ Ø0„ ¾º¯š Tï©&ÕPh©°ú>D>VtJïÉ gH¢Ì‰Ï*¶mÄæ©£óéy©Üíì9M““`c|£½Í££Ö\ªˆBõÉT0ª3³|™–ËåˆÌò\Äê^Rlõr4CIÖÇ–c6ɧ—ã1@ñFl*N¢òzøSu¬õ$¶zu€ON•YrÉp¸@ù(þdUô‰†ÃT)g…5ûnzxáä£[úºïȾ}EJöx-׸"•«î {C‰»/æîžq}×kØYÛïºlîâ;wÕ¾vðú½Sb* ×Ìëw­›ÛÚˆO ê¾wÓÜÕ[+ŽNK ¯G€¿:dD¿UâN#6£©FÅÌ(f\iÀ@3ZŽÇ¬AoD¬ÁÈò#è•_± » h4 +ð ±ñ9ü x6z¼[1r˜×jx^ñûž £Á«½Vkfðnæ†0CøŸŠ7« fÆ]€X#fÆÌ+<¦oiQO“Ê£&P!(~"R¨9—ÁꉣâXo“%gQUf[2ÁnÑ¢ÙlL릧;–°EÎâ:È0säð£c/“«®x4_ŽOßž¿¯êcn8{+yhliÑf.™ßÄÍF2*-°ØÚ¼4¸•ÛÊo ÜÊÞ²$+ÏgæK åµþÜ&ÿ6Òïí÷?ÌìÕî „Í(ŒÍ¢Åjs8]»‘0 %–E’íÃJ²×çg7ËAíî’$ÛŽš¸›TÅ!ò‘,ƒ3wOD><ýPŸ°‡Ê2þd9Œ•pW˜„AIþuX${d,Ó‡(ZI÷ˆDô”ÅwáÏTšì¨;)}Tñ> Àe°ªªPòS¤Ù¦I&8 ¢E°QŒ½¸—ôJ7àÈ ¨CÁ°\tE¿–]o]ìæº\g8?‚,°TŠyþ[¾OI€A~c˜ÙtA~MÖ>pó›.¼rÓæõɰ7–jsÕ¾];.³Üì'ÇvÝ2´öp_lܼZB”3û¶^û›Æj˜©|.^ìùt£8:«T^¥Ý¨»Útƒö½Ègžgðf3»Ùy³‹mÒÄyŽ {âž‘–j°ðã°ÅѨ\¦Û¸G]”f#â*”GŠUïE•J%Q*»*÷TŽT²•ž"ÝᲉ6É–¶)¶Û›`óT|㨜GðdÉSQá@¨Ú9Ú dÄßÐò ž÷ñD%!`H•?¢µüA?á-c4¢ Jˆ¾åH6A©\]ŽýVi9*3@‚Îy*8TØÀ#œÃvê©X2Öòú:Ì;ìç)€¹û¦Ç^[>ðÃo®¾îÍË^¸›¿^;ö¦uú´º™ ·ß²%º[1ÎýÉ϶¯|òÖ'/>€‡ñŒü¢±)Ûæuýqrê‘{Ÿú·¤êÁìÂIæQÐ=zéb #l¾‰ÜPaDI@Á£ÁS©Œc—qñuüy¿KFŒ@T¬ÇȨ±ìþ‘âeˆaË9ez–ûóñѨeßwxë=î(ù1äOб"«°mì–cŸ'Ÿ C‰ò428©‚öijGâh¢¹i—Ll3m9V_ínwÏ–Dìd/PoŸï†H_´¿î ÷£ÞÇ# ½ÏFŸ‹½¢{Eÿ[£S@:̉Ws]Þˆ1bjÅ·â7›ž@¦ñ¨·¢V<3¾/‰]\wº _JVG/‹­©»_ÛXu]ÝNv'×'ôin°Ü`Ýißé¼—½[s§ånëÎÇ¢ÿû¯º!ö°æ3ýŸ Ÿ™>‹}V[!µ±F”à µÜ 2xc¬šˆ.Õ+ç¹jšÙŒIZ@w-H?ÝÓP‘E”U²DÉve÷dG²l6ü<œ`@*Ati—âp1.Oæ(þK \¨£~Z–Ñ“§‹¾:zL#"ôÚD*Xfq²GDæÂà˜ å¸Ê^¹%­`ËX0•Aê˜'œÕËQÊR]÷’¼S;I§‡ò-úM8%8]Ř$Fë"õ%y§ÒoãiV²šxûCo>ñÈÏ×=5˜›ýþ¾—Ö-Ø„k®Q6®ZÕ—­©Ÿ×vÛåënˆN'OÝ´gÁM/îï½kí-¬êÙùƦeW.Þ÷κ-s/½zãÜÌšTþOÓíºþÍ gä.ºta/È„ ŰA©»6ö÷Û²÷bìv·E³Y{µáã&ÛÕÒÍ6V³³‚Œ×p1·ssL0Â";ŠW 7VÆÚÀ¾:)ÚTd}§†>Ãb÷9® šEI úýeÑné¶`:Qa"¯)´ E¨H¸!|H1hD3ãp:5­Æ?„ÿ­hÍpyÔ¤X†HúÀÜ ‘/“¤˜ÚL§LŒéqim¿*ïXç¨ÛK%Q§ÒÓà:5m3ý£m¦¤;± b¯„‰£XþÏt›¸åX“ÐÿªÃ”8÷‡{ÁS’¨ ¬®W?×ábŒ­é óÄØ?..¿ðñ.ñ7"·QÜhß&Þk»ÏñšïµÀÛ¢Æm±ÚAFpàmÞ[‚$®áC>^IÈg”Ã.ÙŠ›LFâ‰;HãoškÅE¶*VÎ:TøÃaJEëÌ0ÕÒ‰ÍYˆ ¤0îÓ¸ƒ Ë.Þf#ó]³™¦ôR8<Q$óyµ’÷ÒJ~WÙ²‰¦9cj Ö¢7ñ•Ê–¢Å€Ý’ËÑ¡!à‚ß4;Ĉ=4û`¯’€%´ûlžç@Õ÷žº,%°:|¬,±V‡!n èŽ,"‚`6\· ÜéÍ©#qœÆ^zú¥üU¿ÛºàS\›ÿÅ©ÅWFÆÉW2ë¶JU‘þü ¿ÎüÂÛËýxvaž(Æh•±æu¸^iV²«ýWûH?á~:ý\z$«Yàéæ»…­š­Ú>¾Oة٩Ֆ‡|¹,ò%ä°F¡$ÑÈ&SHëÓ”˜2­dBB¼Oð‹>‚À¯:ôh"‰ªE:´@~­ÈUU ªG¾Oýþ€Fû´FÃ?ÝLÇ sžõ‰Ò¦>kcòéªD¨:·®ó>-bèc|óÚ²Ýàh1Y$ªÌU¾ˆ*³Ä²H¹Ê¬rµ²\eVù®ÌȼM5^”Q*·@o:GOwž†uŽ6©ãJâ€XåUè+Ò4ÖD¼8ú¿LàR^ëëÄ™j„Äê@ƒLÇýêÔ‘ÏquŒ¬rðR}‚~WnˆeøHÄd²^4?ÿŽoøäÊ5鉓âWù®ß \Ö:m%dƒaG£Æ'B>—\Æ[iMçãM!ŸSC¾¨NTÅuË`60ÀUÂQã$Ny‰Å¢BøX"þ4ªÀ¨" X7ø]<ð\¿¨:r‡”$2©¼4©l3©¼4•*/je@åe`Wò?ï4è]Ø¡ÕSþý¥ó<ûTWMõÔ%þˉ=tp#-”iÀÆ$ ‡-àk¼Õ9äoTðá<~øŸóç#›:åŸFT•®;šnººˆó7cØ;õ’Ë€mŸ·®ÏgçΊä¬–=Vw$R#mfÖËùw–vÄ)¿f€ÍylNw*í:vZ’xbÞ8Ý¢‡HõJ}Wý5šnw·çšÊ÷€gÐ=èÑW§6ê·éw}ÒÛVß]+û_ìH=k`~ ®gfh€/î”Y)×ÂÕ P­>qY«ÒRs•Ëí.ããUŒ)^¦Å‰PÐ@)T‰ä)‘!ö°´Y¬Älk%?·Z VÖÊRnXDOTAtˆ|­èuMmQlކ¢$:T8¥ˆô1Q‘žÎÌ®ì/ñ @4-•PY¥rí¤êBR.‰çìU )3RB5‘x¬"VcxC´ ]ûž ¯:þ_}9?|W4‚oYÕ,G£™ÈåùeÏþôŸùŸKº+á:UW!%×Ð5£è%e½¬â©¬PºÉJ<ë‘—YVÖkB>"—¹C>«\æ ù°Ö†|9lµ€ÂiÜB9çÑP’{Xz«§LÛ­éÓŒh˜‚§5mš. ³T3¬9¡a4,½L£j‘f¨ðõAz/òJ@…òeR·Ü'ÈLZn“»dfX>!“e¿þÏTuæ÷Š:§*ZB…BšFþS]J”-ª¹fì¹’–T¥Ódjͼ¨´'‘Ž|G/hùìj¹ˆg€gÏ$4¨øD¶%$a¥l!YM®&ýÒ}ÒÒɀˆðíJieý|rq¹Ì9Îg™P¦ ùD9,…$”F bПü‘øÃ„Ñ §ñ:2DŽ))çÿ›Ñ×ju*øèÔZJ6Ý.yYç7àS”ãÓ§Õ) €“ÔØEpoäÎÅÈßµâŽ(_$ˆj%êÙ»å g>©[q¨f|Õº…’h¨½qŃß_ƒ¯ò‘i³–šð®T6}z^ÈaO^¥Ò¥ !þï@—4~MùÔìÆ&¤q™<Ƹ¹Â\ɦë=ÝÍ8Ó1w4Íðn.ír1 TGãQ£+çÎz²éæÚ¹µkÐf´Ñ½É³!ݶ»oN߇îI?K𤋮}Óõš{¸ö÷®÷Ü'jG]vÿÙ3Rûú·ëŸéÈ <Ó5-µw¸¤.s]ãyÕýJú÷;éݧMæO+—I!ŸW.K†|q¹Œ„|9,ªÖEùbàÍP!lGn·›Æ.Ó){ÚíJ§ÜàŸCÛ]^ÇE´ Bét,®I/­ò¤’e’$ï‘e*Å#2/ïRjq-&ôFÑ,™-d¾yW*ÞÀMº(`õh¡É’Kå¥j £†2°Ñhÿü`/änµà.zÍ4ÝèéƒBy})ÑnhÆÅD̹ݖœ[´æÆs Nrå\i{®8õ¤î¸uÊ˜ÊÆw-…(Œ¿¥Kß:™ic§}‘¶t>ž_ÐnjÁÜø$îK-ß0Ò–N/ ;Ǿd¯:»qK¨2ÉH½ÌÆÅñ@,ræw¬zx¶ÿü‰þ3;@¶ þ 6i6Šá—”Ö~+¶îÄÍÍî$Ø 8Fªm ¶kl÷’I¶²2+ðL'—Ï|rCù¶S¾†­V &¤ÌZf·ZË@G¢˜cOcV‹‰Ï«±j•ë<‹EÓ¢"2âPaä ˜…ÓU¿ ªË.^¦.{–*0Á!6;}„C–Óex¸ —©:[¦¡2jŽtôÖ2O|ÙOÎémgÕÜóÞ:T@ùuB¤ÈëÑÑm¥1}pr*‹º8uö¶,RâZ«ÇZ›QÎ:Ͳ.E‹­ëÑeÖÍÖðø9|Èúþ7¶þ•`j{:x= G)ì=´6:dà46ƒýô0•âÏÑâþRæS³Ãž ;-¾«˜­9«Óš#¢vOÎuûõ9x̉böõ!{Ž(–:,—r*U¨“¡Ê|ÃÿWÊT·Ô‡»™ Tbð»T–ÊÏÞà‹ÎÁ¢‚4~ÂøÀxnöY1•3ÛÙ)gz^pž™ZeÓªqõg®Æ€|hŸRsu¯ð„î ‘½o¶á[¶EcŒ#Æçµî¦“bbDFbÒŒÂpÌÌå°·9+” XšD­¤%fmHK´3ý¥°—†WsÄžÄWÅ8ëÜ*‡Z죫¼Q[Ôd°T#vWc»%'%Qg¬Æ‰Uã¨F.ÖQ¾M®Äõ Â`] ¸’i:®žÆ}u)ƒÕ"‚;Š5øÆüæüçùOó7þþžbûí—xñ_ۯÿ>ÿvþü|;nÂ-omoþùüÁ·àJ< _üÔ-”6€ÙlBµ÷Uøš#( ]ýQc6•¼Ê½Á·Á]¼;y—_Øä~¶ühüw¾ßùß/ç=11æ"¹Øøx:¹8vi¬;Ù—Ô¿Š°×_áoõÿÖó;·7Ž_/Ïõ~ù{±w㟗ó~%ˆkLLËpÈ'Èa€Z‡F©ª2oÏ ƒ›+8*!Bv ±"¯èM{o·—óÎL–âb”ÄJr0Iv'‡“'’L² «F«æ«F—™Mª¾•¼vÕFšvU'‡ðÕdê¦'.øÏø¸sN ¨C”©þ̧f£E§Žª¦è„qÎZ´¢4f.¯pùÝ‘x´Â­Ãå~HbžÊ:ñõMÌ<³}“"€ÂãÙ² 4XBXõQ¢8Þ n`'­üOŒ¥ÊQë, \Æœ¥‰ :aŒñGçdÆžm÷Æ;ü«ßý¼¦wRö¢Àš{fÜÔ^×F®Í_ÕÝÚÀ¬£¥Öý›;aš®Ó=Ô·èžÖâWN}…?²èEY¨x¬wUa36=ƒÌlUp‰¹x.ÑZ‡ð4åD}C½—ñ±KÝK=K½K}ä hMÆs¿½„Â`² ¦„¡ÒÄFµjƇñx7ñ&§£bX –e0Eqt‡1eyÑB>´`ÉòŒåC c"Ûž =Lˆtu \ÚÄ/&ÿš,€Ð*Ó³Jò-8`PRJ¦A”ÙäóxÊáiØ]æïLôôž¦‹JzÇzs©DUT‰,MFÒQLµ÷è|¬¢–:±Øåâ‡ò´`‹GõUÚ:Ta¦âjƒDHá®ÚP‡ô†ªDLá5›**#V`MŠ¯Ã¨´¨É¹ùpz;ÁØhWèWW‹+lgG'íA=ÅidƒÞmαis®v dX _‹s® )Íó´Xê‚äÜ„ryôÜ2 â0OE¬O_¼æ–ÄÄÏ^ØÑú×çÇgBÿãõ„HÄ»èк-?×Ë?ò£Ù#ÿµnSƒË+ëëÛö|oë…ëZ·¬ºüÎ ïÿPË5Sø—wü°ë¦Åµ«ª‚ÿ³áÖö;~õ„RE~"àÞ Š{SãÅdq`qp-^KÖÖ5)¹Yž+ßËÝãÛË=æÔg//Þ,‡w…ˆhÖÈCdX±A¼Š—©Ùj†Çµ¡gèô'‰+^VE'­ DZ´e.g(¤pf¢w  \ÜdƒGI9 _(zŠ]NµœðôÒÊÎâÑéN QÁÂð~}–>`¿Þœ'NŠM¥Ê¤è³°Ÿ;õ‰ ccMtœá5:òJ}ºbÜ-+| v¨-ÆØØ‡ÌQ½-´ºýE°·©±—¨ñ}xi<3KˆŠÜìüËíåãΜ>ghYƒÉ¶îb<±HW}a„ÛtMâ 4¸•©LZ™(Ws¥ÝéÏÄùF~6¿ÉÌF‘Xm¸665<5öhL¨ˆåb¤-½A­ùþØ‹±¯£|“©m†B>\V©F›¶Ï-‡Áõ†p“DâFm%ø`;Hé…OTM-PVPOLÔj5Š!§QÀˆkÒæiÅb·C€©3hx5ؤN]1U[:¥9+¦qwzOz0=’fÓ!Ie§¤²SRÙ)•Y­[mx½ ÛT›c3Ñs¶ =gó¤Nãßuž‹ÌèúÕÃKt~®©k JÃ`dZ/Ü´oœÔ7*Çuº6‰ðæH,Rn’ª‘h‰*ª±^'‹‘j×G¨Ï€Ue-.+À ¨‡ª-þ&âåUCãò@XÕÁ’Éa~‰GêÚŽ GßüÃ'ii*ij2íåžÀìknþÕ¹X$Òê{ÿÍ?>tÿ _ë– "‘lyïØ¾¹oöÎÚpè]Øüõ¿æ§±ÖüýÜJàf21ÅˆÌ ªç^ÍNŸýeSqIˆ¤œ•Yë™Øp~Z;õIfF™íÌ3¨M`f–æÞ¤fu¢Y¡,pø„dD£×“ù• d¨£~µÞj%óëœô8þƒ*u”×Ê–:õÚºœ æBµêTHZ¸%Y‡‚lEU:cP´ðPƒÐÔ§ C…·• ½È``·º±[­u«W¸ÅHPhªbQ ù0|ÊÀã©1: ûvâ8NÁ ŸÃÃ$ÇÄ·Ó¡ Ÿ²^ïï¯#ÖyõØ*…r}Í{µ‡uŒ5aÝ‚¶ÔýíÐïÈò«³QlîkfµþÙÜl~ª4µlv£Ò¼= Ñ™ •ÍÄ­º™ú™ÙÖq-3',Ô¯Ö߬½Iw“ÞÜî¼ÑIBÍK›I—¦eš’Õ™ç°Ü_Caø°6gˆësÕ§mÌŠ†6Q é20’šm4°†&7uò+ô¹¹î¥îõn&åÞê&îï‡DL{œnRšt»›.Ï«Î݆˜iŠ…Õ'‡«quWÕ †L8Àϯ{¯¦_.Ó7šr(ŠôE"¬9!}éE‘çH p-”s áÕJЗÊÕŠ)' mBŸÀˆ>%`:ÉÞ2±åŠ¢™ìéíMÐ5 P#êÇ–dÂfÔ|zìd§8ÚÓ<Ú v4aÉÑk‰TqMÉ~ÆñPGqâ¼4g>=;Þælãê¯Õè4„—ˤ2Âgõ9ðÀ6?²ÚÌ!£—…Çs9?jÐd$œÍè­~ÑMe4òM~¤æSÓYÒËÊJºP÷bˆÆÁd‚½\´¿ÙŠéb«êãy°z 9²_T³Ã¦Ü8 úNã/ÍF½>ç–ô9ì~*í^}N¬§¹räZȵçã®stuDέåW_?®¸öw¸ìç×wÑ!1‡:[@ç*\Xàžâ 2ý¶òú K¯ V¼ñÅÂyÍ‘(IE#©ÁÝ›/ï·ê\fÑàhê^Uӈ署;eAÃì›.·xn¸¬¥fÊ5 Ê·¯*+«jLÖfª T„&'nοvãx»`lj¸{Êpg“§ª+7C]£G g '™#ÜíȉÊñ¯Šº¿/ÈQ©6svr«á³Û@!žªº ­R TÓ ôz#½Þ`p»K´¶!æ#@|E —ÙÈÑêå"¨>Uó‰¢S¥jê‰añUPÛš´¯´ô( `àp½‡Þä¸hѹO~¾›Pù¥Íùú =†Â_ž¥UC4bQ!T˜–Ž—Þw¼ø•OÙ$Fñ#üaþðçËE[ŒõRô*f#ûfûó”F˜.àF=fœd Ú§¸]ÄúœH”ñù–Ô„¸Žtq}Ü3Ã}np"ä.7Dc›±Û8`dû 42È(%cŠÃÆFÁúÿlSÖØy¹µ4oKGQÅ1ª:c½Eo³·ÙâÊ©+ÉUåˆ{$F/D%&(a¯ÎíG·Þà×ÀQˆ•%ìÑûü(Àû¤Òr’’=ƒP¨«£Þ½ø›•n ]Å€&©³Xœç—º <óý·ýê';žj{tYrû+MØV]wynɼ2›“¯Žüí—§ïêkld=8Ã+†»Çâc¿¯­ûù‹ƒ?õÙÁ™24 쇌¿Ü¯añ9 B¼ß™2U­ïŒ˜µB—Ü-ºBâ•'þ·ÚÀ;€Â뇩M Ô0òà‰Îæc£ª §«5öYÕÛ++«3(L¹ç2.äˆßÖÎÎãæñíÂ"ß"¿°šÛÈõ¡>ù ïé„4‚>æ´ãðt¼À=ß¿4Üåîòot÷úû­·Û,îÇð#ä™ðüþ™ð3Ïgš“þ?K§±›'³¬ ­;B;¤¾ð©°`‘ðó…$ÁÈ@D!8 rÑ%÷ÉÉ¢,©æÝòÀ·FOÉFyUàCó~æŒh…¶±çh¦4XsÐI½üfÈ€çvˆ!%ª£Ó]¨  A4ŒF–Vôä•Þ½¤Í‹w{±wë)#^ä‹üp|KYËòÃb(C×tööŒõtžìQÅ*‘híQÁû¤µ¤bºy+̘®—ÝhhhÀ êB$:U’HPˆD¢;çä;lËq¢˜ÃÔ )6ïs¥±L}’Í ºÚsKËJŸ|¨PèÆÌм{ミb|pÛ×TZôáðÄ•.|hûò ÆeðŇþó¾‹M;çDSQÇÆPpÖò‡9ӒܤŽ'M)œ„¸ùvpö«IkIº¢)u®¤‚w«b¥)Š˜*nH 8UÈrê%Õñ¤%©Ž§¤^ µ_+E¯ÒMïüG™P€k:ѲRðmŠÖ^¥E€uUUŒêuPìJÁŽK^Æàc «â ~Æ9»È w!IÏ0ôVw+® „ôð½SE1'K! Zh§¹ÄšÍzF’RÉ õµsü|žO%U\;ž(Â[bøx"AãƒÎÎãÍ£€mq GP ÿéÓ3)ª$“ÉLWê:ö:®ŸíK=“N Jª/EPÊYéHÌçækÚw  K©qºéºº{ÙÇ+÷¤„áÔ©‘$$ÉGAÞ!ÀP¦6Is¥ïI«të¤ÍÒn´[zR8"¼Z©jl1Ã$kÐ6ň9'ùƒ)!¸MÏV9Tª…ªpUUˆÑ‡^6HÔɰ:ºœ}ÎgœLÈ9à$ÎÏ+Úx¬Ä“š?;=Ë·$[¶–¼ø9£c½LÑ?:»Ò ]€U„Dâ7@é&XM,ÕTH(ÁB"®äª¤s«Z蚊*ãt÷ÒuE`¡‹ÆØ Æ8û 6M²‹ g-4˜.I1ùYK߬»G¾þŸMs#½ #¶T›e§¯ZŸ?•ä›V¤M]2¸nÉêiμò ž>牫Py惇¦û-áž×ð»Sºss×üüõߪ2M×Ïc‘˜-%™Žkœ`ó fBdR³Ò¸#­ L'¯B"ýÔ¿0¬â%-(:RŽÞ±tõ¡ë0Ò»aá:*¼£Þ…ן¥úÀÖèõ*8P?Z¥AS§*Ø`’SLJ¿1ÈGÚÄœ›?SQ|cqÕG9bQ„AAB—@—Û³ÂìOØý,C_%@ר.F©@Ûí¡ ô“¡· ø´·™œ´Êd ¿kÆÇOPKÞy¬³3Q[\ ‚Oí¹ÇºÔÝééB]öwÎ#ùÁYó眊?¢­ÒµÌÊhBÔL„T!‹gÔêy•ÉŒ÷hÙ¾ç\êZì^â0£å­ÆÀ9fòÛÉ­ü6C¿xsàaò”ûímòžù}ñ4ùc³v ]šnèÝvíKÂÏͧ°v‚ñ&Âh©¦ð )³êµÓÈtíÜP;i×.'½d»m»ç>Û#ÚGtCšCÚAÝÏȟȈá´Î®9!`$œHÍ)í€hƒ/laí(ítЦڬ9ëRÇVÇnLJÖáðýšÅ,ô·çXê¨Úhö®2Ú£4¾Ø‡)G„75θ/gvâõέÎNÆyÚnï£Á’ÖìÔ|¨aD¢žh5#^ó¤ÉÁ¢íT®˜*Åš6ѵ} 2‰&ÉÄœ2am‰hij ¶”¼æŒõP×¥‡~K2 Þ¾º´—ŠT¢×,{½<îýÌöt'˜õCOÔÐ@W\´,:È#LHO‡"¨“½ê‰oÓ‡s¥:g„]C­N<'3Šû}Å#_ñ\éHW<Ò´ê‘bÒæ¢'ç‘,9£¤NàÄw|õŽŽï*­m+Z1+µb9Z7{¯\¹mñÍÕ!Çë÷>úùßßÿêØ6¼—=+êçÝHÆ¿¹aÊkìÛÿˆñ{Ÿcá'•7(׃O4!f3w+JMI»#ժŪV¨á©V£k_‹&kLX£Ž¥[ÖV¬TAMVUõ‹ƒê<5PZ°J:My$èBÈ\a¾ýVž®t‡›Š£E³4L]êcâ«t;¦ÎÌ—ù2«÷ ¸U Tðåð$MVóT±ê[«ÍxWѫڨÖÃñûªm2UW3BÐ^üxqþŧLÜ!Ýç¸/ÊLa¦fxnfn6p÷³8U½Uà„ÝšÝÚ]â.Ë`µVä§–V.M¿Æt0¨¹£  CŒF …ƒ»ƒ/IÐRqáD„ÀéÊ «…×:|_t`'„½Cä«ý¸21„EůÀV³E¼ÃlÆåTXtueÔ¼±±˜77óò5Wœ~93`ÂTÄ—šºMæ&Þä©:ÊðŒP. åœQ:jBë&È>é<Ù«Žï55õ65A|›*ÍQX#1»3qD#θÅìå~\²;ÔØÐµ”à(}kø…³u––zSK¤:Mÿ9êø1dâ¼±*â“=û÷/:Ôs颯LÐU7+Š&ÿÌì±ÇúʪÊËãS–“Å3š¶¿pÕ”ê†`V¾Üf«YýÎäôû‹ ùiÌïÀ/f¢æå«³ížè}õ ª—•çTÉ'ù‹vHló¸¹KÖ»*Ú½„~3q£ë&÷ÎlÿħîlýÁÜ»\w¹ï›;ÄẺ_˼Ö:¼äÄ’‘%§–ø¼’£NÌÚëCK¸Ç5³ê›}ÈÉÔ˳|ÈÓòÍo¢hm6»VÓÁÖ%²‚ŠPvØ Í4WôV}óîÈ3‘#Ldï:´(Ñ\ªéµÖÝò3ò‹2#—îQs¸E†k÷À,<‹~—:KªYUTufµÙ±}kÛz Þª‚…=fùûZpËS£<³t)nóôyˆç§äWˆ嚃šà”Ž<â «ªÌs^`Ò`ï‚æÐ&­„Ä4^ŸÞ™ÞfÒnj_Óªél.ÉôµãvÚ7#h+^?(ÚÕÂÔ™öâ$4(R{$ÇqU]ÞÌÎ8žïŽÇOÄÙ¸‰^?7ã …¿(V ñ«¤%é%Ê’=@sn ½Õ¯7d–˜vÞ= OSÇr¦ÕHNlvv;ß°*ü]±¨cÚê8Õ6:‡ÈOÛ}͸¹&Í´1¤ÁtÊ•0””ž@FÍá© }=u”iáYÚGæÒÅKŽâk ¶ÓíÛîN”FR!²èS £‰Þ“b¢GBïIôRôOôˆ'ÕÅ^£âhÉ(Œ}BMD³H?œ +-{Ez=\ Vâà[ò‡2;Ñ{z”.÷¦5‘#PÓK¯ô%ïù¯yÏmn]Ø8µ<ë¸Ü˜‹Fjkêj25 ?):7šŒTFDÚýØ?>èG­Ù9šŒ›%4kö£¶ê9~tQ¢]ÂSÜÓüx~l¡/XhôÁå¾ñhvÍ, ·ÎÊÖ+¤E¢ól“_ºÐæU\(¡©®ñ+›s³5¥ä›9äDié™úN/ý÷¨¦MÑ%EѬh¥#N§öYKs6çæbÔ%g4VçÃáRÅ¿J£ÛùïÕŠëÓÆ©wáóŸ…¨Ÿìðß>‚ãlûâã{nìz9abxŽ1'®n8öè”éU!9íïþÅ„Îõ—=x楛[õ–¬°4“ÈaǬ•S2m³—O­ËJ7®üéÁ§ê2÷ÿ_Pñ£Ž[Ž)¯uyu?£»ï°=š³[$e8­±û¢žw,¬­w»#“µ+B5¡ð÷ȶ›w-œÜ»y÷âÉg¯¯[I—OÜ:#ãt²`ô‘ÀéÏÕ“%ÛhP¨âŠ:‹N5„:w9=v«Ó2n:ÒCuÂMGåÔÏm¢BêŽRk¢Q9“Uc™5È|Y}†\í¦Ï¨*üû ­…ÂWê°Uõ9ƒÂŠY5Êêóª1Äa“t`j­°G`ÃC0¼æ¬:–•­G1K Š¥#Y©Áê~ñe)"TVñØ«µâ±D±æ8„ˆÇ¾.ÊX©JfÕÞËÀCé#-1j~uªÉÕ©fYWíR«Jã_î†qXV«eµZV«eèÍ)m ð÷ƒôÎ>KÏUW7Œ+YmÕh—Êǩӽ(ŽQ½Ât¬<Õ Tfu ]à7›#æh_Ã@;Ø0Üp¢I𸭡«¡›V) XÒ¸+‚–!ƬXʪ+‚±YeºŠ 8+,W£CŒII†³±ä¤L0;K±z¤öÜ*‹EÔyÜåÚÔa³®[·[÷–ŽÕQŠT#¹<ªn«îªî®fûªªÉ`5¦KLJ«OT³Õ]ãÛª~pBÐÆT”æç>9mn²är¥_c(g»×Ïiøˆ/êç<~,h¼B€šçÒh™: IË«KK“"¶„بÎåÄÕQ·ý9ð¢( Òg­W=†úq(ê1ŠóeÌG‡µ£*àÌGût¼ú)‰’#1–þfb¬d«_ä ¥_[ÚéSŽ˜s¡±ò"†ÿiïÒ è ˜ï·<`½?´;w@§ËyrÞ¥âRËÒÐ:q½e}è¢ý<8"}ÚëM¯2¯š?#Ÿ™G-µjš-ÍîæPƒÔœ›fîÕ]eÖ¤H¥(E¤h*×€DÁ!Îljíâ…æOÄ/En¦eFèeí˺ÿÕq.­S B¡©d²™×[Ì6£×0M!~3ŸÇuˆí–vï1ÁÐ<– ?UïV¥‹Œ.–]gÀ†kA;t¼'f0À«KŽ:0('éÜ#=¦Ž³ŠåPø·ŠåÉd®áßFum¨OsŒÐù‰?09Ê|ÑŒ‰Åj³‰ž7èI‚»+ÓmPG½•X¸>–š” ÖOA)¤ä)—Bv )þa;Æ„~v²a6FÌ:QtëÆ!äÂ_(³Ý†7õz²ïñ¸uú´¡Ï@Nð Èt†é܎˵ÛÝÞPçÀ½ùZûð6Žëà™Ý°X»¸,n€ H¢P"u‘ië"eÓ¤.ߎ¨Ë§d2MlYMb±±_©©¤õDÙ2eÅ1“ª9š(Vÿ:®ã/±ÝVMìÆŠ×q[¤úf ¨Öýþþß÷ƒ|ófgfgöxóæ½7ofQ$›E)S¡n•š¾ ËŒg˜Ìð‚â¾íhð‰ÏÑνc'ñb sµ´“x¥+ÚàŽö‹«kÉF$ínrËD1‘ÚÉZ[™º©Qÿt³º+IQ®Žt‰­î'y'u:²»ÃÎ;ÈÔÏNFQ˜ÌŸÏþãÁ¬YˆD°ÃæÊãkgO,q$b1¸‚—³‹'–y-a•×\ƒ–¼Æÿ¬&e¹@È R–ݨźª•Žr L¹6a»:+þoTÏ0Ö)#·è¤øÔ…·^ óäš—=ðdý:²‹0ØæfÈuDüHåæŒxªdr’Øñæéq••ìtÒˆL#¤«ÚïTËHÈE©¢Qe_4¢Š>F£Ëy‰ø_¢sG„«¼8îšvs±.j2[ÚLp¹­¸°»&M[[ú\¸ìês »F\ã®CPPgLúu+C8é×ÆÃµ)s¸$V@8b2V«Q]_ ›Ç¸Ïˆ‡#Æqã!ã9£Æ8éœ'¼¨B|©ý¢¸Š3µ¢QiåR ¥Fwº›—Í–J9 {lÑÜ÷iÇú>*°åG—©24G´ìa´ý‡ê8â :çµÄº,ôÕZÖõ4Ö8~#y¡äõ‘”²HÞqcŠ–J5µ.­•ZZ+ERÊARjiDzZ®ƒJ%”Ž;i­§v^Om„é©U‘OÊnR¶G Õô¤èé)zzª•ú[‘„Vº¬®•øIQßÅÖ:Rq+U…IÑV†æÓUa­Z‡…Öa!Î-jJcuô{jJ=#ºðfÙ@Š*L5ÿ<Ð(™7uº³¹®åD¨R–­]W&e²ëpïºíëF×±ëÖk—5ÉÑ´Aמ֨>Y2¦ ‚p53M~µ!mNêº$Z%ubU9)¥(þ>ÕæL×åv¨j7è4ºµëÖëä¦eJñ…N¤*)ª §hZªµƒuУŽ¸{QZío%Æ’ܪZhäCšÛÚÚßCFy’ØSëAùÍíéè¯vË\(Á•S€[@ôžO•J„-õVLÝkû_AK/¼‹º²Þ}Á#»ePáÕ߀·\׬;=ð“ :wÊ„Ç@µV’~yŠ9ÿ|¨5éo‚HÙêIú—­ Y’~h×χSIãkz>Ü‘ô/…HyQx]|UÇZÿºN>Ùºª\L&x¤‹.[¿¼˜hÚ(tZN£[¶´©Qv  J–H°QÁ#J…l‡ e±5™IE4¶â‘ÖJ+ÓJÒœ«6tDzz«úV1c«ÆW1h•´ŠYýú˜ÝÙ¼j¸`ŠÙ£Ö¨<…·ÞMÅÒ9ï–ˆv~FEí«‰|JUÁ¯DÿWÑ!¬¶ šÓÛkš{(bMÑp,b Öa³2Gçkî ¸§05­ÃˆA÷ÏPß«£ µ­ët®‹|d.Y7O¯¿DŠÍã¾­Ö†ëòë÷:®½¯{ÅŽ Ó$´\6Ûn[t œ7¾¾pcÃ8Ú–Î6õ š`º·¥°¦ÁÝÔ=»°”óPY7.b{Šy««ß:t[w÷º¶½³·¬Wœ æ»¤°¥ÿéH¦\XnHÍvSÝÆ¥+ ­©ìK·Î:6¶x#ïÂuøêÓeb#Bì/Ë3s¼¬@yY#•‰›Ôå¼è ¦!Ga_$ÉS¦T]J9ï¤f¶ª÷3õpÖ”³æÐé$–è)îD>z²Vä£Uø’ÔÊ–¤Âs²&$'U1F>®úwÈITÇD +Ñ7Qý¬)g"ÛºH!ÕîVÖGÄHNçI«cÙ,5²IÔo¬x©x<ƒH„…Hª±í"ã¸:ë¤Vzjo¢qzMjýb„§ã'OyOù癩NšääI’ÓYhF>ZÒG|4ÓGo”újÔF’°R"™,4ÿon Ÿ¶Êõ¾@8@c¡¯0\)Œ4 .ÓøU ÚJát©ð0$LXïLúEÕ—Lú#+C|Òo^ö%ýaÕׯïhô7uÖ¡p.Oï8‹¢Yp9#ºqWx,ò#üÿ*ÏñÄçMæ}‘ú@²/9LVé%Ç“•$‹’R’¡KïôÐå“Ãͪ.õ¿7ÂYe7«å¢nÖU‡5ZYã©udê@M}¨ñNjƒû-pÐ'ç'^ò¸û_í¾Iqš M‹gÚÊyëXuë-3éŠö¥Mb ÖÏ~¯{}ûÞÙÛ7ÜÔö&öâ[÷íø“Yß Ó}mÙV¼öñåÒÓ`ÛgØãÐÏDäcŒÕžV‚ êèH:U¯“ˆk´ÑѾC2I¤l#‰-ƹ¢¼AŠ"ulTÝÙTÛÃE' =É'å<äd/¡)g§g7JT†“¨ÇQI€D9Îo4ªÎt0"Ä£ªMÇvYÇøIç1çßâéOú~®×Z-àåú.çÇÝøËúâϽº@9WਓÄDßñ#Sà|íj¬yé)Ðz9|š„}Ü07ÂsN˽O6Š*• æÌù/ab MuWkº+}—oâÂ:ÄÄõSu÷Ô‡Ûˆs/UgÈÖ1U¿^‰%Ö5g‰eÍ‘€Ôm™²‰6ÇŒ±ÆhA—SpÖA^ߢà&CFù/Û2ÑùD A6šwÌm}Ké0^aòÎys•a’åFUQ‡ÁžØ²ƒ½zÕŽ{Gž^ْȹŠÝ³Š»5nsHa¿ÅÍzóÍk¶.ºüªrc6Âw¾~û¦›¾øÚÙGGbÃì{WçýÑ(vš¶²›eóèìÓÛÃmý«¯9þv¬–­Ô_sv%‡€–}(…_«Ò²'FYeÌá$ÈÊ´¿ªM›‰VB}4«kG©b&¦`*ÇÕÍÔ Fó’ª<—%O+ú­á¨¬MX :³J7@2¥ùêó4¥X•h¦½õ„…zë zë zD½Äâ*t+r¼¯)7Œ5üUâP×èi –ê¤z¥²§ì­_žêû<þ¾àÆú¡Ôvi³gsp{ý^i‡gÔ¿#8šºÛó•Ô×ůy¾îÿZð¡úÇRO9ŸðW×»™€À^ÚJàj^“õ”Kj.KœŠ§q9€«êü|í7P“l5™4@øõ•På<@…ØÕziA,±²ÓMLº2Šá™{ãÛã£q6žÐÉFØÕ)¢åž÷¿É¥d¾Kºtâ7Lª‹Á¹Ûõ£zFÈZ¸RÊ*-T‹%×ø e•b K"Ôó*¨OγsJ'©çÕàœé-oNÌ19±Ì”Å?átåzí †NGKÍK¼¦y¹æ¦T/1ûõ캽uys$¼Áau44ÚL‹ͦ–†Ü‚Æöâv°‡úÓ%éxK—=yõ슞8ˆo'Õ©¶º¬Ž*Km½p†ùÐK×\¥—xžÒK¾Lä3ÓYSLgM±èõðq#IÅÉPš#ùb“Ž‹AΚÒàÛ5ø& ÖD³ãzûV?ÞâÇþ¨âÁÞã±Péäà HAYÀ€‰›6!üN½vJzMKç¨#ãwÒ›~Xÿ°ð¨røþˆÁš2%Ò+Ó½ù¡ümÉÛÒ÷˜Ÿ οËþªÎ˜ä›üèeÆ8K7¬LM¢—3SØS¶ÔË~÷Ë^¿'àÁ’G'G2Ý/;IfÈj„MNŒS¤ñã L¶¾ !òP=w¹Ý2YÎawfɃe~bÅØJœ’> >g¬½l!»ªˆã"+Ná–²;îqg<æÓq<‰ÅY%Þgâ/aå°r¤»Ö9ÈšrªÍØ A<8PÌ‚d9yC”~å#º­,QœÎÌ[lr©šZÄd°›L†ÚÒóuíùàÎKVŸC´ºQvFÑ›šQJÝ(».‘ (’E« X‚uX›äëÙ éš:\cíDû"ë˜?Õ},}lù4Á àtyÙ='˜ vÂðˆiÜ1î÷Ž×=z0<Ñ`9E¼šˆ·VÙ g#_J?y4­ b³%¡¸‹ú„»ˆËB‘𪮹:£/3”¦ /%¿µdVHB䤷H‘»QœÃ*2’ QlÅ´lS벪u‰Vh MX‹iÅJÎ9WE(&YÉí˜HçÊV´c‚2²…Â]²wé«køÈ‚ú¹Íw]s'“-ùÚªH|þbzf<»õª¥ë•ÀÐWüòžµ7.S0X÷Øæ® ›fßjhxôΖUy‹d5²‡gxÿ +$’™e[¾¹ïa¿àÁ˾|ßåÅ®«ÇÛŠv<äÍ2ð0û…ß1íÜw‘ÏÔ|‰}e+ð0J7© Æè°aFmt ³Õü¦lµùuyêÂiŸvŽ8#¬…‘læô©ìÙ“Õ1ì—µ5yù“Û¥zÒÐ1/î%sŸT ªEÜD¢£S#l½Øq½¯°cÚ\HÚ6x±†ªjNÑÐQPcS HZz¥tü³Õæùl6_Ý‹ª»­þº_¨ökªNŸµ!9ÝÑ8†V×'ÒOaâÊý‚ 8M%`^ï¾X1½w@Nˆ‹²`+ò *U/¬®4"»€QÂf£æºõ¨t ÆdñGÜ‚×Å“ŽŸ½îâ ¡fœj¶‡ëfO$g;KŽ} S³ZÆ´ÀgÖ‹†h”³ø—žÿ-«iÉJz^Õ/œÑ<ý%Ížªö—XÐo13ibê3#}Læ¹D4 µ„ÐK¥lÖU”fNÃoz^¯9Žb0‚vR_É:ªVÐP¦Æ^ 嘞C ZùíiœF{¢8jØ“À ƒZ{:Ý fªÖiÒVi°DCicªc}®Þ#Vº5H]©àŒƒ’i‰Æ•ÌPæzýHæ½è{‰?Dÿ0’“¶-÷Co 9˜É$·¶øÜî€7,e8!æ‹¥cÅØ:ד®'å'c¼!Úi÷¢¼J·‚_Y_•X•¼W7&Y¾½7qor,óˆô)=!O¼’ùaô‡‰ŸGž8 §Ó:8—>ª‹ëÚdÁµDZbéÓ\¡[/_‘<`8(Ý+pß½76–qí×ßãÚcMú|«t«…ƒ^ï3°ú…ä²ø%%ô+(™ö#Q0ûÅ€ÛïÕþž£Ä‰pê¾rYŽF^Çëu‘džL&€¢ñF^oçy=H(nGDˆÚ!ŽDe·]–ÝÉXØ ;ô@Þà ü>t#?~ÿh‹r$!3È'0J(ñ bH"Fi(ÝT>o@QÄã'Êb¢ ‰$ Êyq›zÕ‘ç§Ñ¶d˜¬¡q”½Ù>7>äÆ/»_u¿ |ï«‘,tpżôêÚ‘è ,¡r@7–…ìP —ccd?`üþóú}ñ,ÿttD*AA <–8Gö‡†ÑNMÒQ³j_‘¢¥¤’,'+Ééäé¤.9Ü0'9%3ËnÏÙ™3 øì¨önHò@dËg< N¨}‚À£úH1«¶Q‰?«êZä«7”¯)¾Æøù)©ÿù[óCÄ·óíê& tÓ§Ô×–,¤!F6%Ê Y¾d#œÂGöCv‚ÎMºŠQ‚ô舣ˆç¯R$>S”u•q•qÔXIõ‡Y•“˜ð Ä'ÿ¶YŽ;ÛñóËývþôwíñ"nHÎþ4ù¯³¿Î¾é[Ð…ó×Ò3¿ÃÏíow™Ùh”uIa»cæCüi‹b#ß%4]þ7ÌŠ™YfEÞ¤Ê^„Ø_YÀ~X•1AnŽq *˧y¾Á&1 ˆ»#jð[TV“Í>3Mun §û­]>h:h>hÙÛßüºáu×›ñ7óz1¢†ˆq§°Ç𫜮®-#nlá2%MI*YÄJ‰bscÛ C¯ÔkYê_ëIt7—ÛÖ»×GûÚöèF £Ò¨eÔ9êúsÝ„4ayR>ó›5¢$ZÄt@ Xé¤teÛ©m~cK_[Í/1×}û¼€ÜÈ-YœÍÄšeCrþŒÏWÌdÚŠ5––Í–Jôã"„§M«!¹§oÆ wºœÎxssA0yAt:w¬¹Ðœ/D­Y ¶@4u}ûÜ}~ìÏF·‡GÃLø`‡ÝÑL¦˜oø0™Œçûàiï+à‚F£‹ºuºH!j/¢Fg<Þ˜7Úóy#¼{YotåãQ·aA6& ¬±YWëp]ÞD6C^ â ™3\nhðû}‚Ä̶;±3Âæ£Š» g5J…²»â~Ç}ÎÍ‘2"»O0-(tøÚÉB&á(Êãü 滨ˆÚ˜UGƒ§è²°Aò¥‰™Ô`jÇÙj¬¸d ¿DeÎA"LQõ¦º¡ùäíj$‚ekq_V~_:3Hžñú ­ÅÁì ¤HôPÚû>Ät¼Ônnßo–Ú÷\ôãt…=\m<.úÄf—Ëã&ƒ÷ €ßΑiÓáö•ô½ú!=«ßÇ“…¾Ôë"Yà0¡0ÊÁ¡4ΦKi&íÎ7‹¸÷±Á«Î î83óÑ Ù7`¦ê6¶jæLJe(s;ròóFïê+åÿûwæúŸr*‘kç-n úl+ŽÑ׈Ÿq44ß>eÑñ¡®&d½{öK-‡/_ØÓÚ,&ÿ²HÇì‹bÐ-¹ò@Åq_¼k6‡?I&¬zƒ Dv9h.ÿÜÝ÷v¦ëóNqÑÀs4 %cm¯{ö& _þV9kå9™›à&LæoqSœnÂ…M®=¦¦–>Ô/ö9X/ç2ÛÄ«¹+Ä·¹Ó¢®J— ̺œ¬È˜5Æn ¾Sƒû4ÃFÓhÔvŠx·ˆ‡Äí"#62*Í£¤ÁÅ/dAÅEKR‡ÃO \‘rN£y^ð8³(FXÎβk`8Í.i…ëÓ`M£É¨•†D,6bFO0‹qÌ¢ršÅ™ òùò>n4•M#&ÖäɺJ®^ë2f Ä`Æít}CFV´cÕGä“d_çÏHðG¾Ó¾³µk¬®nÿ¾“rõ‹,UDÙ?Ú™eò~ó…Óe=pz¶êÌb‚ˆX&G'ñ]ÿÅ1g‘KØIôcö"7b%ÑñcÖ"';HôÝcˆŠ4zD¼”qÒ}ÛÙ`C„n­AÒ¯¿°WοÁ Ͼ¶©ÝæåZÍ<‚W_ßí’ Ø=ûë[ïçVÎFÏ¿N+×’w¯ÞxªçÎËoÛÝH[húø§·×0YQ¥ýPsõ´¼*!]p¶ mЧ»g¯Úærj¿vm×1dIÖÓh-@⟼ðŸq­8X lèèØ p9SDͤYVsÿ‚ê¹](ñåPWŽ“: i~pá_Iä…Æ }8táö+hàO/…:;÷À¹½¿ Àm´3Å [ nøeZ nè‚óþHÎò&Ö‡¶B¾ŽRê7ö’²Pg’Ü3üÝ…¦±„á޹…½š[ͽ¡yL{•ö Ý?óOð¿rÂ9ÃÓÆL7™o0ŸY^³n¶ Ûßrü©ó>ç³òÓîŸxÎ×]ã_x(x&¼7òFô“DcÒŸúbÂÌ粯519OóÞÂS-Ÿ,øjÛÉˬ‹v–TÿLÒú‡Û‘†~Ù.‹Ö#¤ù;цX²o”°Vß‘Éð˜×¬_Ò³<µöú›·íZ½íÖ+¶ß¼és}kV­¥ûÑß… ÚŠ>ë×N¿³i@F$B;dCvä@Nä‚zÝÈ’zò¡¨eq”€çRÒp5¨ å@¦kA­hZŒ:QZŠ–¡åhZ‰ºQZ…V£^Ô‡.GW 5h-Zw°õ£´]‰®Bƒ½„Ö^˜fÿéhWW®<8•¡x2‘Ì'“žºÜËì?1ÏBÓHx{Òé¥9oM.^\´,P#Gërowì[è†}‹}.—žu4‘Éë0AfïB"Œ;tˆý%ª0¨Ì¾y4ËM¼ÂþòÿŽý<'rÚ&M–TøöExÖöûB5ç…£fKuì2ÁhÂÓïœàÐvöI4 pà0‡DY€^’Â>Ã>×ù8œ/B˜Øp€CkÙ§!ýF²O±7 œûeÂΉ½Ÿâ¿ìüMH÷þƒ& Ã‡:îf7Æ¡00ÀÁ3‚t…½`ÞÆ<Š«!AˆàH8 ñwkàH„r"”!U„TR„$§``¤š«Ë©CÊŸ#9qÈ5Cªží;ž#1€•pd‚#™ Ôiæ<\¡¡ÐÀÒ´w€j ¬å5Vó‡´4ÿ-SË+“s™óåMñé$®/„àñ$.·—:råV«u(<J =ÎmonOlœë ÷F{½s¥p)ZJ”ç²ál4›È>ÎÂh xœ;Øs¸ç•žW{¸¡ží=£=l+Q'S9ŠCQ‚_˜t{r­bÇBæ0Ü΄o°(a °€cC`žƒÔç õ9Ô 0 3ž#ìÂ@5¤OÐ<#ùÌ%ù,Üø³“mùÞŽ•Àr‡&X¨ûYÈ––Vc‡izÂwhzoµü!š€°v n#es¡ûmD%€!€ z•Ý€Þ€š! ŒàØð·ÝÀ<Ï2ϲ鲩É@N'ŒWV /uHŒhÀ„Ÿ¢áC4<@à #eóJÓÇ+MßYiºg¥)&: ãˆÓó¦ÞS²Ãµ¹PÄ µ$Ä¿¡áj¦Ëö éAÓ¿M¿ šþ"hÚ4]$çÕAß51vHˆ¿FÕ4Œ• Ó÷¦ SkÀÔaÂah-¦¡Ÿ†^âŸ;E¤??„ÁÔÄàÉöd`ŠAá “í€f'Û—š™l Ð'“í÷¾ÿˆé†?žŒœ t8ðGxGŽÿ½Š‡W gŸ|-à'P;Žþ«ÉöÏ“ò ç?ÇßD!ž”ÿê£çMà4ý/ªç}}2½Z}t2};´úJÓVœLŸÔû'Ó}u2} ƒ“Qr7L¶×:,d+i†”Ý‚¢ ¹’žj‹Ë¡æ›/SOîšL“³:ISxÉd¸ Pœ\å·qõÑæ“az“>¦UÔ¡0½h/ŠRlÆ"½xHŽó“áÏC-Úç£gÿÑ~‚Ü8ú=' üË·áþÖÃá?ã“Ïþþ8y\“WÓS8z,ðÓð‰ÀßF¦ðúÉÀtzЇŒWÒS ~!prÊ2øXàpúÚÀsašûxráUO´7 o <…ãÉÀçÓß&—n†;^ÙéEžögK£S²Ëíä›ÉB -¼3P„äSxÅÑgM‘)r)PÇ3ÇõÐb,L/e]ëKLéðžrZ·[·Y·^w¹n¡.¯kÐ):Ÿ®Ng筼ěy#/ð<¯å9žáo§ß‰'2£]+¤åHÈѸÄÐi|Uèd@©‡¾S±±ÝL÷šÅ¸bíFÝkWZSÝSº WT¤º+|ß•ýG0¾oŽ*̽S­í%Iw{+VòÁŒ³wÅKðÞ»¿20€»+Ó[P÷f¥òñ¸áòMx±Œœ·”ä’u‘¥¸´ó3‚áj8OQ’/±*ɾÊ׺×ôWžö Tr$rÁ7Ð]Y¶F•ÙÁlïê<ÎŒ4ÐßÁì躂¤ã;:抡3Å@cQ‹E!R …ðQZ¬‡2 uu …ÔBßÃ+H! ŸïÑBתuE  ¨« (ÆøQ„Öaü¤ЃZ™8¿2#Â"­L4"ZY)t$…"é()r¤5 ŽD[iö3³ÃQõrP”¶Å´Œ/–I¨e€ ªeʤþþ¶-þ(ŒnúÅÖ-]ÛÂ]Ãá®mÕ/Ýr\Û¬(G¶þ‚d(66¼yËuoÚVùEx[gek¸S9²iËgdo!Ù›ÂGЖ®µýG¶”·uNn*oê oê8úÄè’îKÚ:0×Ö’ÑϨl”T¶„´õD÷gdw“ì'H[ݤ­nÒÖå'h[ÝW,ÆÝ}ýGx´˜¸¯Q|”1І½ÁÅNidí ƒò]Þ—8Ö!5P1†WL$«¡£¡ƒdAï$YfH«Yò] ƒÞ—ðSÕ, ’-áÅ(…ä®ë;çþwíÚµ›Àž=)wï‘iÚnè´Á5Ý•¥—o쯴WÚ»*åáÎjØSý-é/K¯´¿ÚÎlom?Ø>Ñ~¸]³gÏ$[_ ½b†BÛC£¡ƒ¡‰Ðá–d\Õ¬Ü>ú Äîj»á×ÕIÛÜþÉáî=»ÈA»ÔæR{RKú;Bh H»$ódäÖhÐß@øÿðïú„÷ü%ÀQ’Â6° ]òõ¤Åa:2›;ÚXÈ-˜¼é¯Ù¨â®Õ*nïÈÉ€'Ky¡CÁ£— ü;€7þ à ›cs´ò=Õ¹³]hW ÃåûõnìJí¦»€bò¸wïJ¥Ð.Õºá ÐõæÿÅ"ŽwíAð(à…‚B4u9mÁ þ'Å%‹É endstream endobj 236 0 obj 29344 endobj 237 0 obj << /Type /FontDescriptor /Ascent 891 /CapHeight 0 /Descent -216 /Flags 32 /FontBBox [ -569 -307 2029 1007 ] /FontName /XSVCLH+TimesNewRomanPSMT /ItalicAngle 0 /StemV 0 /Leading 42 /MaxWidth 2000 /FontFile2 235 0 R >> endobj 238 0 obj [ 250 778 778 778 778 778 778 778 333 333 778 778 250 333 250 778 500 500 500 500 500 500 500 500 500 500 278 778 778 778 778 778 778 722 778 667 722 611 556 722 778 333 778 778 611 889 722 722 556 778 778 556 611 722 778 778 778 778 778 778 778 778 778 500 778 444 500 444 500 444 333 500 500 278 278 500 278 778 500 500 500 500 333 389 278 500 500 722 500 500 444 ] endobj 9 0 obj << /Type /Font /Subtype /TrueType /BaseFont /XSVCLH+TimesNewRomanPSMT /FontDescriptor 237 0 R /Widths 238 0 R /FirstChar 32 /LastChar 122 /Encoding /MacRomanEncoding >> endobj 239 0 obj << /Length 240 0 R /Length1 5520 /Filter /FlateDecode >> stream xÚÍW}XSWšßss“$!Dð&„&„(*Û€ QëGµ„¢‚ˆ¢ˆ€2(®Zµõ ZÔqZ]§£<ŽíÚe­áÊhÛ©íØuÛÚm­3µ;n}F;ÕNmg\ûiåî{o¨û¸ì{ßœó;ï9ï9ï×¹çž@ ¬¼uMµ- …Ôs†Š¹®½ÍúÊÏþñj_àS¶,jÚð_{ÔÔÅN-ZÚ±ðÚ•åÚSÄg5Ô×.øìxñxÝ$0¦:bö©žˆN'>½¡©mU @)ñ4´K›ëj1ò‰ŸF¼º©vU‹6Ÿ!¾’xë²Ú¦úâíÏÍ!~ñö–æmÒGÐEü Äg´,¯o¼aþ+ñ¤?êmêCý‘=RSX)÷ð BE b掀@:Oå²\«¤Û|Øß•.p£iw¤Ð“Kài PlÎ/‚%è§þS6™ ó°üX zZµþ†ÃB8 _AÓAxIÚ y´^ Ì‚Ó`ƒÅÒ  :¡ÑØtè–>.‘¶Ñ¤­6ÃvAíÃ0q©t(eÐ çñaéœÒ4Qå"+ƃ&ÁZ¹ æÁZñüÎb‡´Y:MjHß(( »^‚cäÁ-Ìî„ÛK#%DÂ1K¤™ÒQémÒ“…´Vž!Ú{à ‡ë0ˆœŽ‡¥Fi¹t¤«6ÀVØ ¿‚ßÃ÷èB7ËeÍrÖÈK‘¼öl²æ²ç\@Æàl\†Øß² wLj‘ö£µrIc/¼oÂÛp®‘¤S°›ð4;ÌÅs»¸}|;ÿŠd—®’}a¬ mƒ#$ÿ1\„Ëð-|G>˜Ñ‚ŽÂ|,À ¬"z 0Žmb/±Ãì:§å~ޥм,ý§ô E%\ãZÑ~˜L>Ë\N´›bõ¼A¹z›"öGøѧð%ª0IÓpÒcÃt‰eDäW%.ÇDŸà5FN1Æú¹·SªM|>ß!¥IùÒX¢'8Š|E©&ÀÃJæª)š ÐHšŸ‚M°…âÚ û)‹ýðYðünÀM¸?"‡4“mtŽl‡]D»‰öS,ÿ‰vò1ÚG')ǧ‰Þ%:ÿAQý„²w…说Ǯ“ß‘:Šq„äŒZ”ŒâÃè#ïfUâBÚ-¸×uã^ÜO‘?ˆ‡hgõ“÷Òûx‰è/x•¼¾‰·Èïæ!š¬øü{’­'ÚÄž§r˜½Eô-7ŒËåfqOpÜî÷2÷.÷9åq¡ªSµOõ;ÕYx/çëø~ ÿKþ†?Ç_S§«k¶kvi®QVfSn áþ'žvX¼ ¬õÓ‰0Tô®Á6øiÉ«•O¹î èyè­ŸƒëÀÀF±_`6åè×|·›öÄstVŒ¥7ö"½[:¡sá<”â)6®B*dñÒu0KŸóm|%·R©˜ifüÐ9wÊçƒ%tŠÓØàkÒGܲl#Œòff8Òíi6«0"5e¸%Ùœ”8,!Þd4ÄÅêc¢uQZšWq !Ûo/­±†2jBª {y¹[æíµÔQ{OGMÈJ]¥÷Ë„¬5Š˜õ~I/I.ü’Þˆ¤÷Ž$¬EPäζúíÖÐ{>»5ŒUÓ+©ý¬Ï´†®+í)J{‡ÒÖSÛf£ V¿¹Ág aÕ*moèô×øh¹/¹­sgS Á ÑòÂ!˜X»¶ÁL KøC»ÏJ¶û”1Îá¯]š6½Òïn³ÝÙ!œXgŸ{I(Î54]žg%Ñ•¤Û½X¶ºbØt…½0¿FnÕVW†¸Ú`ˆÕÈ:Œ®P’ÝJZý©ù.ûSËÿÌ=ƒ!æ(­­ï,¥Ðt•GØ™«}†¸Š™VZ–m V†pS0b„b{Ä‹z»_î©Yb EÙKì Kj(æ0£R´x-~{­/‚i•b²7YaÜÙæuãm”w±»XÆñ6óº~öT¤ÿÓъܩK„3îÄeMö™²Ö)Jìdë8¹ªuãHŒž ’—‹CQk: Ѭï0Ø­_%Ê~ý‹û{j‡zÔÃ× 7åtÞÙ4>ÔV¾% Ž¥ï»|Â{Sxµ@[V¥8Ðñ*ã˜%J­’µQa–sÔ¶hšÙåšz³hÊí¢©†oЦnÁ#E·‹ä2zTžÑf̤â௾õ"ßðÞÓÜ…3è.a“.ó{鑇ÉÞhÂxÞ¢K‹µ›L¦øaÉ–4‹=idrN†3ÓS¨5ÎRª-µ<¦Uå^”Ü‘³5y‹skÎóÃ_Ö¾l9f:oMQe$³(®Ìävg»²³Ý:çð””2SÖÈ,KrùÁdLvšü.ΩՔ÷jPCœ'ÇãÑh£t®ìdË𔬘4ħ9øÜF;ËS»G:¹œh¯ÛSžS–“§3:mYé#½P2²¼Å¸ÞxÎÈËŒyéyùžýÃ)caûÏs{¡å‹ÇT8ÁrÑXh*4·{Ú '\´˜á‘¤"úÝN*2%jxC»kN»¡Hc(ú©1Áe6i EV¤™` †§Ðaë‹Ã“âóâó32s0³Àv·ça, N¥GƒvŽe ¼jÏVGí‰Þd6¤ºñ“ì®!f§Ê‰Wâà›ž÷£¾Ï<›‘îäŽärIö˜Ä¤Áfœ®i–Ëçæ2“%.Ó6¸·èLZ—E•›«q<ôãÖt{œW Íåv¨<7Šió⊾FÔ*üÉ[w2¬ì$„¨ŸäeTà|e…Á®ùæÎÈOS‚ƒ—oxto¤;mD£[…šî,jjˆ24WñâQ‘0 ­£#À´`ñÄI%®Ç7Õ¯p—4/] ÏWi•|ç}À#Wüf‡z‡† ³.±LH³N‚ø0ÛF` ³­Æ0ÛB`³Íqa¶‰ 6Ìž&ЇÙS1a¶‘ :Ì6èÂl=½,OhÃl&ÌÖ¨Ãl fÿ@  ³Õ\˜u°0[E€ˆó+> àû´:Ñ:wqG:n/ö°òÞ@µÍ'Oö³:â%¶€ê¯”úEâ}VOõ묖ê#J‘Ü®ÔÍl!ÕRûQ¶ˆVi-Që-ŽfùxZA§”ºW©5Þ„Vý™Výo[õ/µê×·êÇ·êÇ´ê‹ux–¾±zìSêz¥ÎðFÕ«o«·•E>£Ë¢')uŠR'y‚ú+AýAýþ ¾&¨ŸÔ§õʼnØIWj=>¥Ô•zµR7(õ ¥v*µÑkÌÒœ¥ß—¥ÿe–~~–~\–þÆÑ5P:ol¿þr¿>³_?¢_ß?\ÿ[ÚAq+ÆAÔ¾ƒ4:bø2!Œß‹Õf‚›¸!V§|%V;¾«3„âdü Tk)>ø)TãlÂ?CJæ/b#“ñOبðÀ‰ÂEç š~>EࢳŠàÑ™EðžèL#x7ÿ&:G¼%¬oˆ ‚“b ‡àu1à!8!æ„ÅÀ‚ã8*º—ˆ¢{ƒð*†ÀÍzIýz±:™zŸ«SÖŠÕcÖˆÕã„b7®„ÅÆ¶!V¿—°•Pö­º•ñfèVÆ—a£Â7ÊãK°Q‰ÅbúŸ&Ï[D>ËX':'‘š¹¢3› (FTŠB±gA@Yì1(΄€2išèî%±GE÷²Êý“E÷{BqV€åYp(Òå¢cIÊŠg(î!\d¹Œ#Á«d%œŠRY(ËÙ#yH»l¢³ŒÀ*:G¤F`ŽD>Q ȾÄËÑ} àVæG{HÿÕ‚ð}uºð]Ïá[*7äM w†ÑáMþæ¼"|éÌ®;G _8u§n»p¾û„l œ# ë0áœÓ(|0 ï9®§h¿ý¾zŸpÒ9_x6ÈoX…Þ8á°3_ø—@ŒÐX*¼ûâ…hÎÞÀ.á4ïYçR¡Óéßèµh“¬¤u–»S„w÷šÝB“‡š¢Ðè ㎠K»„GXKæÖu‡z£…'È–ª@¶0+ ó:A£v sÊçÔŠÈÁ¶% µ &›Y'hÙV*›©k_×Á ”‡»ì¾>8謲Þ'vy»”9G§˜¼ó>]Ûîèš|à‹›,뚺óÃ;åᩲ®²®²®©Þ©Š.ÿâ™%+îy~ÖÖi<8 +è]ÿo^Œzµ endstream endobj 240 0 obj 3786 endobj 241 0 obj << /Type /FontDescriptor /Ascent 750 /CapHeight 0 /Descent -250 /Flags 32 /FontBBox [ 16 -15 757 676 ] /FontName /PYACJB+Times-Bold /ItalicAngle 0 /StemV 0 /MaxWidth 1000 /FontFile2 239 0 R >> endobj 242 0 obj [ 722 ] endobj 66 0 obj << /Type /Font /Subtype /TrueType /BaseFont /PYACJB+Times-Bold /FontDescriptor 241 0 R /Widths 242 0 R /FirstChar 119 /LastChar 119 /Encoding /MacRomanEncoding >> endobj 243 0 obj << /Length 244 0 R /Length1 3532 /Filter /FlateDecode >> stream xÚÕ–TÕgÇßÏó|¿÷¢!^A‡Cï"’’ sê‡Î¦9Âe茉"rJäNÔét‰2ç ÙlFFæÖ"ç–»c†Î–ÁQS'n¦nö[¶üUJËÄ<îíó¼/îNýÛ9}ïy^Ïç×óû×…‹*äÌ+/¢'îK«¤;æ-[â_4½Úù" û–”'}"wŠ­vÁÂ¥5ÛÌF@Í.›_\r>.'p$_(Cì;êàúE\V¾dyï%²›g[]X1¯÷à¸èù¢Ç”/ÆôTO‰^(ºQqùü¶kEt— +*—„ßÀ³¢×‰>4¸x~°è•‘ÛEo–â±bS°ã±#ò Nò´ü¬­Ç0ëõŒÇ ´ H]F£Ú„•Ž âƒhÄ!IÙHÇÓ 18‰=8©gã¨h¥ÈÔ·K> IT½Ö:KÑ¢6£EÇéñê5lÕõj5¶a:©y …fÊ‘¥·£Èùº^ç*õKXª|¨D‘ž §õШs®#Û„Ùx!4˜r}Á[„âÝz]­æFçÓÜÔ¸µè+3|¶¬È@÷ Ô^ŸiP;nÍ{D_бžI(q/«vuÃ3“¢Ý¨V-žQ§:=YjŸg´'NJTË<î[¹nuk‘‘ãõ¸ŽÑ Ãý¾NùbI(çË…þÃ3éÃÿMõû¼þòC½Vø÷D"ù…N’;3äÞ2)1!'eÐÙÿæ<›>|J~¡òNÌë®vâœ<1N/Ñjbûļt»k5JÛR÷e9^$æôpàQ1®v0¢µ­5¾S­§Z3úú¤úJtVš¤ÎsáÍÞ¸W{ÒÀP¨¶:±:MêHȉÑQã@9¾S¤|çå pb;§š]jkÄ›H£œ×SîP¶™Œ%¹ipUŒmJ’†OÖ1 è'ô!Fb’Dê Gõ€W$±ÆKž y)ãYÁE‰ì…¾®œÛ1Ö'ð½ßÑÕ]ï”tÅw¦«£+S:•0’<ƒüèãCÀŸè2è.ô달‘ÙNêÍš §rãÍKNâ«?„/†ŸT«TÕÿ@ÆîŽóáf•sþ“F}tQ¸iQøî¢.µê@ÅÁpóyq‰Î Óª«£Þ}¤÷Ø;4û5¿usÅ­<Ò(³Jfr{Dï–që»êå~™Þq³-fͧž[ŸqŽ¡Ô)A¡ìй¢ß%wÚNF<GΠæ,æÈüÂ{‘¾hoâ»ëòÈ¡`´û˜0lúŠò¹ í^à~ÍÞwÿá3Ñ,7¢«”‹0ŒrHƒ'„š²"a‰&»ÈNò&ù yƒü'yì ¯‘ÿ ¯’'?&ÿF¶“WÈËä_ÙË¿P¾$/H‰ì‡KÔ¬lpòyòùgò#òOäYòCòdù{òwäoÉß§Éð¤ìCWòA¢ í„È~Mùx7­å=Êï’­äQ¾Cùy˜DNçJPÎ'$§‘_"§’SÈÉ‘?JOïgý“hÉ㉾ò2—ÌáhÆS¾—GŽ%Ç÷£¥´‘=gålòód9’Ì›AåäçÈtr8& ‡Qþ,™FEª´áJnµTîÐ!”SÈÁè-$¯…‘d³0@»_æÈÈÿ6?€–dÊw’I¹Ñ}py;ÛîϨDò6²_7}2;}ÑGZt%·¶yƒ¦ˆ–Àã»}ñ> endobj 246 0 obj [ 744 549 ] endobj 135 0 obj << /Type /Font /Subtype /TrueType /BaseFont /RBNCJB+Symbol /FontDescriptor 245 0 R /Widths 246 0 R /FirstChar 33 /LastChar 34 >> endobj 247 0 obj << /Length 248 0 R /Length1 3800 /Filter /FlateDecode >> stream xÚÕ–ytUÅÇ¿sçÞû’ð‘… !ä…H$11D$Á"J£ÒÈ8-!°E°""ŠJMS›*X¤¸TŸQÙjS8ÄU Šm¡ŠJ” -I)$ïõ7ß„öœžößžÓûÞ|æ·Ìú›¹3 @8ª¡Q0«lFºa¤XŽIê;kébß‚É5¶È_VTiÅܲ1^‘ÛŶiîüªÒE'¾<èb›6oÎŒÙ-W ²GÊãöyb[5®Oô[æ•-^ñ±zUô"ѽóËgÍPûqZô)¢‡•ÍX^ÒM="útÑ} f”Íù¤ßRKôjÑã+Ê+°Yô­¢ßZ±hNEÉóY;E—ñ†„‹MÁÌÇÌÈ…Œ 2/-6 —pC±ÎZ˜Š(QР¶`ƒJÃzñÅËhÀ!I¹HÃt½CÊ´£{ÐlMÃQÑJ‘iÝ,ùL‘Rõ–eÅa ¨Z°zX#ÔKxÚªW«°÷!Þ(%¯ X¿Ž2d[;Qb×Zë*­g±DyQ‰ëNkB¨…:» ¹ÎhLÛðc‡.³>÷” H]•Öçá Î"ÇÊÅLl²fÊHU³Ú¥N©O­IxGTíê¸3–¿R™o .9°ËŠÅBì=#´Ýåkbˆ¿I¥j‹sT=-óŸ(³¿„L<…ÇÅþ””ó#S×!MËÈqãä—¢ëÄ’íÔˆ|PV`’ÓŒûT=–¸I¬Ä§w©dë:§F¢^'½E¨snòìk [‚u8ïø­aÖ),CÕ&%_ÇGÎ&k‡Ä#©·jÔÌΘ`‚3 œMˆ’È$H>MV$Þ¹‚IjŸ•¯Þ¡^¸çˆõ¹îŽÆl為¤®ºén’jp®Ê¦©QÜ Sín¶jtóÜR£FâØ¸bíª Ö £Àã:¶¶R}^¿•t×lÁ7‹}‡ïMHKý7Õçõøü˜èï^åÛ N,¶c{ýN_¿N ñÛI‰gÿ›ólZêø‰Å¾=Ê3ª¨«ÙQÓ‹Ä8¹XD£‰Y죊ÒÌ®µP¨µKí²g=ˆ)µáªDz‘~ìô±LxO;y,#²gBϤ„ž ¥6Ú+ulû¹@­§ÇÕ¯¹)à ûÀi”݂₴HO÷ä¾Ý·÷ï¥ûà¹þ £œ>±1Ñ^$k;,ÎNòÆEÇ'%'¹ñ±I‘·zO^h’¿·©Eþ=óä‘‘—‰ôü–¶ü¦,ï%ÑÅš—‘”u{n¶ c¸Êl%ö·¢£zňšÝO U93 >DGÁm7ÎãIïh~fïå£o_Þ½­£9Ý3·ýë@›Z®«µ,ÐöÕž»æêÔÂøë{O)+üpßß}Íj^鸪TÕë½6•8Ùönà|jçW£+Õ2Ç/'•¯Àа&}0<,ºÛÕn¸÷dŸ 12dï•Ïdœ‘ÃUvV¯è(×£‡¥§Ä§„…6&:C‡ Iöy“#Såè 6öI'™1ÃâÂ8*ÄJ’%çH„䑈z"ebE ƒ­Bá‘IZ¬’GJÞ[ê¸"+8è-%»£Ÿ÷ƒ‹gò[ó½ïû­­Hïxÿ-I½g:Z;23TBn‚–é&úÐÓ+Ñ‹ñ HìoB˜•k¼¾!îÜxý|†óâ/ƒ/«•ª·êÝ”±»µ%°_´\k°Ž.ìZòd§K­l*+°¿EÜG:÷SmÆYÜ”ßj¦fžý{¯WÝȃ ZÙ9~QÝ®s”uœúŽz9_§^¸~:dõ?=7Û>ŽR7IN”k¨‘·t¦Øúã ìS·uõkãAI±Í‰3<_Èy«ºFÑÕ¦+±Âè¢)#ÇÝ9hrUÙÌòùæàxÉœûÿá±ÿ%­jå ­lRã!¡EY‘0D d;y¼F^%ÿF¶‘­äò¯ä×äWäeò/ä%ò"yüR†§ñgÊçå6-{ã<5#k|N¹…> endobj 250 0 obj [ 744 768 247 ] endobj 67 0 obj << /Type /Font /Subtype /TrueType /BaseFont /FDTCJB+Symbol /FontDescriptor 249 0 R /Widths 250 0 R /FirstChar 33 /LastChar 35 >> endobj 251 0 obj << /Length 252 0 R /Length1 4648 /Filter /FlateDecode >> stream xÚ­7{X×õçÜ™ÙY#»°ÂBÀÙuA»ˆ¢Dì"‚( Qˆ ² ŠFBÕD‚I4Š±ÚØ<š˜DÛ$M“4+ú-j›økšÆ|ñ×ÖÆ¦y؆Ä|MmÓFMe§g4±ŸôÎáÞsÏãž×½³s€hèÔÖŽ@$À"✠1¥µ§Ûõxqq ­ÿ À'-ëZÞ±éËdž;¾|õúeïôvïOý\{[`éÙââÏ"ûhO~;1¢Ûù Ñ!¢'µwt¯³ßÀd¢ß'Ú±º³5€Ýl!Ñ_QtÖuYg²}™h×m޶Ú]ßû@T²±¿«sm·¾6­Õu{[Wï›i›ˆ^ `9B<### L œ‘ÄapåáÌ™§ º UBÃÉ=qúÇ4ÎÑøs¸”ä$ ¿¬ÿŽ3¬ ƒ…‹ ! ’a#‚¹p ‡JxgC?̃èÀ›`þòÁOÂ+´c=t’n9|Ü´ë°þñòáÁEˆ€¸ ÈÊðCý8ì…Ïà‚¾Oÿ3äQÞ!8¥ÿ ‡à58MgõŒ ˆ6L ñüœ³³ ²ö+®“ëçöóÀïá?Š„ûÃφ‡õåúCú[ú?){"Õ>fÌ$ÅP  –R­W™÷ㇰ`ˆjw Þƒ`Â8òœ¥x nÀãq<_1ÆlL&Ÿì~öÁ1v‚â’¸.Ë嚸‡¹§¸çøÝÂRaðaÀò¹¸5Ü^î ß>ªWéè/êÇ(7EcœiÌ¡lk¡žNpl0kÝoÜ%Šç$8DQ£ô†Ÿ„?Âyºs—©fœT /`!QœeèÃ9X…ó±žÎg6`WâFìÅûpÁ¸ò$Â#øžÄw †ñ/_1‰ÌÉ–ÆTVE°ˆ ÀZY;[Á:Ø‚gÙ~6ÈBpE\9 иcÜ)î]î#î_|ßÍßÉÿœ?Á¿Çóÿà/ 6Á+Ü,,´8-–ËÓ–â*ñgâ{¤¿GàÛO+¬g³¯¡—ͦ÷ì—ôëô+VA'±àÓT©gèÞN#xŸ@%È%ˆ$¸‡jêä´ÔIÊD·Kž’|CR¢3!~¼#.Ön‹'EGEFXE‹Às !˯”7»´´fOS**² Z #ð-F³æ"Vùµ:š«ÙTs]«©’æ²ÿÐTG5Õ«šhsBav–˯¸´·}Š+„·Ô6Ðz‡OitiçÌuµ¹Þe®%Z»Ý´Áåw¶û\6»üZyO{¿¿ÙG憌ÓÈì,ºT‰(ðeíNB††_KR|~-Qñ™2.ÕXªÕÔ6ø}7¸ÝÙY–µ*-(¥ZLæØvcŸ‹TëÈwvÖ #~ؽTYº=¤BK³± |§Aãk6|Ø3µŧ%løÄù yeåà[B¥–ÚúË©4Û+FÉfƒ <@TÕ™e›4ÜÜ8„ûhmŠßà4¯tiJ©ÒÞ¿²™ju Á$5ɯ|Ô4ÕD“ÈÎröÎrSQ†²K²K <ËíìÅgïåÿúX”©wü ᪺«uAÓ2‡ÂÔ\­¦…biLm3¡¿u&©ÑÓˆ”å -¢¬¹ßv#íÒ„T›âê¿tPʹ¿\Ë Œq,©¶ `,ã¼z#H>¶¦ß(7}Å¡ïG¿eƒ ç–.T“çp)ðs8Ž%EXÄ9‰ÖˆÏÝåuÎÌÌyç «G çÙ.VÛF ¡¸p¤Ðvž¦\ožÝmŸLÃ-ô„.}-T}}0ÄýárªùÕm ïfB;ØÁ¯&GK<'Y£ãx>ZâìR\\BBÿ’µÂž¨î{GUœŸçoó} Åűh- oÚÞÌõÆÆåÏH°ˆ»-!6AL›ÌìM'û^ŠÛç_ŸS{&éÎç¸&÷µ¸ûÖÿ&¼/|ù§áӻݳ^Ä\f<ùÏlŠÇ•ª+‚aŒM´Ð#ÆXlvK\<Å䨈z)&q|¼SõÂјÎ\SBØÌàV`"…$NΟ‘o·Mf“gÄ'ÄÚÙìyUóï[4+î±Ù½7Öþ6éÉ­ÿ­á‹=½)î;6œÆV”!îv7à ¿H±½¯†¯Ò·/ ÒÔ8aJT”D±X§°Ähéu÷ºï•f,Šês¹^>mú´ü¼©ô#dQpBi™ÇSZâu¨Ôã)3ó¥Þ…Kš :ÕÄÇKsä;XôH‹õÌDî_-âÅqF ámÁ¸G{U»Í1Þ:^°ŠÑNòϸzFGK‰ Σ¸Üø Þ c÷.ÂX8…ÅTê ç.ã…ÌLªÉš[!~¼ÝŸ0Þ=½§Û§¥)-âôÔ<Ö‚u]#'ÖW:Ó“LÂÎh¡Qˆ¸4·z Ÿ<Á’ ÷¤wjŠ-ùŒõk0iÉ=_.‰)¼€h5écC—Ö_ÅîðnºÉíDF\Ñ7°Âf“~>ü¢xäªäÊ#o€›=M4ò©¼ŸÚ¾¾zéëwëÍ,!Cëèa`#˜LÝìg8D<4½ÄŽÙµÐ æ–Õ–U–fÖ¯èh[›]×Ù¸íJo©·A\ïhDQ?j‡ñN=ÆÔcñÉ |ªÕ /‘y¯9»ÌÙf΀—Ô(ƒµKÄ]ü¢d>ã‰ý7ÆÑ|Œ]®†:h´z•Yé ßO«ý´bð3†±º›B»›Ø ;i½“Ö}L l¥l;‰ÓIœNât‡‡%DÕ‡%¦ÅùD^ç›”—¨b¢¼&å!o¢<&%3k­êaü«±î`ŒüÚšqòQjª¡dÌ n™/¿‚Ï‚ $ÜiÎ÷¨ã\Ò‡.é=—´Ó%Ýí’^ÁíPC‚ÕæŒê¸étTV#×H7ÖHGpõ7rª#]z9] ¥K?I—îJ—zÒ¥ìtÚ=@-·„?1種Jé«Jé—•Ò£•ÒæJiC¥´¬RrWJ-ÉÒ¤dé†dzzÅ<³+"h9¸Kzpñ.ÈõÈ%!üò`žœ™•/‡p[°>‹Ð½Áúä’ñ¸ 2x¤Œú ƒø.ð™x=zM¼½¦ü»AOm[,z’К`Ñ0•cä˜Â•Á¼aâÎ Ö7É%˜7fs*ø¬Îí&ñ”`ÖÛr‰'C¦{ä™bòLõ‰cجO#uaÕ3BˆA9¼5Äð|ÉS'_Ì ñĹ²úcFˆ½”?ðRä?xšäßUÊÇÉÂëõÃò«žÕòá,sÃO}G ëðuƒ©Qò3žÝòÓžmòŠLñÞ<ÓÞÃõ&z(ƒ˜‡ämdfm}`‚òíy†‡(yY\™U%·û15FÎÉš!/ð‘k=·ËóG=Íñ™¨ÂsØLçKU*I‘K<)òMEo˳|”IP.0¶åi£Î§æ˜éåÍ•3)=þ<¥>WžH.QÍ–o^..ogˆÓE¯˜&¦ŠÄÑaµÚ¬ã¬ÑÖH«Õj±òVº·VGH?£f¯¸Ãb3…7fÞ\ÛŒýßH/#C+£«B}³†;â{ŠÅ±Eö‚rßu¦æ±9ózOŠöpÕ‚íù”Fmª±ÐS«´éFÃ2„gñ¿o?5P#Ñn<ë¯3ùn_c£³J›[ÓÂOý+B$XAý !ü”Ô÷B•¶Ð´Äò A½Èˇ Ã]Ù|SmÛ¨š‡¬šÏ@†Ú0xL56ÕÞ6Ô¶fø}¦Š[M•­BŽ¡BÜK[}©©¡×ŒÛ©™†RLCyy¤R”g¨ LÍ#…¼©¦Øó8kT\7*®3Å‹¿猊÷ŽŠ÷’8óô´•þwz?¾iÑA6+þ6ÍÚöj’ûZ\®Mµ–iÍ-­í´i+m>m“âs ,ÞsñC¼Xñ À}ÃÀµÍ\¬.6Ï[v¬ñ_ãkÛU_kv\ÇØÃØÃ×ÿuÄ~C¼Åðå7|ù _[Ô-¦/#7ÿŠ¥k¯ótßqGÓÚµMðoÄ ¦J endstream endobj 252 0 obj 3309 endobj 253 0 obj << /Type /FontDescriptor /Ascent 750 /CapHeight 0 /Descent -250 /Flags 32 /FontBBox [ 16 -179 699 676 ] /FontName /LCQCJB+Times-Roman /ItalicAngle 0 /StemV 0 /MaxWidth 1000 /FontFile2 251 0 R >> endobj 254 0 obj [ 333 333 722 722 722 722 250 722 722 500 ] endobj 92 0 obj << /Type /Font /Subtype /TrueType /BaseFont /LCQCJB+Times-Roman /FontDescriptor 253 0 R /Widths 254 0 R /FirstChar 40 /LastChar 49 /Encoding /MacRomanEncoding >> endobj 255 0 obj << /Length 256 0 R /Length1 3688 /Filter /FlateDecode >> stream xÚÕ–TÖWÇß÷Þï÷û "‚?@BÏ”9¦ˆäœ8Á©™.Gh†Lø9%ÂDÌ ©Ù#mK242·Ìœy¶gΜ³Íä¸ÒMÌMm®¢mæï"[Ë9O>>ô¹ož<§­NÿuN߇ûºŸÏçþúÜ_Ÿ €hÔÁ w^EiÒñ5±´Iš1oùÒÔÅÓ@¥ºoYÕŠ҄ªXÀŒ”òÆ…‹jÊî¾ðü%Ñ_•:ÛÊ”ο0)w0à–KùgÊÅýºúµè[ET^±tEÿ9êmÑ¥>ú/ªœWª–(éÏm=¦¢tEUTOµFôÑS—V,xï¶51€-zJUeõÒðGxEôtÑïªZ² ªø™;DŸ DÙ: v>vF&Û>±|üÓøoŸWp c°V¯Ã8ÌD+ŠUv« ¨ ¬“Ò1x»qXÒ(d Äl—:!œÄ>œÔ³qT´2dêDɧa†ÔjÑZ'cZÕF´ê=NíÂÝ¢j±EHqKÍ«(4{P,½ÅΗõjP­ŸÆ2Y«jëñzZ7fçF¹“0/#ˆí¦B_ôc‚º.½—ã÷8ƒl= sѨ犧ÔIµWVguŽ«C*¤Ž¹“ù+“¹&àŠÛн: c¯èIgœH¹]Ç ÿm*SÜ£j‹Ì?_f™ØŒ'žYê‘iš‘aÄs\Æù 1ÍbÉrD>„ÇQàžD‘jÁ2ï1Y+)3{Õnd™f·A¦Þ,£õVç½dŒvüz°WŒµ¸ìõX} A_“š{ð®Û¨·Ëzôv[tƒšÛµ&˜æ à6¢¯¬Œ_òÙ²#)îU¨ý:±f»Úùϵq_Óu´7 óÝuE]÷†yij·{]ŽEƒjõ²1V…¼,uÀíÅH‹YÇ+W×vb†çú<×1Z!=56¨Ó>7?˜û…ÂÔ#³üéSSc}©Aä{Ö¤îëìÌ/t’ÜYAw@ФE´gþSᙌô©ù…©û”oâ„H·K&ˆqz¡ˆV³Ø'NÈè:ËeáN™»Mά ¹Ýx*ÊÕ†µµ·e"öTÛ©¶á}âüqiþ8™ƒPµI oôÅ\ÿ`‰7¼9E€m£ÒrûtDa½§ŽêaíëÑÍŽmÏéåtdbX(GòáÊßÏ70ΟíËÒ5jC¸"^¤šzH 'aôð9ÝT?•m“~3T$»x6üN“ª­TµMvî…*Á‰ÑAÎ}@nOo½ƒõ:%—WEÅžÊi! êh·góçÄ„¦˜½6©„@Cà>Æ#^%º‰žõQßòQmò 2#6èï(ëcιõ1[þ”ã…Šôñ›™âå®p}“º] l ×s˜œqݯ>Ô+çC¥¢d¾t£æV^ÙE h·¢–änË͉o3Ã;o´GÕ"žyÎ1”ÙpæÌG‘¤I…6Óíò›&}+ND|ðð¨Äµ$Y7XäÊšÁwIb˜ŠxØ;Ò¿‡žÀÌü‚û¦Œ:½¦bnå¢[13¼Knò¿ûB.笗åuÝëj,ÁDiYÝ¥±¥µù_£Š»ÿ0KªPÉݯâîWÑ·J,Æb«äîWÒ7k1ø Û”“ Éä<ò!²˜œCÎ&”WÎÞõ©ÑÏY” É/‘3É/’3ÈéÜ©Êùää4òóäýäTrrç{âégÙÿ$Z&ðFßGy<™Gær6ã(ßKŽ%sÈ1ä=ähimäÌYy9’Ì"G™b3Nyy™A¦ËÿÄC)šBÞ‰Á2†+¹Õó„ÞA9„^ÂòjyO6 ý´§Ê‰ö¶þm´$S@&åuƒO‘‰»?k%ñd¿ceuú"NFt%·¶>òM­Gì)ëÍÛhe#m¤mÛ‹·+†–žd4ÙƒìNv#£H²…žDW¾QàÅwÈÈK—LÚžý/‘Ù—ˆµNzBÒVIAI%ù Ôý«UõÐÿɇ¡ÿw_ò?V&ÿ( endstream endobj 256 0 obj 2030 endobj 257 0 obj << /Type /FontDescriptor /Ascent 701 /CapHeight 0 /Descent -299 /Flags 32 /FontBBox [ 42 -177 550 706 ] /FontName /VPRCJB+Symbol /ItalicAngle 0 /StemV 0 /MaxWidth 1042 /FontFile2 255 0 R >> endobj 258 0 obj [ 250 600 600 600 600 600 600 600 600 600 600 549 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 549 549 549 ] endobj 83 0 obj << /Type /Font /Subtype /TrueType /BaseFont /VPRCJB+Symbol /FontDescriptor 257 0 R /Widths 258 0 R /FirstChar 32 /LastChar 62 /Encoding /MacRomanEncoding >> endobj 259 0 obj << /Length 260 0 R /Length1 7356 /Filter /FlateDecode >> stream xÚ­9 tו÷½™ÑH²%d[’mI#y$KX¶å/ÆÆù# v Æc&6æc ÄüKÄ&§ù–†¤ÙnÚ„à Jå%iÙÄB”$„-Ùü¶uÒ§Ÿ“¤Í‚¥½32„ì¦{¶çì<¿wßý¼÷î»÷¾;od »€`÷Ú®õ‚óH9‡uSwï&ç[ïn}€¸ÊëW®]ðÊ8Bµ € ¯¼}늯÷hó°º{–w-ûý檗’[püÔ$è_I¬F|?âîžµ›¶d”ÃâaÄ·¯ëîJUŽøÄMk»¶¬W‡èãˆÉü;ºÖ.ÿç=?} …Eܳ~ÝÆM°Žd!žxÁú Ë×_üófñN~!ÒÈû‘w¤‚„@ …o? üí‡ýNiUß)Ís›P`¤qó!‰Y i±w°~‚õOÑ…±(W9Ññÿ`l(ý£É\p‚—a ìÀþ=dÁ Ôî˜ í0†VÏCÝ{Qî+°B=¬!âÏáÞ^G9zëQ0#}ôâøL¨EÙŸÁ»P‹`+ƒ3p çΆf˜£t(ö&äÃcpüœebƒ8S.L…µ°ÄŽ@TàL»à^"‘±qèÀ²õzþ.ÆÞÄ}ñ Ut,Gɹ¸Ò1¢!$}h=¨O4áJ­8â8QÓúØ•E„j˜ m¨÷vØQ³W಄nb†bu±—b¿–ãÇg¢¥Ð·ÂØ„+< '`¾&­TsÇžŠÄNÇþ€²½bÇT ÛPÓ•pçàŽï`ƒI"™NªIé#‘Óä-br˜½Ì0+pbì¯`CËxq7Y¨u LG½ÃmÐ…+ßÿC¨ãøŠX‰›‘:òµÓ)t]GGéX†`ÇbWM(z‚GK£æ•p –ùh·ÍÐ ƒè»GP³gàœEÏ|ãð5\#ቚøHgŸ…úý†¼OõÔL%ZC?`üL%³Ž}ƒãBÑÑ?ÇÚbí±;c'q÷ïãZòÎe;-‚%¨ñ2Ü{/z{'úN.»±ìƒ'á'ð,FØQø®ü®ý:¼ ïáúŸÂg¨Ã8|…k0Z$K ±añ´Z%zµ‰Ì%½d'ÙEv“=äêxˆ''ɯВõ´vÐt}‘¾AߢïÒOègô/Œ†±3.´ñ¶ž]ÈáôÜmÜvnwT5uâ‹hItAtI´7z>ÆÇô±¬XolGì‰X½úGÅ’j0€$ôˆ½z ÌÁÒ„‘ÖK¡VÀôÍ´æ£hÏ⟅#è§Ÿc,ý w÷zý=øwö¸ ÅdÀ¢S1ž³Hî¨wÔBæ“6²˜,!·‘¤‡ÜI¶‘í¸Ç,ȸ˧ÈQrŒ¼B®/ÈWè^Ž&R#uÒlôL=¥ ã`-ÝN÷ÒïÓ‡éAú$ý ý) Óãô,Zãse=ãaJ°„˜[˜9Ls's€ù1óæ9æsg®1Ì[Ä–²·²ÛهؗÙw°ü‘3rn7Ÿ[Æ­áîàú¹‡¹!n˜{»ªšª óßÌßÃïãå‡à x~€'íæç%HÿëóCxžž§!ø>E ì¦Óðìä“硉]£˜}lô?é#äWYÐMŽ‚såÁŽÕÊ<Šçb¿Ã:ŽõJ´ó ò¢/Å.1œ}uì· }Ø'Þ„'â<|ÂjÈÌ·1E¿Ë0³à[#XŸÈÍÉögMñy3=n)Ãåv[zZªÕbNIN2ƒ^—˜ Õ¨yÇ2”@vHšÑé gv†ÙLiæÌ—ºÐu¡3ìDÒŒoË„Š˜óÛ’A”\ñß$ƒqÉà I"8Ë¡<'Û’œáóu’3BÎmÃþýuR»3<®ôg+}6SAtˆ¸\8²öÔ9äÓ ÏèíéuÖá|#CŸªÍɆ£¹b(Až9 µ];z¬d‰P8Mª …S¥:…ÇxB]ËÂMsÛBué.W{Nv˜ÔvKKà Մ þÉáÊÌa¾6¬ªÅ©«ä À€óXö©þý–vú—I˺·…™®vy £?l‘ê–mcÖoÐë½ÐþIæGÈ SÏŒ®åý3Ð43ãh§ŒuíG¬qžç¤}ímaÒ‡;eueÕã›X.…dJçjgX#ÕH=ý«;ÑæiýahÞêNK ŽÄðÅrö·´I®pUºÔÞUg;– ýÍ[_H :S¿ÍÉɱîœîB“äTçTËpºËº3¿;NóT‚"7ú!ÂÆæV#²"Ò,ÜEØÙíDÚ$ÜÊ4¹Y> ú»§¡>í°*¬©íìÊd›rArö èFiü³oSº&)*ð%È]ÙÙ7ù×ûa¿?œ•…>Gÿ,G7¡j• ¡8'»7œ.­œát44¡»ÚËhw—KvÙ@$K ïšÛǰ4}‚{˜vÊœS×9)óeήëœÃ;%ŒÆãÊ)%¬Î¼ñgÌI¡ž²01ÿ/ìå ¨|ÞUÞyä·^MPÃò!àT!J"4+˜Ä0 Uñ!©jÊ„8¶]!·ƒÕ/|Q>Q>ÛÙåPU.L ŠM~ždt½X“TS#W˸iÿùZ„yíÚ4PnszÌ*§q­*ømp·9ÉœL-:‹ÞfŸaZ¤^&mUß%õzöxN˜^Õ½jºì¾ì¹¢R’’‹M))-&w[**,68M·Gr{0½0z½MdìöD ~Æg¯œ¢–YSŠÝ’Ã4eJ±ÃQœT\XTl2;M,˱A'°lP[ œó å$à/÷ §öês­þÂ(Ïí¸8*\µá¢ÑTÀZŠ577÷9a)W£É"SxNð j”·òlîõ.ÉÍÏ#xÛ*™Š%©’ez‹])*^Å3…2ñ&‚|Ფ¸Š'©Œ—áõ$%ÙbF¢~fzVúÕݬVš×â®H[—Ý1§¯x&9mOõ—N$ݾ[æMœkI÷WNÙšÄМôYQÎ¥JvÜÆôO)O x¨ËÅ'»Ew„T¯ËMœËÅjLYÑ‚‰ïÏð1.I¥N̰ß×NZùèô9‰) %ɉ¬ ˆìô“ö[T0ÍÙ¨›a\¤k5®ÐmÕlÑhFtg5gt_ëô:“›Mäô öÄ ‡t=íÊÈ4%'+v¶U8êÝ:ô‹Ý­f=hs+²”e=ÚLϤá;ËCÕ¸AcèÙD¸T‘6nMaCЧ°œ“mêý‹*ö2£ÁÌ…SK,Œ+I1›^ZHóÜ•©W“qfØòíuo¼³È×{õÓI•ä˜ ¼“ºÖ;G¥çRí{l¹4Ÿ­]èææïÜÓrš†Û'Â.>ɵ˜-­?ΓéÑa®~IÇ5Ε浔ã­O¹ÁùbŸ0g¸íðxÐ]h ¬ lÉܸÏÝïÙ—ù¬ã™ÌGŸYœYŸÉRÜÚõ!IÁbŸFÒ6RÜþ‚d0¤úr¦¤ˆ&·o„þÚT¾ÀëLð•ÙÜ…>--¸Ý…Ú¢ÂfèÀ˜ —Æå°¯š @Cø'b©„/Çý×È—ˆäçAé ñ È%ÞâJRRI Ì)<ƒ†‘;ɼJÊðf–°Ê!“2Ù6…d¡ŠÓYyW‰³1ȯ±pzzaÕwÝÑwù­ß®lmåÉéƒÍ•O>°³`*{Ô,%êRyJ‰Sk‰U­ÖM$î*[þÀš¯/¿•›“^ÿñ¯Ì鈎ýåÇÞ€œçlh·£x¿ úàÉn·à¶ E6.ÉÖhé°lËØæ¾/ã>÷!ûA×ÁŒƒî#ö#®#GÜ'í']'3Nº_7Ÿ±œ±žµŸuÍ8ë>ãy;ëmÿGYù¿–œ‰Ølöœ®uæ¦ ‚Û€~ ’Ûšž*Y ÑB-F³dQ¯'=>^R7êˆAgõIn1'×fl9Dr猂ÐlÊ ¹éøªM8AnºQ`-:°ZThÅo‚BÊÏ3¼àC'9Ê.òËù¿Êh)ÝËåúõ誽jL¤r‡È¾Â?Ùw¦RciÜ7œÂ8žíŽ8ÎìÅì9ªÆÑr#¨¯w1ÂïÄdZ÷0?é^ s# è g³gÀ¢'R†å®Û«7çî_P}PyybW˜·™û HŒÁg8¯£Êçõ”•&O²ºâÞg½#Þ3ÞW§_ö¾Uziº­`+½¶©åÅõUí ­›{M¦$$LÕ”X‰¹‚ z¾zŸ=;T¸L ë´RB£¡°Àa'&U©ÛXjð½.ß,_£° @49ìŽ*£)M¨Gi‰ÙÀÑCîÚì„:û2û;cw;êK{¬£¾ÆîŽ- ffu ÷œUN2€§lG_á£×ûZÇkÖn¿îÃÑÑë¯CÙ‰½˜yÎYÓd÷É^W¹è)£«ÕZ䈺 ~ÁZ±,m]έ9Ó™zò±¯0Á*í›»~ÁÓ—ñ}w6º€éaà7ø† _£WÛhÐîJ·äرIM6ÑdÐ z[^—Bý|Šdn´ò4B*‚fMÉTä¤Ûìy|®¹Ô\æòåN/ ¼{é|)2~L&ƪ¾˜¨’û¯÷ûÕð¼:í|šœ¿©œ¤D¼˜Š‹(Ưb;OÉT ’ã7ƒÉE]Ïfü¤éŠ}™©™)z•A“¹QÊŸ{«Ê.cJj}Pð­ÊïL4¿ÏWPy×ÂuËž\5¥*z17ɤå8ÂLŸFfî:¾‹a]E”;ßñyxÉHƒÑ•¨Qg{ĬéõkÆvøâÆŸø•xWžÂ¿ûÓm†ò/ Q+ø©‘«[¯CÙ‚x‹ÜŽï Íuyª Š5D=¢NS¥±ûoúfU³¿‹s­ g7ÆÆÙ°Žð1÷ƒ ¡‡¹?vVþÝ‘hÉ~ª§‡™ƒì=œiR5ìÅÉWc¥ `)à?!!N Ó¤*ù»váŒæÚ†˪µË7æÌÚÔuûªnPÞoûÖå°ü;¿¨åmæBJ s`.,x‘>N¡DúðpS©¡ýUƒ<=4khÚ04@m84@‡Ä¡2zHú݃@¡»à•ã ú=xïØ…@¡ÿ€@¡;ðº*BïFÀEèvl„nCÀDèV¨ÌxÏߌ"´7h@H ‘¼Q«“i¹ÖƒŽ¬VÚEJ;Oi“•VPZöøzݺõºj-ù5ô ~Zi»•6)¨ïÑý¡G7Ö£;Ý£û×Ý/HÌF†]i¹`òlÝùÙºðl]ÿl]ùl]Ál]Ölyª?Còǔ֥´Ž ¥A÷UƒîíÝ º¡]wƒ®¨AçiÐEÈ¿}º÷útÏöé2ûtRŸÎÞ‡Ôç  9Iž‡FœàÂpS¶ø"yœ¸K‘ü˰ó¤XJNA+㿘„# *ðÔ£ТÀçÀ«–éÃMÅb„,nª@°x¸i!‚…ÃMK´7-Å%@“2¤eØ9&VI38•)çL.1¨ oAø™ÃâJ]7\»T¬Öj¨UÄ*qåV„6YñjI™œÆ8©¡«Ì×Ï‹ãeÒ:,^Áy<ÃâG-– ‹x#ô¹`‚ø¾wL<×ô x¶)B‘ür ’‡Å_zqÈ ñyñ ñ¯ByÚ«Lr(.ö¸3¢FðH\úaŸ2åC¾9xBü¾÷¼¸S^gßlóï¨UÖ^+}8¹+|câRñ{b³W«SáÞÒ¢¬=«ì¼XïSæŸ*bÈy^¬ñ) E…QÇJâÓNc…¢2[þ€B Äw’ƒ[ÌnQt÷£šž At‹DWíJq¾¨5ƒ'ÉnüÐ$;ƒ¥üà“üà.~p#?¸†\Ͷòƒ3ùÁiü`.?˜Á:ødµI-¨õêDµV­V«Ô¬šâ¹HŽÄ> fÉY&Y%È@ÅÊ-«ô “ÿ¢ÀD‰šBCµ•öƒšîÃz/Ö=XïÁº ëN¬wc݆u Ö^¬ý±_GÐ~z÷q!Þ½›n›$n£÷Nöî¥[&{[h¯ÒÃCü‚¼&ÂáÀ»x¬/Lî«öµ…I˜H¶íV³¹·ÊZeª4–Ψûަs²õóXÿîþ›ÒØ´õ—¦Ÿ£éEòK¥=v‚_çÅ#¼"Ñ8AE`P|œ°ÚÃ4Îk ¶·‡ äNÌÞÞΕ§¡U´"T7B+eÐÞ6ïÓªP³L‡÷ëÚQl¡"†Y» Å L(Fƒ(‹¡2‡±î¸˜“VÊbM2@1ºœŠ˜“nVÄÆd±cÊBuÇÊÊö%Ø ˆl`_ºIdàÛ"ŠÈÀ¤Hº"âõ¢H­W9–áEcÞ …íþ†ÝgçÆÙ¹ »ä¶/ή³ë‘íÿ|–×ü=Ò¡UójÌPUeU>åøÄ°Jª óÒßšcãäƒ]€ÿuì¥ endstream endobj 260 0 obj 5324 endobj 261 0 obj << /Type /FontDescriptor /Ascent 750 /CapHeight 0 /Descent -250 /Flags 96 /FontBBox [ -26 -208 768 686 ] /FontName /ZFRCJB+Times-Italic /ItalicAngle -15 /StemV 0 /MaxWidth 1000 /FontFile2 259 0 R >> endobj 262 0 obj [ 667 556 611 611 611 611 611 611 611 556 611 611 611 611 611 611 611 611 611 611 611 611 611 500 611 611 611 611 611 611 611 611 444 611 611 500 611 611 611 611 611 611 611 611 611 611 444 ] endobj 120 0 obj << /Type /Font /Subtype /TrueType /BaseFont /ZFRCJB+Times-Italic /FontDescriptor 261 0 R /Widths 262 0 R /FirstChar 75 /LastChar 121 /Encoding /MacRomanEncoding >> endobj 263 0 obj << /Length 264 0 R /Length1 3844 /Filter /FlateDecode >> stream xÚÕ—yTUׯ¿s§‡Šø˜DE"¡ÂC¢FŒ`ÐXçjjÑ(qDmeHP#ÁÄ8$H55j©jmblB‰Ec¬•%F ÚX%ÚDÓTãØ*M­XW„G÷ùÀt­®ö߮Ջçw÷þö™‡{žPü±&ÒçäÎ*{¸(Ç%õœ³tqTÞäKìk€’S0?wVX[ìfÑÊæ/*ʉüi/ÀÜ ÚúófͽZž8!pþ©Óâ¿÷‚ÜÅËBW©hñ Äw/ÊŸ3K=‡[⯿cî¬e~ÔZñ¥>DåÍÊw1r©!þ.ñ{ä.öUc£øº<5¯ û-ï›âßüüESÐãÑ#r ý„GÆeµ'0ëŒ0 SP‹luÕj3JU"^較j‘4‰˜iî<Í8½8mLG½x9H6ºË{<“\•†aD` jU9jc˜Ú…mF¥Z×0 ½¬8ÉyYænä"ÅxÙÖ÷5. ÐxK”…È6†ã;¨°î` =Ó±UØaæW]ÙÈTw¥öøj Äl”³¥§ÔiU£Îª/IøXRÍê„=Š92Þ04Úµ¨1Âñ$jÄÇ0ÓjÒsˆxé¿N9j³]¯¶Éø'Ê葌­xIô­’¯ ÉfMé9®c´üÅ›¢¤Ø%b’˜dŸÆ4U‰%γ2W3kT5RÌ »D¡_!­©ËN[#ÎÉÆ:\·«Œ¡ÆY<ãŽäÜ/ì2c‡ÌG]i”¨Ùms‚ñö$”Úe‘™ñÈ{º¬H/û6&©}F"ÜæµóþÜØÇŒ«†¿3síªQÝuú;±ªÚ¾+›¦DÕ:©ªšuÀìH‰™ÇÅkV´b5’Ò]Žm™†BB”»ÊˆýöܪôïdEêILø77Ê튪ÂĪÎEQ{[['fYáöÔ*»g•ëWeÅÆ\øoÁ ‰ c&fEíU®™íÕŽ˜™)âä,1µ'²è#2õ®5ã+·rìí²g]Kï`ÁQ~¶a¡ÿñóÇ“án8Þp<)8Ðë ôäXh.4Û/ûÊ]wo=åă' Km³üx©#8ÝÏØ€R Êr7ÔIùæIÊ“ê±ü›Çš»Õ¶Ræ×çkºÌø”¤ëÛ+:2ÔdNJìÑ5 £JÔÅ.kmjùj§.²… Ø[b£×Æ$%'„õ ï!ÝŒvzvžœÙ1¼‹¥z[=û"ÍÝvÉ;ã’·¡î’[Œ†+uAƒå_2ú7z¯œ™‘Öèu×y½aZeJRúÄ¥zBThàÃj¨ð`Š·kXhL´¡B,;4¤k˜Ë“ª# :Ú§ŸG²H´«Q;¾ØÈ+š°¿¬hSdj÷Øt¯ï†ïæÄeFËËÅãµé͈ Kíµ±xƒºl¬Yø¨o?º°¥¸ÓËÖ|ðŠe%{ñâ©sêŽ6ããÍyõκøâ¸d˪ØWst3ÌÖjÀj°ûr}"°8#¶òÓ‹%ÉoN¼ƒ*tÃOò„‹Õ–ê—$H2E ’w°¼»IGlÝ$ggDºÏÜü<­)Í-pÒÔÒ„þ-Ÿ–tÓýyKSK²,à@))؉‰B ž¨0WŸ˜h„† Å;Њ»Wšdn¸w=É {û—­¾k¾çÕrÕMu«KÚÓtÅwP¥_ùºÚ¨ÏóÕäùmi ©åuù‡}¯HøXÛbêŸó™óD—´&=4ý|ÿ^Ñýwkµ¯\vÍvqöo.ËØ•-•ò-žâÛyï¼ßªo"÷Ë:k.²œé0äDÏ-á¤Êlo×Â3’Âe^ôl¦Ë<ÃuM¾Íª½WAíu:2W™ùØ#£‡÷›\”;;‘>?||»ôñë_fF«±RÙðÁTiâY¡A[‘ÐD+é#[Èfòù5y—üy‡l"o“'o‘#¿"ÿJ6’7Éä_¤{&þLûºÜ¼seo\§§mWi_!/“—È/É‹äò òäyòùù)ùò,yÏËž´å#Þ)j§Ä¶ð{Ú'Û©•iÿŽW?Ÿ}ÓŠ‰°Ìr>9œC>Af“3Èéäãò»QŸõÇéMc?§ÒÎ"¿GN!¿K>FNæJM¢=‘œ@Ž'Ç‘cÉ1ä¨Ö?IOeý#©dòD?B{8™A¦s4Ãh?L%ÓÈ!äCä`)mÊžÓö@r™BzÉdÑL$ÑîO~‹L$0JØöd<ÙqÒ†-oíÅq‡ö¡KöFaŒÜ¦Ü$åBõ(™#S~¬èü‘T"h÷$Ã3ÚöA²;ÛîÆ\adW2´n™J‹¶¼µ,÷Ðñ‚ÙbP{,ˆ§QÛ¦”ñ‘ºlž®*I²Ù‘ì@ú‘.¤ ùºšàÞQ¼‡ôÿf"H]³bÿgÊègŠºRjß$é5IU’JrÉ/“±kÊTa¿ÿɃ~ÿwOÄ?ÔœG endstream endobj 264 0 obj 2246 endobj 265 0 obj << /Type /FontDescriptor /Ascent 701 /CapHeight 0 /Descent -299 /Flags 4 /FontBBox [ -39 -177 795 706 ] /FontName /FDTCJB+Symbol /ItalicAngle 0 /StemV 0 /MaxWidth 1042 /FontFile2 263 0 R >> endobj 266 0 obj [ 744 795 549 ] endobj 128 0 obj << /Type /Font /Subtype /TrueType /BaseFont /FDTCJB+Symbol /FontDescriptor 265 0 R /Widths 266 0 R /FirstChar 33 /LastChar 35 >> endobj 267 0 obj << /Length 268 0 R /Length1 5388 /Filter /FlateDecode >> stream xÚÍW}TT×µßûÜùbàÊð5 ˆÜ¯80AD*ÑfÐ4~DÃÔDQD@)Ÿ5ÑDHPkSm•eMjž5Wj†&iLk–McšDÓšå‹/®†41Ijͧ•ûö¹CŒvùþxÿ½»×Ù¿³ÏÙçì¯sÏÜ€Øxê›k[Á[hä 5[}G»ýÙ>ù,õôiK[—5oþç¾ ±SËVv.ýâŸ/þÀt 56Ô.ùðDI€¹‘&6Ò@Ì~Ý$÷’<¦±¹}­ùWPN2éƒieK}-œ…|’¹=CsíÚVS>;FòÛ$ÛWÕ67”ìxb!É×H–[[Ö´«§¡ ÚFrFëê†Ö¡«¶¿“ìˆz•Æx<<"5€F>¢o„4j5›p RÔóÔÞçm¨Z½¡oÇÐkê!6pG=ù°†? è ™E°‹Á‡U Ò®õð9ÞKá(|ÝÌ Íà!m7L ýÒ`>œ,W‡ÀÐ=p˜ææ@ú¦z‰¬å‘µØ;0úGa.âJŠV‚RXGà[£× Ý*ïhìò½´ÝýP€ÙC‰DóCPV»¡ÑFÀ5|¡TÙë ¥È^mNpúj—„fÏ©òyG:wNËêåºÈ¥¡Øìáå|TçV‘mwÎrî?tÇ,‘—t‡=Pä½ÚšªP± ·—J–½¡äuؾ¿ëù»e2Äœåµ ]唚îé1È¥ÚÇHª˜g§mÙÖ@U·"Nh¾G¢h}|$¸ÂŠ’K寮AÊ9Ì­RR=©>¹ÖÁì*%Å“¢ îœÛÆÉJÊ€»Ä]Âq²Ã¶1‚>?{2ZÓ;u‰°bîͼ ·$ûÉͽ^3"“¯“8k˜]õ“HžR”ËCQeÁ.ËhUHï´Èö®/€ %_ùäö‘ÚáƒÓòð./çÍAóÃ}í· #è÷ß°%ž4½A¢#«3J˜õ:IXj”Á(!¤˜¢Âì®ãŽe³mÙÙ³®ϼQ<ËòeñLËb˜Z|£˜·¼qâq™Ôœú˧¯?¥oüvïiá¿2è[ ó’,8éY—dgÑÖèdeJ6d2S¬)ÉÖ kæXëØäjkuòrëòäÆŒÆÌ'­O&?c}&yÀ:lµ˜¤¤‘™‚53UNHΡÒ³&ÑÉé¦Ér\azÒDÙ‘*S‹3 )K'šÀ.¡äY™Ö$óÈT—%.ÌjO¸¢FË.fÁ>רÜ3׊o R$ZÅÅS¯,œ_Ÿ\„qñEÙÙÙ`).~›÷‹æÃ…m°°p Äågd8â¦à„ñÖ¤¸Dkr’£@ÎÌG†G“ rJð±©Ý÷uìË-’ ³Fئ´e%äsËu wç™Æß8Y9oûSC‰¾ì˜¼¼èŒ2ü¼\žZãݲŒè<о̴çbÖŒOÇhÒä“×;o¢c¸ŠQßés4Àÿ\„¡§†~düòæÌw3S·†¯¦¯¢³Ã¶ý¢è{Á@= Q&€ñ#ü#ɨiÄïc€8€Ù’²¥Ù÷.onXã.mY¹„¯×u-ÿÞ¼ÃÃç+~½Ó°ÓȒ¬[™&%†YAB˜m'ˆ³G ¨XXÂlAl˜m%fˆaöAL˜m!ˆ³Íæ0ÛD@õAS˜m$0†ÙC˜­'ЇÙèÂlNfk 0"Iž¤iÒ{~|ÃvÚ qgwŽÁ%¹,HÑ[ˆ[XEr€Õ“¬²%Ä?Óø›šÆ¬øK¬–ø1G4wh¼…-%~õïaËhIÓ–Ø2Mž’h–g  D<¥ñ#7zÛÄ3mâoÚħÛÄMmâä6qb›XbÆ·è÷MÄ>7h<Ã](.; E¹«|Hj"ÎÐxšÆ“=‰q0 ¾Ä`@\ÇÄ+vÑ+*âCߢñuoÔø\»4ç‰ËßÉ÷g‰?Íë²ÄIYâóKŸ`"š=#úÅ÷ûÅÌ~1½_ì)þ†NP,ŽPb!jÿˆ4›>r•Æo”Áµ\UjF|¦Ô8 >Uj2¤’üÔ˜(?øÔà¿B¯ŽË±‰q|›4ù¸ÐIøŽâzž–ŸÀ_"ð¶âª&xSqe¼®¸F¼?(®t‚W¿àeÅŸApRñßEð’âÏ%x^ñׄÿ Ás8®¸W(Š{³ô†ÀÍŽùMJM >¨Ô¤lPj&¬Wj&I%n|z5Û‡cXCò>Â6B[+ôhó-УͯÂ&Mn&äó+°IËÅrúÄ×-£˜9Ö+®df‘âÊ!(þ<‚*Å?W*q>øµÍî¿æá<ðk‹f+î#¤vâ$ÿgû_©¸_—J¢°r‘¯òƒSÓž®8÷“vÞpUr‡«áŽ ›<ç8u—®¸ò¤O\fé·,ïyž{çHÞ$sÅIgýñÒëÎAé·ß×ì—Nºê¤—è€ó„uè‰•Žºò¥_ùc¤#þ•Ò3~>– ýŒÖìóï–~Lëw­”ºœ‘ñ-žTi3’hŸÕî4©ÕÆ}'¤wÔœK]Ejr’s'¤ÎÝR£3l"wë{ =ÑÒýäKµ?Gšïç²Y2\’À\üžZ¹ØVGî°¶ÈÅÖ¹µZ"wØ¢Èuµ(r¿-Ž\e‹ŽO“¦åÒv'¤2ÿhén²tD‘й³ŠTä×ÌOp‡yÒÆõò¤H9î,Iò›¥ù}ÆûŒ?0ów3Œã(cš1Ño²˜F˜bLf“Éd0éL̦İzÉ3†ÿ$, :ÎuŒsù)ahb0£ÄƺÀÄ¥¶ÚÃÔ¶PÛDm#µõÔÖQ[K­ƒZ—zé8_=ÀºØú~K¤»ž­\Ƕ ÷¶±µÃ½µ¬Cë… ¹M¾Fuk·Y;¦Ú¦ÆO‰+*÷Þ‡yö÷í[p'Ý[º8*ô“ŠyU¡ÿçuT "4–j°‰,ßç`U¸šMôÍåã¸Ú µJM zY©A RFC/Wƒ^a´¦¶«õõôú¼}½½šŠ~/ôh*=ú½šÊ‘ÈN.2@;y8šÁ .MÍe0s5:š6‡6óx4­”XlâZØ”«mfÕì9¤âwr•¾l')ô9³µéÌï§Ýmº)2ݱßÏçF–;"óšÏþÿô4”þ_Wï¾´ýÿ«”} Ô‚¡îú7´©ÎnïÛ~iø?DF°®¾‘cmCè’Üà m—½ö¾îCw˜>ħ»eoòÝ[ÕwÈÓàUº=ÝÚ?Œã³VîºÍÖö›¶*Þa³ƒ|³JnkÖ®;LïâÓ³¸­]ÜÖ.nk–g–fË·|^éš[ž¶·G:wNÃz×ÿGweÅ endstream endobj 268 0 obj 3665 endobj 269 0 obj << /Type /FontDescriptor /Ascent 750 /CapHeight 0 /Descent -250 /Flags 32 /FontBBox [ 16 0 757 676 ] /FontName /PYACJB+Times-Bold /ItalicAngle 0 /StemV 0 /MaxWidth 1000 /FontFile2 267 0 R >> endobj 270 0 obj [ 556 ] endobj 74 0 obj << /Type /Font /Subtype /TrueType /BaseFont /PYACJB+Times-Bold /FontDescriptor 269 0 R /Widths 270 0 R /FirstChar 104 /LastChar 104 /Encoding /MacRomanEncoding >> endobj 271 0 obj << /Length 272 0 R /Length1 4388 /Filter /FlateDecode >> stream xÚÕ—}XTUÀßsϽw¸ à Ÿ’30€|L¢†féš©kø "¹2 ~ÛŠ‘•!•k²l°®ZkfmDFf®>b™¢•’µ»º­‘ìë¸>ˆ3ûžw¨çÙ}vÿÝçÙ çwßóùžsî9 ôPœK*J\ 3ÐÒ)nÉÚjóÊÙµ2Ê7¤°r×Ã%F—À…­þáG6”»zݨ? ïX¶´¤¬;hâ_üÌèÏ^†ýYvõBÔ–UT¯”®¡¾õèG*—”ð\¹õFÔµŠ’õ.¿ öêQ7¯,©XúElu8êgP媬ªö¼Ï¢~u»kõRWñ+˜×?mz´1ã#R!ß|« £UÂ*héƒó0ž”¶ÃD˜ '¡˜õB ÛuÌÛÑ;^‡øSØ`1?€y†à´Á%i!œC­Ò¥(|Ï€9˜«Y’¤X'Yœ”‚¤‰ì5Ø#5³-°æÃ(9söC!o… È”B±¼\Ú¦¨’öæAK“¤þ4Ê7!G™ á¸á¯¾ÖC»…µ/ƒ«p ²¤(…z©{zœ]bGØgìKi|ÄN±!v^™Jå8J#ô)'áˆd‚UpuLäò°ªˆ%¤`ÿE*g»”slŽ&޾Òá؉ö0ŸÒy#Ø8özà~üKáhÉTjQ>…31K¹óY3¬QÅX¡a-É•Zöébf ì+5²EJV‹áIèQÜÒxé3XµÒMÌÙ _(õÒŒ‡Ai–jY©/&0C™uJ=„ad,ø^ˆ32Jé‡Yì¨d`‡¾ò¡ôµ¤W§@™ÒËúØ-5MMd-Ê-  –T³`<R3ÙqÕ¡a‰ZŒãñMÛ¶xá1°;uª"s‰Õ¬¹¥ÄûÊÜÎ ÍgæYlÖSÍšÎ솙îÀ æ6¯wf¡lR湕h7Oôsˉñ×þ›óšÍ:mf¡¹é& W;yqg¢(44£}rM¬^ Ê= r¹ò®Yþ2¨ÌO‘dHë¸Ò‘ZgGg‡=4Ä’h ±”Ë0TÅMC_ytA·¾]­¦í„B¶GÖK)XG¨ÓOÚu¸ d­³ËõÚ™%Ë"뇦óV¶§Žòo÷ÌeœÙ,XäÌ6Ç„Z5cüÿ,ä¡FÞ”al ôiJ²ΨÊ^ ¯—[¹æoÍÅ<2*EJ3[ã²µ+½]]!FGzh]]½í½ZŸÖbp8BAƒÃžË23²³Æ&%«:5>.)klvf†1Â8¡->N ‰Ñ ™áaª.–!1S2Û´¼à'×Të§'ÇŒ2Ç™f&å»­*k½zîųõO¼{üËC•»F¼ä¸ÿÝ}ûÏ&Jª%Î<*:V'Go.­Ù}øâàv¹¥³é‡êJm©gv¿÷ÝÒÙ¾xOõöðŒ÷H…ùÎ ³5<Р×[¹SRTÓá,ÜÀ›[™uŸáŤª´À`}D¸Y/Ct0XãUkpJšv¥½·³W»€CǦ‹Á÷õjïõi}hðýÛ™oxa8|žœ@ãŽ0Ƨ2²b" áaED _ºÙ°aÅú†µÕ«?1zNo)]ÕfÌß9'kÜÁ\óÑÖþŽc}½Ç‚£XÕ…Á–½í·öK{´ŸyhõÎ…ËSïš½"!|«çó×=žÁSç™$Ó×ò*¶Nqã8ÍNÍÚù)}€?ðwרz­sd¯Qô½¿Ëá°‡N`Ã3ÀãϤ¥ŒJ ð?¯ŒŸ;Ú¬õÌõU`ÜbðÛ– eÎñ©6‹ L‘ú»^¶Ûœ¶Eú™6Ù–nhÒ«‘-æ{‚+Áp"AIPÝéU9–MõO6 7ó±9Zgg—Ö}¹½Ýà(¢ðuŠðõ‰ŠàáÒÑÎØY*óÅlxI N„óã–có-.–9qëÎ-o¤XÌV£)olþ”{󢊌± qæÈy#÷UÌp-7ópí®#åì†É5}Ù¶“,É–1™É çÌ)1Å™Ìq‰K KÖ•š6olÜ4ïQ<ò¼-xæu*£iÆ@u~ (ÌOlT`˜$Ðð»ç¡ŽÔÀó˜P ™ùƒ`âh5à;ß‘XFE™á9‰9!V»üÍÕ¼< ¡}:pgÒî|zÓ7ÚÕ;wÒqçX8¦P5Þ !XÌFÂà 3#GN¾]g—«vÜî±ËÆWãõ\÷<Î6³HÙn{ Ûs‚9»[¤s+=GVzrwû\ls{åiωntèûŽPzºÞë\œ7 †&žïÜÞðýÛÛ‚_ŽN\U€g­ïü¥2Jóf<—çzݾâ·õÏ÷N>årbÚÎûa*ÄõY ø…/÷¸Ú˜•Ía¥)TZñ,7aœDt¨ƒî:ž×l¸—†á6TŒ<ôà=÷O3{CEiå#bÓãyMÜþãûW5ß+Õ0<À™Läð(R"™A¼Dñqˆx›8H¼Eüñ&q€ØOüŽø-ñïÄÄ¿ûˆß{‰x¿Bþ…ä¸e¸^zH2‡¯Iî&~Eì"~Iü3ññ â‰Wˆ þžø;âçÄψ—áq\§ ¾ãQ»H¶‹(Ëð ÉSX>"ù±ƒxÎ Ï’ü!ñ ñâûÔ÷Ó$·OOKÑI£™Hòâxbqñn¢Ks\sBÎ!Ž%f3ˆéhã`'9˜J´­09†ä»ˆ)ÄÑŒm(øZ2­Ð$’‰ ŒŒÇSƒã‰Ò€´ÝŒ1âø;Hä%K ÉÑDS¾oŒ$FQÛ‘”ËHŒ †SÃè„A¶¨à[ØBñ,š†Z(µhöh7 ™cQ” ¦ÝD–@¢ž8‚@ô'úuxGçøÅº@¿i……Î(:‡8žt1D~÷Šþ/ÆÑ/Fk Öþ¦½˜Ü˜N`Òámeú¶zV5æòÀ˜ÿ»'柋€Ü‘ endstream endobj 272 0 obj 2719 endobj 273 0 obj << /Type /FontDescriptor /Ascent 701 /CapHeight 0 /Descent -299 /Flags 4 /FontBBox [ -39 -212 604 711 ] /FontName /DWQCJB+Symbol /ItalicAngle 0 /StemV 0 /MaxWidth 1042 /FontFile2 271 0 R >> endobj 274 0 obj [ 744 247 549 549 494 439 ] endobj 89 0 obj << /Type /Font /Subtype /TrueType /BaseFont /DWQCJB+Symbol /FontDescriptor 273 0 R /Widths 274 0 R /FirstChar 33 /LastChar 38 >> endobj 275 0 obj << /Length 276 0 R /Length1 3788 /Filter /FlateDecode >> stream xÚÕ—{xÍ÷Çßßßåœ 8NBRÎAÈinKCÑ$™ºÍBIÅ%±V$¥t.©ªEÖš²Ì2k»2Õ®= µÖ’CkפìÂL[· ë:1O%'û|ß9¶çÙ³ý»çÙ/¾¯ßçóþ|ï—ß÷€Šõ0‘1¿¸ TìÑ¢4Jê3årÏ’iå–Ø×#¼°´¨¸ ¢Ô%v«h•E‹W^ =²0·Š6yÑ‚Wºe ìóh‘¡ï«&À.þ€EÅËW…ORÛÄ&¾kqÉü5gÅÏ¿sqÁªÒ.ê9ñ§‹ïYRP¼ð“¾+ ñ—‹ß¯´¤ly /ˆÿ’øCJ—-,Í=yŸøu@H¨h zçømŠ&8|Væ‰ E µ¢h‚1*573eذ)ª67µiQvN¡*“1·×Ș›íÁœçh,ÏŒƒ­BôdCI2äÛá–wz ]‘nikABÛÇ'$Ýt]hkiK’…Hóš’Â1ôpÁë‰pŒéžáHIN³Ý«H´Ê¶Þ»žhE¼ñ“öÀµÀ³j­ŠT‘ǵ\ Ô©Œ+_Ö KµKÃvt„ÔÚã%'uW$|ºc/0½W™ûx÷‘-zhú©{çÞêûïöÙqͲãä#üv²Œ]ÝV-ßÔý÷·løgäþcYgPh-@ž‡¥r2ç‰Öã l×ÂÓ’¢d^ôlfÈ<ÃyM¾±*Ø+w°N‡ÌÆeM“3zè´ÕÅóJësÀ'ð¦þÖÿ‡Çú—™Ùn¬W60•EšxFhÐV$4ÑNÈ6²•¼G~IÞ%ÿNÞ![ÈÛäßÈ/È¿’Ÿ“!o‘7ÉäŸyºþDûºÜ  do\§§mWi_!/“Ÿ‘Ÿ’Ÿ—È‹äÈóäïÉß‘¿%Cž#ÏâYÙ“¶¼cÄûˆÚGb[ø5íƒÔÊ´E6’ 8%|Ÿöiòy’ü%û~‚öqòYOþ‚L—Ò¦ì9m§‘_!SÈd2I4‰´ÈIláPÚCÈ8r0I¶¼µ7ˆ;t íXrº cäÆ0å&Ù)ôR÷È™òËDçïK%šv2*³cô&`Û‘ÌAö"{é’Ù GiÑ–·ÖÂäš(^[tcnžFm›R&@ê²ÝyººQéJ†’]ÈÎd'2„t"U诫 ÞQàÅ{Hÿ¯$šÔ5+ö®Œ~®¨ë¥ö%½,É/©N’S~™änªTeCÿ'†þß=Ñÿµ£5 endstream endobj 276 0 obj 2181 endobj 277 0 obj << /Type /FontDescriptor /Ascent 701 /CapHeight 0 /Descent -299 /Flags 4 /FontBBox [ -39 -177 604 706 ] /FontName /FDTCJB+Symbol /ItalicAngle 0 /StemV 0 /MaxWidth 1042 /FontFile2 275 0 R >> endobj 278 0 obj [ 744 645 549 ] endobj 115 0 obj << /Type /Font /Subtype /TrueType /BaseFont /FDTCJB+Symbol /FontDescriptor 277 0 R /Widths 278 0 R /FirstChar 33 /LastChar 35 >> endobj 279 0 obj << /Length 280 0 R /Length1 3600 /Filter /FlateDecode >> stream xÚÕ–xÕUÇßçœï÷{/5Æe ÓÆd,¶ØXDÈ "@œ°hLš Æ…§»2@k nS‘¢E‹”Œ¶å£7$œ(Ä*PFšã-ŠH©5&­w}Î{Wþ°úÇ?zž¾÷9¯ïçÇ9ŸóùžŸ @6 ¸¸¬$ŒÙØ/–V)/^³*eÅÜJP =0^ZV’f•øk—._ ßqè-À±unZ¶¤¤ôÉÁ¡€;HüŸ[&†¸WÔ)Ñ Dº¬lÕÚ@• ‰¾VôËË—àa\½ÆfQV²6ìS[D¯=eEIÙ’³·< ºÍ¢—W¬Švâ=Ñß=#¼rI¸¸qtàIÿþ8±)Øï±_äa‹Ûc–óh|üÇH‘¬Ð“­z&aZP¬Ú±Oí@µÊÄ6ñŽÇ3؇cRÆ" Í^©Ó64£M/À ÑBÈÖ7Ë{6 ¤V½Ö:«Ñ¢v¢EÇëIêiìÖõjž@;Ã¥f' Í~”!G7 Øùª®òzV«*P¬'ëÙ}4êœ+ëNü„öš2}ÑWŒ<Õ%Ñ—áw8‡1z,¡V/’L«6u@Voë9xUUÝê¤;?™O$¢ÃmÁ„{q@ô$L2NÌ?ÝÎÒ%[Bj‡{Bí–ïÏ—¯ï@6va»ØwI½²M2dŽK˜!¿tS'–·Rä£xsÜ6©z¬ö”±Ÿ9 ö!ÇÔ¹•êu»rÔ/ãœT=Ü+ÆV\r#z¢>ûP©¯HÍý8ëÖê½2 n½®T‹zdzÝ9¨vk1PF&UÞ dF»˜£êLÌ^ÕôáØ¸/ë‹:Λ†R·]u¨.o”—¦ö¹]²d*U‹7U·—£{ã¼xiQ)ãxx}Õ†lFVÐç¹ŽÑ )ˆNûbi$xWaÊñù©™QS¾”ò#}×¥4÷ôä:Iîüˆ;(bÒü'mȹÿæ<—™13¿0¥Yù¦æÅÂN]˜'ƹ…"ZMÌbŸš—Ù»ÎCÑNÈ}JV­‰Á><åwµƒQ­gZ³8Õzª5k@ÿÔþi©ýSCº+LR÷…èN_|×å•^zoŒB•èÄëc öõjÔèj¿Wù§&´Ž–@ÝígÚ³Têþœøîæ€-*±º²ÚîÞ‚h©ž'sìíÁÓèªF4¸M#]ð†ùíçm˜óíŽ,uƒd#EÏ‹îR¡kQ·­èS‹|åƒFO7: ^“_pÓ lœ í×ã 0c¤¨Pt—Ö×¢ÑÃÞ‹E]ÛyrHi8ÔgÏ=ý&| ”Ÿ[ûÈ W×]KO2rm¢z×O{bÕ_«—3i^´éêÿ¦;ƒ\ç$BöxqJQ¨›P`‹¨·Ê/OÖK [¸¸_Î$[‚ò5ð½+ç…Še–‹ë¡/0kÊ]SfL9w]Ù¢òå×Ï®èÓ²kþÓãòŒ²çc0·GoT.¢0Ê! jÊŠ„%zÈ(yì&¯’ÿ$»È¿“WÈÈNòoäeò¯äûä{dù²ü3³üåKx¥’÷%jV6¸Hùòyž|›ü#yŽF’ aZzkÈjÎéì³|#,{ޗܶҲ…¬Š­*Ù]†²‘`3¿§’5*9o›ù=›düΈg=›pD<±Azué1B;ÂðuL›õ¡k±»Õ¶|€\/g†­µ¾Wc?÷³Ö:ZÖ’÷‘køÕ«s{÷uVbª´¬èÕØÒZŒÜéaÎþ½ô„QÎÙsöÃÌ­+0Llåœýræf-_c›eäRr ¹˜¼‡,&¿B. ï–ÿ2v¯ßM­ˆyΧ\H~™œG~‰, çr¦æPÎ'ï$g“w³È™äôž?H¦_`üi´äqGO¡<™Ì%ƒüšI”o''’Èñämä8imdÍYy,ùY2‡Mf‹Í ‹ò(ò3d&™é‘”?M¦“#0\úpåmµá\¡Ã(§‘CÑO8Dn #÷ÈNa*í)2FFþƒÙú·Ð’Ly™”Û»>EÞ̾ob­DòFò†2:Ñ_ztåmmäš)Úö˜ó%p7ZÙH›(iÛöã¥/G~’üÙ‡ô“>ŒzrºðŽï(ÞCFn¹dÒFVÌ¡|ýB±n”èIyBJDÊ)>(5«ªVUŒüŸ<ù÷$ÿ õ®î: endstream endobj 280 0 obj 1919 endobj 281 0 obj << /Type /FontDescriptor /Ascent 701 /CapHeight 0 /Descent -299 /Flags 32 /FontBBox [ 41 -202 550 729 ] /FontName /LCQCJB+Symbol /ItalicAngle 0 /StemV 0 /MaxWidth 1042 /FontFile2 279 0 R >> endobj 282 0 obj [ 250 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 549 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 333 600 333 ] endobj 130 0 obj << /Type /Font /Subtype /TrueType /BaseFont /LCQCJB+Symbol /FontDescriptor 281 0 R /Widths 282 0 R /FirstChar 32 /LastChar 93 /Encoding /MacRomanEncoding >> endobj 283 0 obj << /Length 284 0 R /Length1 3632 /Filter /FlateDecode >> stream xÚÕ–XÕWÇßç|Ü+^Ф…è%E$ Et¤â¼(’¡9‡ËÐ) ["wâÏéò1sHÓ\Ṷ̏eÊl»9sÎÌd®tÛš÷G¢¿$y–Í›S6ûí‚@ àäŠÿöybˆ~EµŠ¾Hô~ó*-óÕ¨•¢7ˆÞc~å¬2RÃEßcZQQ¶,èV‹~@tÿ‚²Š9g{¯”:oŠÞ'XYµ(ü"ŠÞ&zFpáœ`ÉîÁ»·à›‚éé‘‹SzG,ÿ|´ôõ“=Òs\ÁIŒÀ:½£0Í(Q—±WmF­ÊÄzñŽÀ3Ø‹c’r‰Rk§äiÇ)À)='D+G–¾M¾q·äjÔZ'a1šU=šu¬¥ö`»nT«°ÓÐÇN•œ×QlíC²õ.”Ø÷ëP¥ŸÄbåCJôh=±‹Fƒ}9N¦ãBØiU苞ä«6©}~sªs0uz¦´ô°:¥ö«Óê-]„WÕQÕ®N:ãø–K/pÅiÆ~ˆ°_ôDŒ²ìˆœ{¤IûM*W›j»ô’ôþ ²°›Ä¾Uò…e5 Ó’–ã åM³Ä’íT‹|¢È9…iª‹Ý‡d¬ÄgíW{‘m58Õêu³2âÕ7 Ãìdê–`.9!=RŸÆRTë›’sÎ:uz§ŒG¼Ó¨«ÕÌÎ1ÁD§µNzÈÈ$ËwºÌHç:ŠÔA ŸµS5}86ÎËú¢Žv 0Û¹¬®¨6w ›¢ö:m¨VÍîPŒTín¶:ìsc¥DµŒãá5«:°ƒ×±-­á÷…tÊ—f‡wûOMÎÌø7ÕïóøC˜ŠYî?ÐÑ1©ØNt¦†œ^!+ŲSúžû8ç¹ÌŒñ“Šý”gl~¤Ú±¥ùbœ\,¢ÑÄ,ö±ù™+º<\o—;OÉÊö !Ðņ«¼Ž¶1°åLK|­-­-ƒºÇ%Ç¥$Ç%—Ûh¯²Û/„ë=±mï-tÓÀS®Ð…Î Ä`HÀ×óˆg}ìp5Ü)T…Î}ê>ÇñÀŠrÑ%Êë»~~ðù¸aòfÀwÞƒ”«ã|ñ žþæ“£ woÚ´;­õÝ«§œ[Ã÷‡Ÿ7…ç?ž¾M½¯üòÞØÆ˜¥scæÀëQ&fW·«Ntu𛦧ºSõ–è-QQ…®Qv/LìÜëÿ»{NÏø8Ÿö¤Þn>¥©­×®µ¦6mÜèìHߎ Ÿ“7z[zƒÚ¬Šå}¬sÌŠU‚«C³^wƒ ºÖkÃQ^_knË`¸öËg.RÉCùÚ±í…Ö~“TBmu-x²Hš±hé‹÷v˽¡”—ÇÆ‘n-ÿè[®™9!ªûÑIdN´ÆåÌšnºuÆ»æ?Î(Ç>‰rmšÙ$k» ¥öl‹úYy§ËŽ;Ä”3*Qú¢áC@úÏ;r©HËâ#õº2¾˜0æ®1…£Ó'/¯˜Y9ßôŸOxìÊÿö8’,t•“ԟסW+aXÊ&-<$Ô” Ctaò²¼Eþl#ÿFÞ$o×É÷É÷ÈkäUò]ò ùWò2ù¶òÏ”/áÌ–v_¢fd )¿M^ Ï“o‘"Ï‘gÉ?gÈß‘¿%C¾Iž&ßÀ7$ÑÞ@_Ñ^§íu‘müšòkË«”E¶'p\ø å—Éãä1ò—lû/(¿D%›ÉŸ“‡ÉŸ‘‡ÈŸ’ñî”vìÔ:^“øÆbÉôÂ<ëÉob€aÇUiÛ:Z&k"k§wˆfdKn˜µìO5sTsÞÖ²?kdüΈg =kpD<«±J¢:ôXB3«ðuäŠÍx,¡c1»Õ”\I®3ÃäZÑ©1΃̵œ–eäRr {½8¯s_Wa!ÆJɪN%Å’† gÿz‚¨äì9ûA¶­ Ð_l•œýJ¶ÍX,|eæ‘sÉ9ä,ò^²„œAN'ï‘%³×ï¡6íœJ¹˜ü*9…ü y79™3UDyy'9‘ü29OŽëø£´ô‹¬¿€–|îè1”G“yd€½Eùr$™KŽ ‡“ä´%kÎÈ9ä2›Lf‰Í ÊÉÏ“™dÆ Ó)ŽL# Ub8ò5Z*WhÊ)d?tö•Ã’{¤^˜L»_ÆÈ’<“¿7-I”{‘‰yëà3ämŒýiæJ {’ŸŠÐ'£ÓqÑ‘¯±u—{h¼hÝ1>â‹çn4²%e¤)Û»+––2šìJF‘]H/éÁP¡+§«ÞQàÅ{È’[.‰45+¶¿Tz_*ÖÕRûFI;$…$‘äRjêTUúÿäAúÿÝ“ô½ÃA endstream endobj 284 0 obj 2012 endobj 285 0 obj << /Type /FontDescriptor /Ascent 701 /CapHeight 0 /Descent -299 /Flags 32 /FontBBox [ 42 -197 550 725 ] /FontName /LCQCJB+Symbol /ItalicAngle 0 /StemV 0 /MaxWidth 1042 /FontFile2 283 0 R >> endobj 286 0 obj [ 250 600 600 600 600 600 600 600 333 333 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 549 ] endobj 123 0 obj << /Type /Font /Subtype /TrueType /BaseFont /LCQCJB+Symbol /FontDescriptor 285 0 R /Widths 286 0 R /FirstChar 32 /LastChar 61 /Encoding /MacRomanEncoding >> endobj 287 0 obj << /Length 288 0 R /Length1 3600 /Filter /FlateDecode >> stream xÚÕ–xÕUÇßçœï÷{/5Æe ÓÆd,¶ØXDÈ "@œ°hLš Æ…§»2@k nS‘¢E‹”Œ¶å£7$œ(Ä*PFšã-ŠH©5&­w}Î{Wþ°úÇ?zž¾÷9¯ïçÇ9ŸóùžŸ @6 ¸¸¬$ŒÙØ/–V)/^³*eÅÜJP =0^ZV’f•øk—._ ßqè-À±unZ¶¤¤ôÉÁ¡€;HüŸ[&†¸WÔ)Ñ Dº¬lÕÚ@• ‰¾VôËË—àa\½ÆfQV²6ìS[D¯=eEIÙ’³·< ºÍ¢—W¬Švâ=Ñß=#¼rI¸¸qtàIÿþ8±)Øï±_äa‹Ûc–óh|üÇH‘¬Ð“­z&aZP¬Ú±Oí@µÊÄ6ñŽÇ3؇cRÆ" Í^©Ó64£M/À ÑBÈÖ7Ë{6 ¤V½Ö:«Ñ¢v¢EÇëIêiìÖõjž@;Ã¥f' Í~”!G7 Øùª®òzV«*P¬'ëÙ}4êœ+ëNü„öš2}ÑWŒ<Õ%Ñ—áw8‡1z,¡V/’L«6u@Voë9xUUÝê¤;?™O$¢ÃmÁ„{q@ô$L2NÌ?ÝÎÒ%[Bj‡{Bí–ïÏ—¯ï@6va»ØwI½²M2dŽK˜!¿tS'–·Rä£xsÜ6©z¬ö”±Ÿ9 ö!ÇÔ¹•êu»rÔ/ãœT=Ü+ÆV\r#z¢>ûP©¯HÍý8ëÖê½2 n½®T‹zdzÝ9¨vk1PF&UÞ dF»˜£êLÌ^ÕôáØ¸/ë‹:Λ†R·]u¨.o”—¦ö¹]²d*U‹7U·—£{ã¼xiQ)ãxx}Õ†lFVÐç¹ŽÑ )ˆNûbi$xWaÊñù©™QS¾”ò#}×¥4÷ôä:Iîüˆ;(bÒü'mȹÿæ<—™13¿0¥Yù¦æÅÂN]˜'ƹ…"ZMÌbŸš—Ù»ÎCÑNÈ}JV­‰Á><åwµƒQ­gZ³8Õzª5k@ÿÔþi©ýSCº+LR÷…èN_|×å•^zoŒB•èÄëc öõjÔèj¿Wù§&´Ž–@ÝígÚ³Têþœøîæ€-*±º²ÚîÞ‚h©ž'sìíÁÓèªF4¸M#]ð†ùíçm˜óíŽ,uƒd#EÏ‹îR¡kQ·­èS‹|åƒFO7: ^“_pÓ lœ í×ã 0c¤¨Pt—Ö×¢ÑÃÞ‹E]ÛyrHi8ÔgÏ=ý&| ”Ÿ[ûÈ W×]KO2rm¢z×O{bÕ_«—3i^´éêÿ¦;ƒ\ç$BöxqJQ¨›P`‹¨·Ê/OÖK [¸¸_Î$[‚ò5ð½+ç…Še–‹ë¡/0kÊ]SfL9w]Ù¢òå×Ï®èÓ²kþÓãòŒ²çc0·GoT.¢0Ê! jÊŠ„%zÈ(yì&¯’ÿ$»È¿“WÈÈNòoäeò¯äûä{dù²ü3³üåKx¥’÷%jV6¸Hùòyž|›ü#yŽF’ aZzkÈjÎéì³|#,{ޗܶҲ…¬Š­*Ù]†²‘`3¿§’5*9o›ù=›düΈg=›pD<±Azué1B;ÂðuL›õ¡k±»Õ¶|€\/g†­µ¾Wc?÷³Ö:ZÖ’÷‘køÕ«s{÷uVbª´¬èÕØÒZŒÜéaÎþ½ô„QÎÙsöÃÌ­+0Llåœýræf-_c›eäRr ¹˜¼‡,&¿B. ï–ÿ2v¯ßM­ˆyΧ\H~™œG~‰, çr¦æPÎ'ï$g“w³È™äôž?H¦_`üi´äqGO¡<™Ì%ƒüšI”o''’Èñämä8imdÍYy,ùY2‡Mf‹Í ‹ò(ò3d&™é‘”?M¦“#0\úpåmµá\¡Ã(§‘CÑO8Dn #÷ÈNa*í)2FFþƒÙú·Ð’Ly™”Û»>EÞ̾ob­DòFò†2:Ñ_ztåmmäš)Úö˜ó%p7ZÙH›(iÛöã¥/G~’üÙ‡ô“>ŒzrºðŽï(ÞCFn¹dÒFVÌ¡|ýB±n”èIyBJDÊ)>(5«ªVUŒüŸ<ù÷$ÿ õ®î: endstream endobj 288 0 obj 1919 endobj 289 0 obj << /Type /FontDescriptor /Ascent 701 /CapHeight 0 /Descent -299 /Flags 32 /FontBBox [ 41 -202 550 729 ] /FontName /LCQCJB+Symbol /ItalicAngle 0 /StemV 0 /MaxWidth 1042 /FontFile2 287 0 R >> endobj 290 0 obj [ 250 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 549 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 333 600 333 ] endobj 57 0 obj << /Type /Font /Subtype /TrueType /BaseFont /LCQCJB+Symbol /FontDescriptor 289 0 R /Widths 290 0 R /FirstChar 32 /LastChar 93 /Encoding /MacRomanEncoding >> endobj 291 0 obj << /Length 292 0 R /Length1 3532 /Filter /FlateDecode >> stream xÚÕ–TÕgÇßÏó|¿÷¢!^A‡Cï"’’ sê‡Î¦9Âe茉"rJäNÔét‰2ç ÙlFFæÖ"ç–»c†Î–ÁQS'n¦nö[¶üUJËÄ<îíó¼/îNýÛ9}ïy^Ïç×óû×…‹*äÌ+/¢'îK«¤;æ-[â_4½Úù" û–”'}"wŠ­vÁÂ¥5ÛÌF@Í.›_\r>.'p$_(Cì;êàúE\V¾dyï%²›g[]X1¯÷à¸èù¢Ç”/ÆôTO‰^(ºQqùü¶kEt— +*—„ßÀ³¢×‰>4¸x~°è•‘ÛEo–â±bS°ã±#ò Nò´ü¬­Ç0ëõŒÇ ´ H]F£Ú„•Ž âƒhÄ!IÙHÇÓ 18‰=8©gã¨h¥ÈÔ·K> IT½Ö:KÑ¢6£EÇéñê5lÕõj5¶a:©y …fÊ‘¥·£Èùº^ç*õKXª|¨D‘ž §õШs®#Û„Ùx!4˜r}Á[„âÝz]­æFçÓÜÔ¸µè+3|¶¬È@÷ Ô^ŸiP;nÍ{D_бžI(q/«vuÃ3“¢Ý¨V-žQ§:=YjŸg´'NJTË<î[¹nuk‘‘ãõ¸ŽÑ Ãý¾NùbI(çË…þÃ3éÃÿMõû¼þòC½Vø÷D"ù…N’;3äÞ2)1!'eÐÙÿæ<›>|J~¡òNÌë®vâœ<1N/Ñjbûļt»k5JÛR÷e9^$æôpàQ1®v0¢µ­5¾S­§Z3úú¤úJtVš¤ÎsáÍÞ¸W{ÒÀP¨¶:±:MêHȉÑQã@9¾S¤|çå pb;§š]jkÄ›H£œ×SîP¶™Œ%¹ipUŒmJ’†OÖ1 è'ô!Fb’Dê Gõ€W$±ÆKž y)ãYÁE‰ì…¾®œÛ1Ö'ð½ßÑÕ]ï”tÅw¦«£+S:•0’<ƒüèãCÀŸè2è.ô달‘ÙNêÍš §rãÍKNâ«?„/†ŸT«TÕÿ@ÆîŽóáf•sþ“F}tQ¸iQøî¢.µê@ÅÁpóyq‰Î Óª«£Þ}¤÷Ø;4û5¿usÅ­<Ò(³Jfr{Dï–që»êå~™Þq³-fͧž[ŸqŽ¡Ô)A¡ìй¢ß%wÚNF<GΠæ,æÈüÂ{‘¾hoâ»ëòÈ¡`´û˜0lúŠò¹ í^à~ÍÞwÿá3Ñ,7¢«”‹0ŒrHƒ'„š²"a‰&»ÈNò&ù yƒü'yì ¯‘ÿ ¯’'?&ÿF¶“WÈËä_ÙË¿P¾$/H‰ì‡KÔ¬lpòyòùgò#òOäYòCòdù{òwäoÉß§Éð¤ìCWòA¢ í„È~Mùx7­å=Êï’­äQ¾Cùy˜DNçJPÎ'$§‘_"§’SÈÉ‘?JOïgý“hÉ㉾ò2—ÌáhÆS¾—GŽ%Ç÷£¥´‘=gålòód9’Ì›AåäçÈtr8& ‡Qþ,™FEª´áJnµTîÐ!”SÈÁè-$¯…‘d³0@»_æÈÈÿ6?€–dÊw’I¹Ñ}py;ÛîϨDò6²_7}2;}ÑGZt%·¶yƒ¦ˆ–Àã»}ñ> endobj 294 0 obj [ 744 549 ] endobj 24 0 obj << /Type /Font /Subtype /TrueType /BaseFont /RBNCJB+Symbol /FontDescriptor 293 0 R /Widths 294 0 R /FirstChar 33 /LastChar 34 >> endobj 295 0 obj << /Length 296 0 R /Length1 5388 /Filter /FlateDecode >> stream xÚÍW}TT×µßûÜùbàÊð5 ˆÜ¯80AD*ÑfÐ4~DÃÔDQD@)Ÿ5ÑDHPkSm•eMjž5Wj†&iLk–McšDÓšå‹/®†41Ijͧ•ûö¹CŒvùþxÿ½»×Ù¿³ÏÙçì¯sÏÜ€Øxê›k[Á[hä 5[}G»ýÙ>ù,õôiK[—5oþç¾ ±SËVv.ýâŸ/þÀt 56Ô.ùðDI€¹‘&6Ò@Ì~Ý$÷’<¦±¹}­ùWPN2éƒieK}-œ…|’¹=CsíÚVS>;FòÛ$ÛWÕ67”ìxb!É×H–[[Ö´«§¡ ÚFrFëê†Ö¡«¶¿“ìˆz•Æx<<"5€F>¢o„4j5›p RÔóÔÞçm¨Z½¡oÇÐkê!6pG=ù°†? è ™E°‹Á‡U Ò®õð9ÞKá(|ÝÌ Íà!m7L ýÒ`>œ,W‡ÀÐ=p˜ææ@ú¦z‰¬å‘µØ;0úGa.âJŠV‚RXGà[£× Ý*ïhìò½´ÝýP€ÙC‰DóCPV»¡ÑFÀ5|¡TÙë ¥È^mNpúj—„fÏ©òyG:wNËêåºÈ¥¡Øìáå|TçV‘mwÎrî?tÇ,‘—t‡=Pä½ÚšªP± ·—J–½¡äuؾ¿ëù»e2Äœåµ ]唚îé1È¥ÚÇHª˜g§mÙÖ@U·"Nh¾G¢h}|$¸ÂŠ’K寮AÊ9Ì­RR=©>¹ÖÁì*%Å“¢ îœÛÆÉJÊ€»Ä]Âq²Ã¶1‚>?{2ZÓ;u‰°bîͼ ·$ûÉͽ^3"“¯“8k˜]õ“HžR”ËCQeÁ.ËhUHï´Èö®/€ %_ùäö‘ÚáƒÓòð./çÍAóÃ}í· #è÷ß°%ž4½A¢#«3J˜õ:IXj”Á(!¤˜¢Âì®ãŽe³mÙÙ³®ϼQ<ËòeñLËb˜Z|£˜·¼qâq™Ôœú˧¯?¥oüvïiá¿2è[ ó’,8éY—dgÑÖèdeJ6d2S¬)ÉÖ kæXëØäjkuòrëòäÆŒÆÌ'­O&?c}&yÀ:lµ˜¤¤‘™‚53UNHΡÒ³&ÑÉé¦Ér\azÒDÙ‘*S‹3 )K'šÀ.¡äY™Ö$óÈT—%.ÌjO¸¢FË.fÁ>רÜ3׊o R$ZÅÅS¯,œ_Ÿ\„qñEÙÙÙ`).~›÷‹æÃ…m°°p Äågd8â¦à„ñÖ¤¸Dkr’£@ÎÌG†G“ rJð±©Ý÷uìË-’ ³Fئ´e%äsËu wç™Æß8Y9oûSC‰¾ì˜¼¼èŒ2ü¼\žZãݲŒè<о̴çbÖŒOÇhÒä“×;o¢c¸ŠQßés4Àÿ\„¡§†~düòæÌw3S·†¯¦¯¢³Ã¶ý¢è{Á@= Q&€ñ#ü#ɨiÄïc€8€Ù’²¥Ù÷.onXã.mY¹„¯×u-ÿÞ¼ÃÃç+~½Ó°ÓȒ¬[™&%†YAB˜m'ˆ³G ¨XXÂlAl˜m%fˆaöAL˜m!ˆ³Íæ0ÛD@õAS˜m$0†ÙC˜­'ЇÙèÂlNfk 0"Iž¤iÒ{~|ÃvÚ qgwŽÁ%¹,HÑ[ˆ[XEr€Õ“¬²%Ä?Óø›šÆ¬øK¬–ø1G4wh¼…-%~õïaËhIÓ–Ø2Mž’h–g  D<¥ñ#7zÛÄ3mâoÚħÛÄMmâä6qb›XbÆ·è÷MÄ>7h<Ã](.; E¹«|Hj"ÎÐxšÆ“=‰q0 ¾Ä`@\ÇÄ+vÑ+*âCߢñuoÔø\»4ç‰ËßÉ÷g‰?Íë²ÄIYâóKŸ`"š=#úÅ÷ûÅÌ~1½_ì)þ†NP,ŽPb!jÿˆ4›>r•Æo”Áµ\UjF|¦Ô8 >Uj2¤’üÔ˜(?øÔà¿B¯ŽË±‰q|›4ù¸ÐIøŽâzž–ŸÀ_"ð¶âª&xSqe¼®¸F¼?(®t‚W¿àeÅŸApRñßEð’âÏ%x^ñׄÿ Ás8®¸W(Š{³ô†ÀÍŽùMJM >¨Ô¤lPj&¬Wj&I%n|z5Û‡cXCò>Â6B[+ôhó-УͯÂ&Mn&äó+°IËÅrúÄ×-£˜9Ö+®df‘âÊ!(þ<‚*Å?W*q>øµÍî¿æá<ðk‹f+î#¤vâ$ÿgû_©¸_—J¢°r‘¯òƒSÓž®8÷“vÞpUr‡«áŽ ›<ç8u—®¸ò¤O\fé·,ïyž{çHÞ$sÅIgýñÒëÎAé·ß×ì—Nºê¤—è€ó„uè‰•Žºò¥_ùc¤#þ•Ò3~>– ýŒÖìóï–~Lëw­”ºœ‘ñ-žTi3’hŸÕî4©ÕÆ}'¤wÔœK]Ejr’s'¤ÎÝR£3l"wë{ =ÑÒýäKµ?Gšïç²Y2\’À\üžZ¹ØVGî°¶ÈÅÖ¹µZ"wØ¢Èuµ(r¿-Ž\e‹ŽO“¦åÒv'¤2ÿhén²tD‘й³ŠTä×ÌOp‡yÒÆõò¤H9î,Iò›¥ù}ÆûŒ?0ów3Œã(cš1Ño²˜F˜bLf“Éd0éL̦İzÉ3†ÿ$, :ÎuŒsù)ahb0£ÄƺÀÄ¥¶ÚÃÔ¶PÛDm#µõÔÖQ[K­ƒZ—zé8_=ÀºØú~K¤»ž­\Ƕ ÷¶±µÃ½µ¬Cë… ¹M¾Fuk·Y;¦Ú¦ÆO‰+*÷Þ‡yö÷í[p'Ý[º8*ô“ŠyU¡ÿçuT "4–j°‰,ßç`U¸šMôÍåã¸Ú µJM zY©A RFC/Wƒ^a´¦¶«õõôú¼}½½šŠ~/ôh*=ú½šÊ‘ÈN.2@;y8šÁ .MÍe0s5:š6‡6óx4­”XlâZØ”«mfÕì9¤âwr•¾l')ô9³µéÌï§Ýmº)2ݱßÏçF–;"óšÏþÿô4”þ_Wï¾´ýÿ«”} Ô‚¡îú7´©ÎnïÛ~iø?DF°®¾‘cmCè’Üà m—½ö¾îCw˜>ħ»eoòÝ[ÕwÈÓàUº=ÝÚ?Œã³VîºÍÖö›¶*Þa³ƒ|³JnkÖ®;LïâÓ³¸­]ÜÖ.nk–g–fË·|^éš[ž¶·G:wNÃz×ÿGweÅ endstream endobj 296 0 obj 3665 endobj 297 0 obj << /Type /FontDescriptor /Ascent 750 /CapHeight 0 /Descent -250 /Flags 32 /FontBBox [ 16 0 757 676 ] /FontName /PYACJB+Times-Bold /ItalicAngle 0 /StemV 0 /MaxWidth 1000 /FontFile2 295 0 R >> endobj 298 0 obj [ 556 ] endobj 81 0 obj << /Type /Font /Subtype /TrueType /BaseFont /PYACJB+Times-Bold /FontDescriptor 297 0 R /Widths 298 0 R /FirstChar 104 /LastChar 104 /Encoding /MacRomanEncoding >> endobj 299 0 obj << /Length 300 0 R /Length1 6628 /Filter /FlateDecode >> stream xÚ­8 tÕ•÷½™ÑH¶%d[’eË#y$KX¶œÄŽ;þŒm)Nl“;à`ÇqpBBBHqS“`CŽZþ´¡e»tùÄd"²TÞ44[¼4 PØ–Ão·†r(nKO e‰5{gäØÓîÙž³3zï¾ûî}÷Ýß{óž€@ìäþM}[`!ü{ÎaÙÑ?´ÍóÚ[; ®~Ý–›6]÷»8°€QnÚ¸sÝçÇ?hH«à»úÖþöaù$€õn_9ˆ–2ŸDÜ7¸iÛG îDüCÄ7÷÷î`‡lˆ‚eSߎ-Æfú=ÄÄ=·ômø—ý?|ñ9ˆû·l¾mTÂ4â]ˆ‡·lØòË?mç?ˆó¯Â>š=šE؈°æÎö|ý¡ð÷<Œ^³ƒÊqÛ°Z.nd1›À ¾‰mT?I®R“\”&ŸRÿƒÉGîÌ–Ôã…§à>øì€=ؾ„bX„3>íÐ SD†9¨íwáò}Nh›É{8ÇÓ0/#Ÿ¢ð ر- áø"hFÞ†·  ®‡p ÎÀ(»:aLÒqõUôÉCpü˜eÔJ £O7Á~8¤R¨CI{áN"‘ÛÔièÁwêõmøø¥ú*ÚÅCš®c-r.ÙŽ) 2A[@@}æ@δG'FÚ¢nÅQYP24ÂbèB½wÃÝðjö¼IVÓm̸QOªZÞùp|jQ‘»¶Â6œáAx&às²’ZTŸú˜:¡¾¤þA!nqL´¡Ü¸ ¡ÜZü+xß)ø€d…¤‘tòy‰¼F£L)s€‰³'ª|ôL­)F­«0÷WÀ p#ôáÌ÷À?Â8êø|FœÄG*H„F¦á"ü.Á j‘A|sH>¾~RŠ^«Ç¨vedˆ “½dÙO¡Ž‡Éqr‚ü=ÙB»hÝCÒŸÐWèkô-ú!ý˜þ™11nÆ‹>>ö°«Ø#œ…»‘ÛÍíåŽ*g.&«’×%W'‡’çU^µ¨ÅêºG}TM`Tÿ¨{Ò™à #¨^ KñíÀLë5ÐëàfŒÍôæƒèÏOÂŒÓ1—~ŽÖ½‚Q>@Ëþ _À $qC`ÑϹ˜ÏÅdZÔ‚-'+H¹¬&7’udÜJv‘Ýh㾇ȷÑÊÇÈQrŒ¼@>"Ég^ŽfP+õÐŒL ]oæÁ&º› ß¡÷ÓGè÷éè?Q…§gÑ¿§I&±0~¦ ß(s5³”écne1?d~Ä<Íœc.0ÓÌ%f†™a+Øjöv7{û3öM|ÿÈY¹2n·‚[ËÝÌÝÂr÷sã\œ{›ûÂPiPx‰ïäïàòòãð(¼ãJûêsrþÏ;ÛwázžFá=øz`]€kg.y:ØU0‰»O>ý/úù9fVô“£`ǽŽrmàÆâdÄu êo°àž¬~”Ä/FKžTß` Púõ n/ÆpW¼ WÄyø5‘¥¸ÜÈT`þ®ÅwvyÞÜ9eáÒ’PñUÁ@‘ß'z=b;?Ï•ëtØs²³lV!ÓbÎHO3yÇ2”@ITZÔëQŠz¶HZ¼¸TÃ¥>ìèûJG¯âÁ®E_çQ<½:›çëœ2r®ûœrŠS¾ÂIO-Ô––x¢’G9‘< ²jY¶ï‰HÝeZo·ëm¶HG̈x½8ÂuF< éõD•ECƒ£ÑÞÊ›¨ÿýïÒJK`Âj¯O×$+ÐÜ·gЉ@ãˆ*.)Ur¥ˆNcüѾµJDz®h$Ïëí.-QHs¿´F©IÉ Í×%+|³bhFÑžõš0æ9Vrjôî„kzCk¥µ}7t)L_·6…5¤8¤ˆâØ5åü½ÜŠÞ=K|‰ õ/ê]„®[œB{5¬ïnÄÚ®õ L:ÒÝ¥ìÑÔÕTO1 EµžÞ Å$5Iƒ£zÑç®Q:wzã.—<¡â‡-ê]Þ%y•†<©»/’,F;w>›+{r¿N)-™p/ô¢Ë&JK5¸ÐëNÁßîKõ¿z*]ç›|a[ç¯Mi Z¡xú=¨@—„¦,Ъ0Ú¿Ùðé&è„õŠ©¹wT¨Ñ|ÊùÉ3ú)`¥é¿ÞÓ7Ûcð Ÿ‚ÖÔ‚}%a~¹­„BJq1Æã3€aBÕêõŽù¥%CJž´Eð(yè*è@?öu×”¡ß½^-dc Ö ¢ì]Ö•Â=°&/rY¨[¡½åÔeJÎ ²÷2åÊð^ ³ñ¸~(ÊQŒEW~™‚=+:X£ûÿBÐé@µõnðÌ£}õšdËG3D)IÐb9‹a ÍÀG ä)åØnSr‚lgH¸X;S»ëö™Zh¨fÅjîÉêµ°d*_Ôp þët‚9}i¶CõõMfçòÃ~9h´íÑœ'í¬ÝåpÛs,Ùî³)Ïear‚Äà7¹òò<6³ÙâOWe—hÏ¡¦ hâêèpa®¹(hÌæ¢´8C!¡–”…jCÂ)²ôbûÌ4L£BÓ,áÐa¬¶êêÕQm­v‚0M„S©zîÒS‰;’!'Ûa/ŸWUY…_ÉùEùÞ áo ‹æWT–—ÓœqN®M¸ŒŒ…k¨±³ÎõZÅÂõÇ¿ùWÍ”EK(++èla UçJ¯7½¬gÆ4Ñõè7䊌ÀfÜMy´;•óøüEŽ•é+M÷9w¼˜o”Í{oÎË  ºþxzz«- r…l|Ük2qf£É”Åg˲q-,—FÁåÎ3fÙl—å±±ërËºÓ Üe箸ãÏ…„P8 3µ Æc­æ‰ê²ÉÉI"\(sÕM»œ…¡ e΋=®º—SóºQhàY^&PUQ"=‘“mwäxw_ï¯Ï%W}üЀ´‚m^åãV oMN¥q¦Ö3Š—ÏòÞÀV·çÉÂdœkYÝs‰óºŽZâ;â>â=RxÄwÂ}Â{¢ð„ïeûÇçY÷YïÙ³¾3þ׋_½_ü~èsÉc’H~¾»´4vÎÂpž X±.³Ì²LÉçÌË•œ™ÑAV»ä0n!ƒA^2¶™I¦Ù”|bi8ß*ä—É77Ó*¶°ÎÃå#ÚP@8Ï*°38†² ¤‰Ut½kîœL¡ ?zçÐçÄjsTkéÒÖD&Ý.²`0†zƒhAÀŸ––6ÌILMÄ03?]"Ÿ¦r³'„3ãžI#ŽÖ*Áx¹‰‘ºó婌åçדªzRî`¾’Àœ-•Ô Á4„I€gò‰L™òåÕܦúÅþ ÔB¶·'/ŒH^ûU¢ÜßX©vÔy{n`Oš¬¦õò™u¥]Z?äsf0……l׻ɾUœ×’óÛÃw_IÞ«Çׯ~ļÎÜ2±ÊOp‚†`À_S]yÕ†º‡O&g/.üuàµê7f²ul} ¿²v~]KCwúʺíl÷椧WšªœÄ^ÇÊO°%è.I'u^[úæ4)½-³|^›Ø Õ>kufPxƒK‚Må󿉶wAƒÕ&Ë"Þ=Iu•=“—1B¾æ’ôˆ{­{¿›qû "k ö°-Mî¡  )д¸±lèœS[,€‹fOnk“7tºçtóJ§/Çpr·gh6ˆC¸‚Î9]Zø´¨ë$Ÿ ®ÓÂ9ÐÉu.$Ï™›ŠT– «Ø .´òyÚ‘ÈÀ3‚ ¬|FëÊ®Suyoàq;òÛyïœ ‡¥±Êó¬ŽìêŒm-ñÔ¥÷±iÁiwwÎél+làØá4ÞánÛÚ_×D7,õf¹½ -LKã,—ì¨$ðR±ÊϵdðŒÏIJ|á1Ÿg9!6¿¿ÈïI ËÈ}Ø—µË[-)S & .*-1€AL÷¥!,”›«ìÕEð|Y¸ì­ÏN_œžFçA>µC3=ÎZáâ4þt'Wk;únϤ¾ÌlúJµœ$<ý1çˆpFÛÄLè_»ˆWYm µM|žæi©0PTFÂD‹C€xµºÊ˘fŽÊ~yn½¦0WòC.¿ïÖeá—oç¶@^¡ÛN‡“¯G¢n¯Œ7Î3²Ù&Êî`Zš…_è½a©²WHËŽxÝø]¥_ÌYbœÖ׃þØãß Ü˜Yû)!F?5ñÅÎËPV»ñË‹§p0]ùgCûG’Ø0Bò‡É#F—(UïùÊ9ßÀþFfîQ?aoƒÍÌ=Ïø7Þ€oÿqRA}LsdVÞº ° ŽóøÉCˆÃ6;³A;ÿ¯ìèlnm -_¿ià¶Ò%Ûú6®ïŸý‡EýË üÕ›‡K)Þ¹—êw;ø ýÉ€ZéýñŽj1Aï“Cc†O/_BÇ·ŽÑÃ[Ñqq¼†×ÐqÏx=ì9ÜA4ölM…˜“ cñ1;AGd%è]l z5A ôN™ :‚À’ û˜tü”Þ =A¿…¿§{˜ô›Œ :Œ€OÐ= z;.Aw#`t&Aw"@ev À³Ðv Cr&BB˜ˆvÁ5ÊÙ´ŽÜ[ÀL6èõõz}­^gëµ ×ìñ-æÍ[Ìiä0ˆøKzݯ×Y²eÐü‡AóÔ ù¥Aó¿ šŸ'ƒÐŽ·^srv»ù|»Yi7¶›kÛÍóÚÍÅ효?A+Ò§ôګײ£ÕüY«ùõVó+­æñVs«¹¢Õìo5'È¿ËÖóÛ#æ'GÌE#fiÄìÁÞgŽg¶e‚éÞÛPÀ…xG‰øòxÐJ‘ükÜsBlÌ%§ †Õðçgáˆ:|š‰áQX®Ã§!`Ôú{ãóÅYï¨CpC¼c‚UñŽÕºãkpŠë C²<î™­¤<ºÈ¥³S´ÃÕàÕŸF¸8.Þ„£#ñæ5b£‰4B³ÎV3¯D˜¯)Þh&9³b¬³Z°htóqñ¼8]“ +ãâG(Çß_ž`I\|7 OËéâ;)ñ\ǽâÙŽÅîŸ-Çî¸øÓyN|F|T|" ÷<Ð…N±}Ï“0"x Å}Py_0AyNüNà¼8¬M‰Ò÷ €]Áóâ-ÍúÜ›RঠŽFêºà”¸Fü–ØÐÇ_ãÑ©W/×ç^Rs^l êò¡ ä91ê9/6õ‰eQ'4¤°ª”ØÊV.êÒæŽée)KJÑÄ’åºî!TÓ/gŠ>q«èm¾I\!šDSìÙ‡—–«ùØ÷ùØ^>v»™màc+ùØb>¶€…ùX!+à³6£€gù cšÑh4Y#Åu‘Pß“‹µ&Û hÀÀj5«·ªÕ4µEQb¤ÐÚ褣`¤±Ü‰e?–;°ìÅ2Œåv,»°ìÀ2„eT}ïYmô¥·RÍÛé®ÙÎ]ôÎÙÖtÇlkÒ[¸ˆŸÕæDoHuD!÷(†ƒxESÈ¡</€‡ºvûPƒ³ÁVo­^ù+UïlúòqþÝB_}H[ÇΟbšþ]/’Ÿêõ±çxñe^<Âëm×"CLgˆé 1!ö2›epº•Ú®íRžrw+ó´†êînSÂÚ]~‚6кhd‚Ök »kÞ¡ ÑN­Þ‰t#Û* wídƒ y D •yJgëO±yh½ÆÖ¡d£ÛÁ£³yèvmJc;¶µ&9VS£³°'a«Î²•=ù–±¯³Œé,c³,y:K €,ÍåXaŽ u²ïKòò9œ"‡urÕ—ä`ŠÜ’"· 9ôÿø 4ý=ÜÑõ×6ÙñˆãÔoj|†bš^ú[2n›}° ðß[¶L endstream endobj 300 0 obj 4771 endobj 301 0 obj << /Type /FontDescriptor /Ascent 750 /CapHeight 0 /Descent -250 /Flags 96 /FontBBox [ -10 -82 768 682 ] /FontName /VPRCJB+Times-Italic /ItalicAngle -15 /StemV 0 /MaxWidth 1000 /FontFile2 299 0 R >> endobj 302 0 obj [ 444 611 611 611 611 611 611 611 611 611 556 611 611 611 611 611 611 611 611 611 611 611 611 611 611 611 611 611 611 611 611 611 611 444 611 611 500 611 611 611 611 611 611 611 611 611 611 611 389 ] endobj 134 0 obj << /Type /Font /Subtype /TrueType /BaseFont /VPRCJB+Times-Italic /FontDescriptor 301 0 R /Widths 302 0 R /FirstChar 74 /LastChar 122 /Encoding /MacRomanEncoding >> endobj 303 0 obj << /Length 304 0 R /Length1 5648 /Filter /FlateDecode >> stream xÚÍW{XT×µ_kŸyñ82¼fÎŒ‡œa‚(ˆV¢œAGD|1•‡(Š((ÅÇFM4ÔÚFc[%ÖäšZu8Rš¤1©Ö¤šÛ˜Ï¿ª‰¦!I­yZ9w3\£÷óþqÿ»g}{ýöÚ{í½^ûì9Ѱ8êšjša´ÓÈjéum­öC?~îõ¿ЧÌo^дþŸ»z ÑìĂūæW$¦4˜Î’¼³¡¾fÞ'ÇŠÆD5К‘ 4½[÷,É]ê~ M­+cXHò Õêâ¥u5pבLëÁÔT³²Ù”Ï“üÉö%5Mõå[v”ü-ÉbóÒå­Êð>-M!9«yY}sÿ ÛßIöD¼Ecj°)Ÿê[õ­TÜRH¥f£•ñ÷\µOû‹éF§¹þW•÷¹4òl “23œéâ‡]HKMœœd³ZâãbÍ1ƒøè¨È“Ñ ×q !Û'–TÛƒÕA]†8q¢G•Ũ¹k :h§¡’{u‚öjMÍ~¯¦Dšóÿ‡¦Ö”îh¢Ù^…žl»O´ßöŠöΚRIýg¼bÀìÓú“µþV­ÏSßá vŸ­ÁkbµÝ,ikh÷U{i»^‰ÂŽôdS¢A‚(uã Œ¯YÓ`#P5|ÁdÑë &‰^mŽsújæžRéóv8žì ޝkƒ cÜËÕuvR­¨$Ûžì…ªÿÐ=Oœ×’ ¶ZíÕTU¹š@U«6bÝA«è ZW_µý þwÏ÷ô]“Aæ,©©o/¡ÔtL ‹ÕªTó4I¥Sí´-Û¨ âÆ@Ø Í÷põ¢O©^dFˆÅbCû¢jÊ9TTÊÉR²O¬ñ‚ðp¥œ$%i‚'»×¶vŒƒ’Òë)ò©8Æa[ÆO¿wmáÌÉÍÅ Z:óà¹þ¾Y±¶àùÔÆmI/ùëéç¯Õ$ÞþX÷üí¾›»ÿÆÉþþ>)¯UwQòD W¿®:/ŜǥՉQ‰ve‰²²K„ÕaÈL²$Y-–Ì¡–¡ÖY–YÖ…–…Ö†Œ†Ìç,ÏY_²¼díµôZ-f“88“³d&‹ñÖ à -kLºNL3c ÒGŠŽd‘Zl$g²t¼ ì”?oÌÊ´$FNv™cC¬æ¨+bˆèÒqj‚\C)A…·¯Põ´ÚŽë›­¥Èª¥Èívƒ¹°ðÏZº´dµÀ삱˜¯åÄ;G ·$Æ&X¬‰Ž|m8SËaxÄ1*?»Ÿ×1³mWNA¿P5È6!¿%« ?>טS¢‹0×4üöñ²©›_èOð¹£ss£2Æã—%â¸Ú¸ÛŽÏˆÊíË4üZ´†Í)ü ѤÉÇ{o­ºƒå²vr"î|µ _ý<†þúbüúžïYõá £Á©["5‡ö­zË4-޾d ôd Ój&Ê0^Ã?‘ŒÚÎq{  ¢¸|ü¤b÷´…MõË=ÅKÏ#gÔ•Ð÷{8j>(ýíVÃV#K ±y‚bíñ!¶™ .Äž" ‚=I`±M1!¶‘`Pˆ=AÀ‡ØãÑ!¶ *ÄÖD†Ø:zA#0…ØZcˆ­!0„Ø£úû7]ˆ­& s°Š€…ØJ K@’”8AøÈïøÑîB{n àÖtÜR”ê)z3q3«¥H÷°:’6ø?«i¼ÃꉿÆjˆÖxXs‹Æ—²ùÄ¢þClí"hÚ[ £I*ŠbyxZ€Ç? q£”Пiá׿ØÂ¯káÇ´ð#[ø¢H|—~×yìÖx½Æ3¤¨~ßVÀ‹ªÊ'ôÊã$§hÜ*%ø+þõ¿'ÀWø>=ÀY°^S×ø¯ÖxƒÆ+4îÒx¬›ÅÅïÎâžÅ×fñ£²ø—1†>=yŒ”õð—{øÌ>­‡ïÌÿŽNP ’c ¢ÿ„4›6x‰Âïä*ÁÍ0Ü«R ¾«œŸËUBQ~ U&Ê^…*œAø7èÒ©òEld*~ˆš|\è$ü@v½LËχáý0üYvÍ"8+»²Þ–]CN‡áMÙ•FpRöÛ ^—ýÇeÿ¯Éþ‚—e-AHö_!8†#²g1,{Ö ¯`<ì™_'W%ÑècrU Á¹j$Á£rÕ(¡Èƒ+ Kó±u †å$ï"l!Tck†Nm~)tjóK°Q“›ÕùEبåb!ý7T×- ˜U¬“]“ÈÌÙ•Mý¹•²¿B(âq:øµÍ¦_óp*øµEËž¤öì¹BþOð¿Lö¼-E`)ä ºÊNM{¢ìÜMÚ¹Uɨ†g 7y®âP´ªd‚K3ê$U=1\‡!²k;CvM °Ë®¡©áØÂ™·È~5–x5»¯ <Úú()ì_%ßU¥ ßv]¾¡v³W=²ðW’UøÒuEøÜ5\èså Ÿ¹"…«Q8ßù²ê œ# {¢pÎ+¼çÞv^NÐyûCÕnḫVxÈa)¤C)F8èÊ~ãø /ùÕ±xá´f—»ðSZ÷Œk±Ðî o’…õtHVÐ>Ë<)B³'„»Ž K=ùBSue¡ÑIÎ9· Ήܭë 1”¢„GÈ—Yþlaº_•#£Á%pÌ¥ÞSËÃÛ²ð־ؚ÷ÖÒð6'|]Í ßosÃWÙœ#„ 9´ÝQa¼ˆð Y: …ª³²0Ú¯™á ©IÖ¥&-_Èöd ‚?R˜Þmœiü‘1ߘg|À˜atS)ÆSœÉldŠ6EšL&ƒIgb&0%„”KRºú{`0«`Щ\ÇTÎÂ?A M &ÙX;˜ØSÔ6Q{‚Új먭¥ö(µÕÔVRk£Ö®\:¢®îeíìÑs¸û([=0¸šmèmb+z+Y›Ö ª6 »'A•A|Æfig76vt‰÷>¬z€»xlÿÛ‚ûéÞÕÅÔà³¥S+ƒ¿N ‡«%5Pª~b÷²‘,Ïçíeù**{qé«PÇq™7@ješt±|Rƒ*H]ªtqC4µÍªZwg—ÏÛÝÕ¥©èwB§¦Ò©ß©©ïä"´“¤©"Á¥©¹ ‘ª MA¢Í$IÓJŠÁFU “b´Í,š=§“TüNU¥Ûí$…n§[›ÎüaÚãЦÃÓaøÃ|Nx¹#<ï y÷ÿ§§¾øÿºâHÇ¥ÍûÔ¿HÕ¢¯žZu°£þ®«µÛ»7_øï”Q][× bM}ð’Xï n½öîŽ}÷™Þ§NwˆÞnØç›VÙ½Oª÷ÊR‡öÏêHùÞ²m÷ØÚ|ÇVÙÞûl¶WݬLµU¾í>ÓÛÔérÕÖ6ÕÖ6ÕV¹T®Ùò-œZ¼ü®çÇ­­áÎýÓ°œÞõÿév¨• endstream endobj 304 0 obj 3892 endobj 305 0 obj << /Type /FontDescriptor /Ascent 750 /CapHeight 0 /Descent -250 /Flags 32 /FontBBox [ 16 -15 757 676 ] /FontName /RBNCJB+Times-Bold /ItalicAngle 0 /StemV 0 /MaxWidth 1000 /FontFile2 303 0 R >> endobj 306 0 obj [ 556 778 778 778 778 778 556 ] endobj 27 0 obj << /Type /Font /Subtype /TrueType /BaseFont /RBNCJB+Times-Bold /FontDescriptor 305 0 R /Widths 306 0 R /FirstChar 98 /LastChar 104 /Encoding /MacRomanEncoding >> endobj 307 0 obj << /Length 308 0 R /Length1 4364 /Filter /FlateDecode >> stream xÚÕ—}XTUÀßsϽw¸ ƒà "2#Ç(æ`j”F¨¬‚ "¹)21ø•¶bdæš™k±l²n_kö±5‘‘¹fòˆe‰f‰Öîê¶nd±K¬[àú(Ìì{^FŸvŸÝ÷yöÂùÝ÷ã|¾çœ{Î=4×’š 7Ä@!Z:1Å/Y]oY9·QFù2€Uí¾·¦ÂäÖ¸°m¿wźjsÒ®'P@®_¶´¢êR¸Ë „þìehÐÄΡîB=qYMýÚØç¤=¨W¡>jEí’ n‘‹Po@]«©Xë c Žu‚eeEÍÒ/âê¨{Qí®õÔûÞ‚¨ŸFÝá®[ê.)c@0ªAz11"¢ñmÅ· 2Z%¡‚–>8 “`‹´¦À}š]¬^ ª}Mrµò®Y˜\Á2¨,H‘dHë<ß™ZWgW§#2‘d°VË0èáæÁ¯|Mº°«ßÕ©)@;¡„í‘õR Öé ’ƒm¸ d­«Ëö:˜5Ë*ëgñýlÏ6js†¿O>‹ët¤Â’yN]k}¦ã*~AµÓϯ۹¼ä¾ñãæ.O4nò}þÆ9ŸïÚÑ“L’i­Q¼8N‹K †~T |ÄÄU¯uÝÒk}ïïÎÍuDÞŠs3 ã 'CÒRF§„NP&Mž0Ö¢ôÍõÕ`ÜbqmdC•kòx»Õ‰æý¸v—ý}‘]¶§vëÕ˜VK¢#ÑèM<’¨$ªÞtOŽ„¥qビ-™F ÏÌѺººµKç:: ¹e¾.¾>A¼\C®v\¬“á˜Æ–ÍMãMKŽI¬ e6s.X¼çÆ×S¬›Éœ—™?ãö¼‘e¦¸ÄxKLé-®;jÌ^cŸà|£qW[5»lvÏZ¶yáTk²5Õ™¼¨¸¸Âo¶Ä'--©X[ViÞð@óúÒñhó·âÙÖ¥Œ¥½ õù) ° ±!a’@Ãï[D‚©Aæ1£2 &ÀÄÑjÀw$¾c°ŒŠ2Ãó(s†BœvîÛ yyB;;04iCgaúV»040”Ž›5ÇÊ1Eª ˆÐÀj1é0`ŒÂ½’#'_ßæ=]ïqȦW~ã÷}ã{˜m`1,¦ÃñöÀ%ßæºt­U:±Ò×¶Ò7á©aÛÐQ{Ìwäº?þ^PÊüþ.éžð¼14ñyçúºo+~•Î*â,Vç,•QZ†Zðüç{ùúù M7=7|ªå*(Qô0ƒ÷C»†ë³jðK^)î0^eVÀÞ—&Ri<€g¶ã$¢ëBtßà¹Ì½4ÚP1v0mþìÛ:w]Meí ±Çéñ½*î ÿáÑý«šï—˜>àL&rx)‘̈ ~¢8D$^'^#^%þƒx…8@ì'~OüŽøwâeâ߈}Äo‰½Ä¿b÷8ü…äøªp½ô&d_“|‰ø±›ø%ñÏÄ‹Ä/ˆ$ž'þø{â?#žƒ‡q*øN@íS²}в Ÿ|:@aù˜äSÄNâ 8Žüˆä‰Ç‰ß§¾#¹ƒx”ØN|x˜ø.ññ·ÄƒðÜý:8¬ùOcûÂÂñvö6„¡çÞú„Ö€ž·ñ棢Mx8Ò…6aáðd ÷ãÙÏóýð&ÞÔœ˜ïM¼_p¤È×J-¼A}õÂëØ¢‚oa{×ájÔ„Mh¢¥×5GŠ^™(¿Le^"î#¾HuîÅ5Ïá×$¿@öç©õçÈòl ¾gñŽ*4QŸ°pø•ÛùÈ_âœph¡Ò»©µ§Iþ±Y¬cø9L@6‘å)â“TÃ.òþŒ¸“Ú|‚¼;p%sxœòl'ïcÄm4§?¥<[‰‚ø">꿌}ÛB–Gˆ›kg3ÜŠš9Þ¶¢ñ4RŽFš·‡h<›0~çѳ‰<›àz`#¶ª‡#E„7ÂO mÂÑ""Â"v«(¹¸¿"×úaÚy€r­#ËZââjõªüá}í:˜Ž%=ÕŽ÷g7ÍþýäqC-;›fßM}«…•0mµ4ûµÔ7aá°œÊ,#ÞK\J\B¼‡XN,#.".Äß b¯/$mõ³”äâ|â<âˆÅĹ4SsH."ÞM,$ÞEœEœI,ðÿ {z;Õ?ƒ,ÓhGßFòTb>ÑE£™Bò­ÄÉÄ<â$âDb.–æ¸æ„œCÌ$:‰Ät´qpœFO´mP€L%y1…8’± ßBK¦:†ä$b"„#ðÔàx¢4!­d·`Œ8þÞùãÈKò(¢9xÜBImÇP.1šh PÃèDA¶¨à[Ø"ñ,š‰Z$µhø ´…̱Œ(ʆÓî #K(QOA !ƒˆ:ÈBªøu¿]……Î(:‡8žt±D~ߊþ/ÆÑ/FkÖþ¦g0y1Á¤ÃÛʬÍÛ™'õò@êÿÝûO¥‘З endstream endobj 308 0 obj 2696 endobj 309 0 obj << /Type /FontDescriptor /Ascent 701 /CapHeight 0 /Descent -299 /Flags 4 /FontBBox [ -39 -177 605 711 ] /FontName /DWQCJB+Symbol /ItalicAngle 0 /StemV 0 /MaxWidth 1042 /FontFile2 307 0 R >> endobj 310 0 obj [ 744 247 549 631 494 439 ] endobj 100 0 obj << /Type /Font /Subtype /TrueType /BaseFont /DWQCJB+Symbol /FontDescriptor 309 0 R /Widths 310 0 R /FirstChar 33 /LastChar 38 >> endobj 311 0 obj << /Length 312 0 R /Length1 5760 /Filter /FlateDecode >> stream xÚÍW{xSU¶_kŸœœ4mÚ$-4 …“4MIÓ@”j‘Ó’PÂKyÚ`‘–R(”Ò˜J¹¢ ÒjaFt ŸƒÞ^$=t ƒƒ¼Š8ƒŸw¸ò uGtÆ‹O$ç®sRQïÇýãþwÏÊÞ¿½ö^{¯×>;û@l¤†–ú60Áê9MeLCÇ:ÇÓ?ûÕÓÔþ€Ï\Ö¶¼eóíÐØÉå«:—½òÍ¥>ÉsIMõK?<^y3@â»4g|u$í×=B ÌÄg7µ¬[Ÿò0´_¢j]ÕÚPiø 5%â -õëÛ ¥ìñS‰w¬®oiœµcÏ⛈wµµ®]§œƒˆˆø¼¶5m±Ïm'~ áUêCPýQ=Òƒ•ð.Ð ÷0ò  2©ˆTlܰÐj \TKl¡rogìuå=n-ä‹zJ`%<ãà-ŠÑiàá ¡ ƒÔRÑI#wÂb¬€ ÖPôìÐÿÀÛa†Ï ›¡$’öA1­— óá8a…ƒt@ôÀ!› =Ê[ÊÒ6Ž´µÂVØc¨}á<®RNU°úàÞ¢"9iš¬ó’7C¦ÁLZy!,†¥´âãð8ƒÊVåy(¾±PJv= Çȃ«XŒ\·FªˆÞ†?a2V)s•£Ê«¤'Êi­0VÄZÕì‘—~"uídÍcdÏIx˜„ p5vâ~ÅÂÜ1¥MÙOyqCiìƒçà%xÎÀ%’4b&Va žb‡¹Tn7·ŸïàŸV\ÊGdßd˜k)BÛáÉ¿ çá"|_“6´£ˆc±Kq:.$z0ŽmaO²Ãì2gà~ͽ¬KŠ]TþSù’¢’^Šq)­€ Ì ŸÕ®!ÚC±z^¤\½Jûü…èøu˜Š#IÓ(ÒãÄlÌÇj¢éäW ®ÁljÞÇKŒœbŒ p!n—t[ø¾SÉRJ”2¢'8Š|:E©&Â-Zæj)šMÐLšï‡-°âÚ(‹ð2Yðü>‡+p¾CyÈ3EÈ…y”•±8ž¨ % ‘%Óqåi>ÞN-ÄŸ7á.ü9'ú=¾„§ð¯x ?Ç«š•×Ñyu’î=ÝoçËø…ü/ù>}‚ð»kŸÄÇ2CéQö+g•ÁHoZ1Ì¢·` ùÐJ>¬£ódì&ÚCt€bù[ÚÉÇh½@9>Eô:ÑiøŠêû”½!¢¿Ó»L>~Mþ)ÆqR3j×2ZŽ·`€¼›KTƒËho´á]¸‘¨÷áŠüA¦<.Óuéöë~¯;Ã/òSù¾“߯?ÊáOógùKúlýaa‡°[¸DYY@¹)‡Ÿ>©´ÃzáYhbl€N„1t6­„#¸¾eòê.L¥\wRôüôÖ/Â{ÀÌÆ²_`åè7ütní‰_ÒYQFoìyz·B°‹Þœs0O²t*ަ“,U¹ 6åc~¿Ž’;FS±ÑÌÔásî2•cUtÒXì9åÏܲì>+忏³]YN‡8ftæ({†-}䈴T«Åœ’lJJ4&=¯ãBAÐ5¥ÎÉ©‹èr\S§úTÞUOõ?ꨋ8¨kÊOe"Ž:MÌñSI‰$—ýI).)]—D³£*|Ž Ëy#àrDqáìj?p…‘ËZ{¦ÖÞ©µMÔv:i‚#hk 8"XçF¦t4uë´Ü ú‡côP A‚DuáL®ßØd#P%‚»+Œd¸ÚçÖ/Ü6»&åt†}œÜàZWU$Å;<]ç Ñ95¤ÛW°Bµº“–º–vG%XR§¶êkk"\}8ÂêTo$݈¤oøÀöû}+øÐ#Ì=¥¾±k …¦{jœ­S¹ú‡ˆ›>×A˲-ášn ÇÐl{Ñè ª=u+‘W•«©keÅæÔÈvÉtÕ¸­FÎ24ÆW0h»çf'eÐWé«Tñf§íž8~x¼ÿí5¹“§Ï¹T5¹BdfÄÑ )q‘­Ôªqt5L 1zÂH^®ˆ$L®ë2ßD³"¼Ûìrt}”(×åO~ÚS?Ü£w›¿µ©¦óúŽ ñá¶ö_údúWOØJ)“׋´eu‚ȑ׉Çì zADÈ0$DYáQçòÛl^ï¬+3¯UÌ2Y1Ó|­&U\«P˸±Å§%—Š›¿têê|Ó·{Oqï}—C7 §r‘ßGwˆbÌN Sy»1+ÙeµZSGdسì®ôüŒÂO®¿Ü0>a‚}ŠaŠ}žaQÂBßòŒÎÂ3¶y,|dÔS†§ìǬÇR™ºœ –`4V[}¾oAÏè•™YmÍËϳgL=˜kÐk4z ÂÔ>âü…~¿`H0z 2ì£2ó’ Ñœšåæ‹ÆX\¬XïË÷p…‰’Ï?µ°º°Øhñ8ó²ó%¨ÊŸÚfÙd9ká,Õ–âìÒâÿß9i)ï˜è_dë(·¿f÷[Ë'ÚÏ[Ê­å¶GùÄóvLJ¯ ßµô kz¹À›;¼‹:Ì‚¹âûÆD¯Í\a0W˜Y…0ÑL O¡ÃöE8"G¤LO-N-ÉÉ-ÄÜRç=·`)uj=º8"T%ð#W>aoâG¢y´ß/(ŒMI»9]ñ8éöŽŒ½ä3ᛢؙœlw¤ˆKw%Lµâl¡yDf2_TĬö”\gln3Z ^»®¨HpßôÝiÖrm7‹-.5Å¯Ör¯‚,ð¨4o9¾{ËeùÆ0r¦£ŽéÕ„x¬ˆŒÍ!A ¾jAŸRm¬£E°X³¹Ò%%;Sì©B–“wê+ikYS·:gìÞWWìß°Ù‡hsͤ–Ýv¥bÈb-÷äI—;Þ±MºüqôC*åÛ ½Û6ž„x…p,*.ŽàJuŽÀñeãËŠ9ôàûüU^I2û2–ÿJ ©¤Ü;P•³àcè,ùî%>«8$Ïâ·^°þöüÐ┊/ ÿÂàÕÎëH»X{[¾—WQ1õ:±'b?¾¼>òýÃéËÁÍÓ-–{X#”Ð~«&ÅÑíIOw3=EØL” |„¯ÚÊÖáµôu˜S5kò´*ï¼-k}U­«–jwtõQÖC7Üèá¨,„E¿Û©ß)°QÖ-W‹iQÖEeÛ ¬Qö %ʶ˜£l+AJ”m!H޲LQv?AR”ÝGe› ŒQ¶‰€…{ Qve ôQv7eÿB ‹² \”u°([O€qˆ“FT‹ï‡ðÍ:<è(ÃaÜ™;*ý¬Ž¼7SmfKÈÓ¬x…-¥ú3­~K“x“5Rý<«§úˆVÇ%whu+[Fõ­Ô¾•-§UDMZdËe4H•‰¬OC;˜ð¤V÷iµ ¥µ›N·›ži7=ÙnÚÔnº¹Ý4¾ÝTiÄ3t—0a¿V7juŽ”Xf:Tfê(3¹ÊT‘éRlÂiZ©ÕéRZØ46½6›ê¦aSvØT9»èÓÁ„÷kõ}Z½A«›´zŽV{´Ú"YòLïæ™öç™Í3-É3MÈ3ÀºîšÐ(%˜.˜rLcL£LÏÐJÁd9ñ5¤Ñ1£V‹QüF®µ\‰Ãçríh‚ÏäZ7Á§rmŽX™ƒZÅ?€Z\@øWèÕ©üylf*þ›5þ=ð ›ð]Ùs‚¦Ÿ‹ÃŸãðŽìYHð–ìÉ#xCöd¼‡WdÏ‚—åƒàE9”Cð‚*$x^ù NÈ¡%Q94Dp<Geß*YömŸÅøX©ß$×fPï½rm&ÁF¹v<ÁÝrí±Ò‡wA¯fãºaÖ¿°Põ­ z´ñVèÑÆWc³Æ·ªã+±Y‹Å úUç-'ŸUl=ÓHͲ§€ ,‡ÆÔÈ¡9b¥ çCH[l„4 çBH›t›ìë#±[eßÙ?sØþ²ï ±2§ƒÕY!pkÒSe÷~’7œÿp6|ÃxÉróAÒ²’ M©›,Tå\ñÉ.n¦Mr­³Æ—)¶ù¢¸ï˜Øê+[üÔ”Åf7wL\éÞ-6¹£2·¡'ÊPJï [† Äù!•7Š‚Þ#rÌ£žSkãÛšøÖ?ØÚâ§Vkü »3~\Ý?ßDz;V‹Õ~Zî˜89”%N$M}²X¡+‹å!M}±/ªml¯´R±À—'Š!£8¿_¸]¸I(J„B!Gp £…L!Í`5˜ Ɇ$ƒÑ`0è :3€!-ª\²Õÿƒ4½Y½N­uL­Yü/ˆ¡Á´Jë{ÊV*P¹Ê&*÷P¹›Ê*ë©tPéR.Ug².v÷€9Þ¼›mîÜÀ¶·¶²õíõ¬CkE U„ýÓ ŠÊ–>lÙ1É6Éz‹¥|JàUÝpíýá±ýon$û£&ŽŽ<2}nMä_G‡#EjCžÉW¯õƒl<+ Y© ášA\ÃÆç¨ý¸&&±šô²RƒZHŒË‚^U z¹,Ml»*ÖßÓ ô÷öj"ü^èÑDzø½šH_|%) •$HLo&æÑU1Úš6ƒD‹I’&•‘‚ͪ6g¤h‹Ôô¹Ý$r«"ý^7 ô»½ÚpîÃ>§6ÜnŽëÀÆýñéÎø¸“ƽÿŸžÆªÿ댣ݶT?Ëê\ÁF*u‘îúòÜ´Äáèß~aø{-§nIC“Šõ‘ ®Æ@d»+àèï>xƒáƒêp·+ЃójúJ¹[êÖ¾æŽÎz|Æ®ŸèÚ~]׌Ço°Øãêb3T]³vÝ`x—:> endobj 314 0 obj [ 722 778 778 444 ] endobj 90 0 obj << /Type /Font /Subtype /TrueType /BaseFont /RBNCJB+Times-Bold /FontDescriptor 313 0 R /Widths 314 0 R /FirstChar 119 /LastChar 122 /Encoding /MacRomanEncoding >> endobj 315 0 obj << /Length 316 0 R /Length1 5300 /Filter /FlateDecode >> stream xÚÍW{XT×µ_kŸy1:2€Ñ3Ã8ˆ|€HCâ€3êÑ0†(ˆ(Š(%êÕDMÔ jMª5©òYãµµÆáHÍGcR­µÑæas½Í_CMCÒzÍÓȹ¿s†íçýãþwÏbíß^{¯½×kŸ=b"êMëH"EMyYèIŒœ;*œÏýøgÏ¡ßIdLYX·¨fýïî 2aHœX´tÕÂEÏ­—Èr‚ˆ‹«*Ë|üBA ‘Õ…1Uè½ÇðäI‡VÕ4¬Œû=Ýy)dËÒÚŠr:@Ù ›jÊWÖY²ÅÈk ;—•×Tl}êÈÏ@v×Õ®hPÿƒš!‡œV·¼²®ûŠãï/ÅÆ“‘ L´Z1VQ X;¤#”L¤ž¨q÷õº±†\ݯ«¤‘ØÀc<Ù´„¥‘ô&rs†Œô,)TÈAŒŸ $vaf.Íã| r Ù°kýƒï£…t˜>§fa¥òCÛG£±_ Í¢Sä¢Åj7…¨‘š¨…bn:µ¨oªam$¬ÕÒ&ÚÊCÐ?Lô>/UO‘L…´ŒÑy¾[=¨U–Æ2àÅ É4;Ï¡y´;î£_Ð[¼JݤžB„fØA9ðëC×x4¯’ ¥Ý˜)½Mæ>\¨ÎTª§a'ò°W˜m£]´Ÿž§.êæ,žÎ‡Õju¹ú£g¹¶Î Õ%°íË\¬ùOͽ¸4Gý4¿Lë•—–D¤òpD”i62"ÜÈ€Õ9~¿ï¿i2"<Ê+›& 5Í“bb™&•?©h¦ÛŠá’o ÇœÐ}EQéj#eKœ‘8w¡»ªiIrN3J”drÐ]GhZ‰2Ð?P|™އît!)¾_†wºÅðãGbãoï¥ë¸,šq#/¬Yr‡àfÄY¡qÃ×±ZS9–š*ÆB O˜åâHÜø²&û°*bôØÝΦ/…rw}zëHyψÉcÿ‚´®VÎ'ó=}ý·„L}ðû®Ý°þ£IÆ‘5˜e‰¬Fƒ,I"9Îd–™Zâ¢âŽ£®EÓS¯æO¹ž?Õþeþûõ|—=_ã‘#F'¸†=ÆË§®=k¬úv×)éÂwi°ã%’J¥Ód§zÚï"¼¼;Y&†[Ã,Ùâ­aqV«7‘Y«ÝÌVŠ3cl¢Ù?Ñ:‘¬ 愳Ý^`‰Kõ÷qÅ''™S]F—©®%&mroïñëjò]gÉpn zÉŽ«ù ‰yY4n\Wã;Žq]ï@ƒó6ß‘±yí ŠŒÁУs8Ídv'¹úñ˜Ü1¹£%öò¿ÿYzvñe÷ð?ª²ó\Ý{³¥<|†]Ùß½fLéî@d±ï'ºö«“uóâó¿`¶èòñŽk«nà÷ÙfŠû^_CukŸuÔýl÷OÌ_Þ˜ùþ¦<òHOh9Ä×ËØät® dÕNÈ̗øY×HìÙÇ„ŒÓ´pÁøÉ…÷.®©\á+¬]º@[¯?êJí»ð66/Èßl3m3‹~QѬL”ûFE )*¶£â1@BTlØ£b >*6úDÅ£[T<è½¢b=Àë8P,QñÀk¦¨X0FÅ¿ Q± EÅ*€ˆŠ•ŽIÉßo¢üAˆß±ÓËÎ\ÞæmCykA–(Côv´v1‘ìU±íçzû¦®ñ†¨DûŠ(G{Docš[õ¶V,D{ú÷ˆEØEÖµe±Ha‹¿ —Èæ3TO6>¡·‡ôÖìï[o;So{¡Þv Þ¶®Þvg½mL½­ÀÊoáwÈÆmz[©·iþ^¹¶ƒ¹¶Æ\›;WSùT6ž¬·)z;Àß7lë Û^ Ûö†meaÛì°mhØVП›ðÙiãGôvƒÞ®ÖÛ*½¡·^½Mð'¤ÛÞK·íI·=n›Ÿn›n{‘ãñ©dc«¿O»íÃvÛ°vÛv[û Û 8AñÜG‰§¸þ#cvÈ er”¿QJ€«1¸¢”|®”zŸ)¥irÁ@þ•ZþˆJy6ð¯ÔjÐä÷¹Zhø®Öå äeð=Åû"–ŸÁ»1xGñμ©xÓgo*àõüAñœTBNÀ«J( p\ ÝxE e^TBóQ%Ô x>GßR€¢øÖË/q„|â̯SJbôa¥4°V)X£”Ž• |ü µê>6ôİòn`=P‹­ŽZôùZjÑç—qµ.×µù%\­çb1þ—ÑÖ-BÌV(ÞÉ03WñfÂJh$ D Í l<‹Búf÷RH÷p&…ôEÓß!¨Ý£ø:áÿ”ÿ‹ßY¹ Ž‹(‹µU!òèÚ“Ïhì©JVO5|=dÀs ‡“_¯Ê0òêF=ðPÓsÇêªxw\Šw"À©x‡Ç àˆe¾¿ÒbIÒ²ûÛɧ¯ïåï ûß–Êò7¥Cå¯[;å¯ÀW;´C ÈÿôFÙã ÿÃÛ)æ%wyGÊŸz­òG>·|¾åEÍ: g?ùœ7A~;”(ŸõtÊ'pÞ~WºG>î/¿‚rÄ5°?^>ìÍ–ê- -•ÒÆ’äg°fwh‡ü$Ö=á]*7ybãüÉòz’±Ïr_Š\ç‹òîcr­/G®ÉBW‘«=pijC®òD-p·¢%*ØßK¾¾Ì eʳBšl•Í&¯, ¯vO­ˆ]lËcwX}ìb«‹ÝZµ±;ln캚»ßæÅ®²¹G'ʳ°Ý1y|(U¾ –)r¾æ¬"ç…tó£}Q-i#Zµ¤åÈ™¾tYYåYmæûÌ?2瘳Íw˜ÓÌ.ó`sй¯%Ñb·ô±ô¶X-‹Éb° YúFÕ‹þ¡ÚïA_“]“Ak BkEì§D°EÐä‡h"‹x ¼ ü(xxø!ððjðJp#¸I½xT[Ý!šÄšv{¬»F¬î\-6õô6‰•=½•¢QïEšM`Ûdвº1ÂO8ú7ŽsŒK¼;!oBà6MYO›ñÃãøßÜN÷¦.Žü´hfIäWƒÃ‘QZG.Š ×> ;Ä‘ tˆ Â%¼\Œ ÎÐÆyy µb]ZEÔ¨T¨I©Ôª©Q«”ª«mÑÔÚZZƒ¶ÖV]Ÿ‹Zt•ã.]åPl'/ `'¿P3YÉ««yMVM ‡B×ãjòc3¿_×ÏÕšWŒ×7ë¯Ûóx òh*m(´y2ôéa?Lû\útulº:fƒ˜ÏŠ-wÅæ]˜ÏøÿôTþ_Wm¾¸e¿öI_æV‚Ë"Íø¯eÝ|§³mËÅžoý´²ùU–WF.º+‘-­yÿm¦÷kÓÍî@íÞ[Ò¶ß_PšýÍúG§î+Þ~‹­-7lï»Ífû´ÍŠ5[S·ßfz»6=U³µ]³µ]³5Õ?U·\<³pÅMÏbÛ§aÞõÿªUVÌ endstream endobj 316 0 obj 3570 endobj 317 0 obj << /Type /FontDescriptor /Ascent 750 /CapHeight 0 /Descent -250 /Flags 32 /FontBBox [ 18 0 757 676 ] /FontName /PYACJB+Times-Bold /ItalicAngle 0 /StemV 0 /MaxWidth 1000 /FontFile2 315 0 R >> endobj 318 0 obj [ 444 ] endobj 136 0 obj << /Type /Font /Subtype /TrueType /BaseFont /PYACJB+Times-Bold /FontDescriptor 317 0 R /Widths 318 0 R /FirstChar 122 /LastChar 122 /Encoding /MacRomanEncoding >> endobj 319 0 obj << /Length 320 0 R /Length1 4800 /Filter /FlateDecode >> stream xÚ­7kxU–çܪîê<ŠtçÙ‰ ÕM“wwèˆÄ¤’t‡<„!‘!¤Œ ‚Y@ˆA!ÈPÄQÇQ*Màë*£ìª#~ÃŽÃÊ2>˜5Šß8ìή€3bºöTu@ÙûcêäÞsÏãž×½Õu‘ÐÈm¾n°Â✥‘ÙÖ³Ú¶¿¤$ŠÖà“–t/íÜøÍ¾aC,;³ôþµK’ò÷\.pùí¾Å—KJ¾ˆˆ¤=Ĉìàí!zbGçê51w±CDwm½¿«ÍÇe²b¢ûˆ×é[Óm*d¿ z€hÛ¾Îöú½­hû»»V­V÷ãDÿèÜîÛ»{ßKÛH ðÆ“ÄCÐòÑ22ÂxÂéN¦ó8¼¾2Ðßj`†H¡aåö@ €ú9+4þ,#9É‚¯«ÿÆiV†´Á‚%Eɰö’­ ð)Lòð9=çà3˜ ÷Á¨†WqôÃ,(„N¼&âð,¼A;ÖBéVÀÏÀN»N¨o¯^…\‡0H{ ‘¬< O«gà9ø ®©‡Ô?ƒ6‘Æyõ?ÀI§õ$唩ds9tc[­>Åäo/œ€O1^-†8ȇ"ðÀRè€Nx'Ùëp>ÂdÊ&\ä§æÃ6Ø{@A Ægø0µC]ó(‚å´o'es.ãßÄwÔduHUÉ·¦A™.?ÏÀ!x^ËÞ!+8çs._ÕÉê Ò¢ªÉP?¡°ž2Ù ÿ ï|F^Ó±ïÅnìÃ~|‡•q1¼`˜¥Ò)ƒ‰ê}ÁlŠE:OQ _†_¼ RåÃÐÁJY»ÊY8™ŸcèQQ¨o¨¿£1À8ª ÁLX k` l¥xwÂqx .ÐYýFQ@3&P Cø ~Í€YXYû-×ÅõsGxà🊠O_ ލKÕ§Ô÷Õ¿Qö ª}:L%˜F>J`Ì…&XLµ^¡ß§á Â0Õî<\„O`‚8žòœŠex®Ã_à<‹ß2ÆÌL"Ÿì và4;ËÎsI\ —ÎåqÍÜnî ÷2¿Ë°Ø°ÒðsàñkaK°-¸8Ø\<¥Ö¨{Ô×ÔÓ¢Ñδª(Û9Ð@'¸Öéµî×îÅsާ¨NÂ)zÃÏÁŸà*ݹï©az¬T bSœåèÁ*¬ÁÙØ@ç3чËqöâãx€àµ±¶Œu²í/±#lˆ8àŠ¹ ÎG p§¹óÜGÜgÜßù$~5ÿ0ÿþ,‘áÿ‡¿n0\†{ óŒVc¡±Çø‚ñ¨°BøµpüTãÃp~ü´ÁZ¶›}½l½gïÒ¯ÕoY%Ä<Š/P¥^¤{›Oð1LGNð(ÕäIi©ì6i|Jò]I‰Ö„ø¸Ø˜h‹9jœfŒžcÙ^GE‹MIkQø4GeeŽF;|ÄðýˆÑ¢ØˆUq»ŽbkÑÕl·kʤ¹äÿhÊ!Mù–&šmEP”“mó:lʇ-€÷Íi¤õv£É¦\Ñ×µúz@_‹´¶ÛiƒÍkíðØl±y•ŠžŽ~o‹‡Ì ËT°ðœlºT‰Ͱå¾ VBš†WIrx¼J¢Ã£Ë¸T¯o±R7§Ñë¹ËnoÊÉV°¼ÍѪ€£L‰ÊÛ®í³‘j}#ùÎÉ^¦ÅÛ";o ÈÐÚ¢­|?iT8_“ÂZ4–,%ÁáQÖ}aý¼¹ò>ù#¡ÂR+|íýTšm•!²E£|OU3×FfÙ¦¦F75…‚ÐceÑîðjœ–å6%ÌQæèè_ÞB5‡úF’œäuø ~Œ×é×7†bK{—GŽ™8ÆEƙ̻…ˆ8Šì Y1gÄÄØ¸3ö5c‘®¿ò u,¸Ú+…n÷Íèò\¸§¸ŠqJ~šC˜6%¿À=9>¯ïlˆi©Š/Ϭ¸»¬dqÝá´ô‚ÞÌq&aj~ú̶FŠåcõ+|“¾Ã&Ç2#"DònÊd‰‘âÛö5?s|Ëiž‹¿i<ÖèÀñeåNgY©Ëª¡2§³\¯=õQ\ª¡â¡KNì‰ÝËÒb bYäh«éÒîï­Â%Gì%1€øcZcØ+[ÄHŽñ¦8ƒIˆ´’ÆÐu,2RLL°žÂ5`Çq!ŒÝMº”cá•Púµ×®|ײ²è|V.„ø8Kl|Bœ} •ÂBµ˜`¦¤ºY+Öwž][mMOš;»" M†°3k3ùäñÆ‚û¸g]“SÌÉ'a¬w„M '¬\Ut Ѥӧ‡o¬½…íÁ]ôViýkØM} !¨7,ÁW‚¯ 'oIn>FÃ;`g¯@3jG¥ñ5£Ÿk}2ôÂYŒ¦¯î¾-2¶ˆÆzo˜ &Q‡ýuè1ûFZÁ¼ºúò견†eí«rê»:}Œõ» ¶C;Üé1Òˆ 9ŠÞWêä娰ß5`T–œËÀƒ (—Šxƒ\¸ôÙ¦Ïf}¼!Gh¬Œø×ÒÙŒ'ö1ŽæÓLë¾TA¡Õ›ÌD¿_`-Ö‹’ÞZ9N:E M-´‚„yþͳ¥7ð%°ˆ;ôùQyœMüÔ&^´‰;lâ#6ñ Üu$¸_ŸQW'^¨ËëÄ’:ñî:ñ$N§¾KDNŽM_Oéâ/ÓÅõébOº˜“N»é_©Ï?—mÕâ·Õâ»ÕâÞjqSµ¸®Z\R-Ú«ÅÖdqb²xW2½½Ç£vF DA-‡ÄÄ»v4Ï)•ð›cn)+»@ àVC6¡Çü ¯J¥q¸2x¤Œú ƒix=xt¼]:^ƒ.]þO~gm[å/~–ÐJñ•cäêÂå~÷q§ùš¥Ò0tÙœ “†süÅ»HœéÏþ@*µà$ÈÅTbO·.v€[WŸ0†þ†4R7 Q jFÑ/·—n8ë¥ë¹ž8×r&BʰWýÒ'NBr‚ôGg³ôïÅÕÒ²ðvÈô¦ó~éD¶¾áWžSšux™ºÔ}r„ô¢s—ô‚s«ô|±.~έÛÛÝ £§2ˆy\ÚJfVåÒ‡Ï/=èÖ> endobj 322 0 obj [ 333 333 722 722 250 722 250 722 722 500 ] endobj 16 0 obj << /Type /Font /Subtype /TrueType /BaseFont /VPRCJB+Times-Roman /FontDescriptor 321 0 R /Widths 322 0 R /FirstChar 40 /LastChar 49 /Encoding /MacRomanEncoding >> endobj 323 0 obj << /Length 324 0 R /Length1 6524 /Filter /FlateDecode >> stream xÚ½8y|×™ß{3Òèë´% É#Y¶,ù’mƒ±-°9Œ1`‡˜ØCâØâb™†#~PhHJ(6MÓÙV”°‰·$-Ù@ ›4i®†ÛÔmwd[°ÔoF »ü±ìoõ4ï}×{ß9oÞ ÐÁF`@ììéèƒuGÊ9¼Nwö¯r=YU¥ °ö¥}w÷lúrÿ0€âY:r÷½KŸ­›¶@u/€:·»«cÉgYU8ßøÎ/éF‚®›EyãyÄ3º{V­ÎlbŠ¿‚xÁ½½º‹š>SâöžŽÕ}ª*úcÄEÄ]÷uôt…žÞñ>âíÒü¾Þ•«`+¹ñ‡ŸÜwWßú×½›? <‰4’?’GJ’Ö€æqÊ7?оJ?ö&Eÿ??%pßÂTr¯–{ hÑŒU@ àÄËÆ<f€øÇxâõÇX ò‘ûEüߘ4œq\ºh¬ª¼àÀ¬=^­ƒ÷a"XÁ“JÄÃyøfÀ0õp„L…í0 Ê ‡T@ù ”@Âiœ1½([ß7Îz)þ ÒJàDáZè„ hÁU…ÄGà|Wã‡ã„ lF‰Kñ?@+èQŒ¬2qÍåÐGòèªøV¨D}OÀKð>I‰WB2C9„àn膸FÞ/à¼EèM ž:X;`/<ø%ȃ䇬:Þ_óÑ‚å8ozs>ƒÿ Fò29wÄÇã¨Û“ Fæ€Âaø‘ä œÅvFÉ\²€ñ0Åq>^¿ŽòzŒš p'ÎèµèÉð/ðkl V)!óHÙH¶“³´†1³œbVü!9k^´²f£ý+ÑÒÝðÆðYø9¶Wá·y5ñÐjº‘^aŒŒÈÎQôÇ7ÄÆOÇßÄŒ( ã߀m¬‚Õ° A{÷À xÞÆ\ýÆG ÄŠ6'ï‘/(P#õãj¿bz™íÌQØì{ŠJÅÖØ3±Ëñ»ãÅÿ/ôžbmebæK±MBU0æB+,ÁXß#×Çà( Â0Æî¼ïÁÄHúYJjÈd ù1!çÈW”RP§Ÿn¥Oa;CÏÑKŒq2>¦YÄìcžbže÷*–(V(¾¯T~Ám‹uÆ–Äúckc§â ñÇãÏÇÏ 5n´FÊé4˜ŽÞÎÁ;q>,…5r¬·Kµ„öƒ±@«NÂ)ÜuÎÃGpkîÆA-ÇÁ†‘( e¤œT¢µ$D¦“2›4c~ÒA–“ud=y˜ÀöCrý8Žm˜œ$¿&çÉ[Ø.“?aûŠ*(GmÔC½T¤ Ø`ë ´›.£=t'¶gèQzœF`*™:¦[„9Ã\bÞb>`þÆÚÙUìƒì?³çØwØËì²×Ebžb¾Ò¦,Sö+ŸVãîá~νƒ{Ï%xNÞr÷wÂÝGÿëéT¼Ï^ÃèWtfb9FžÆHýë¶Ûï±‰Ø ±i°=„11Ë›™áIw»„4§c‚=ÕfMI¶˜MFƒ>‰×i5j§T° %öÔµ»"ÞöëõL›–'áž$t|‹Ðq!©îV™ˆ«]sÝ*)¢äÒÿ&)&$Å›’Äà*‡ò¼\WØãмò¸¢äŽ9-ï yZ]‘Qž)ûe˜GØíÆ ®°­;äŠvW8R×ß½=ÜÂ冥€&/ #¡•Ž@mǺn’D8b÷„‘TOHæ1™áŽ%‘Æ9-áз»5/7Bj;=‹#੉èsƧKó\(ÚÔ‚ºór—IöÃÝÏ’Q·KPÇ-¦£5BÛ%ÆœˆÕŠX×|bûý ?ú-f„fÖutm¯ÃÐ옖@Û%¬ãQÄæºpYº¹µ%B6·&ŒmOxÑå K”ö守ÚSãéÞ¾¼cM-CvÑöt„Z#ÐØ2”*¦ÊH^î°mý7e8¯:¯Z§¸mëãgßMÐsF+Ë|ˆcCÓ͸I“g:šquÊJs¬|–áZùLÃX9T••®`WX4ºYx¹ýÑëW4üýÅ(óîLù$°(¶—ö*ºÁaÑ¡ãY†WéÌ,«ã#o6[­vöÕ4cªÉ%Úcîï&Í»2+ÜúªªLeeÄh*Ã^7¼^X`2—”Z•œÒh°š¬œ7‹ßø‚ùpx ·öw2‹wx±{ãÀoc‡c7~{{¯{ÊóÄ)X${JО©hêE—š½SâŸÑê9½Ò`TšSÐ&Ë4í úÔäÙ¦™ó6]»Õ&kd“  (‡&qY%¥%FCÍ*M±šŒtꬆÙ/˜bÞ?uýä9í·] ±kýë{¦9ݬy›tá!{Ý-C±?ÇžGÛÞŠýž\ÃÝ׌¶y_c CU e”Õ’<â^=nÙØÚÑûmãÆÍ- ¿¶®°€´±hW%™XìõpéÞ‰Å%Á¢”drmO³¹}ºIS›]7¹¦jIã ^_Éúì$WZì›ÑÙ‚¶à™‡ÉT,‚èSû-[,Ôk)±PÝØbÕ‡éÌßsz,òQrßy±%JÖ‹F^ÇPV•¬Pq:ZJ™()xQ§ãS­¶Sd5¸ÉOHŒ×и½åUhêÌ«£7ÈÕœŒåŠ6HI6ZR¬Éî‰h¶íNWr3ƒt1iê;7PoóÙçf^¢U¡¾>cf6ëHS–ÜÁ,(r¸Ù3à‹ŽOÈç0Ž<5ýNl[¦Z®ë5Ý›ü 7 Z£[gÜ`ZgY—|#éšžŸ§Zªj7ްgMÙOÕЫ*TjÕÆ¨5T­a”Ö2C˜©ŒÒáètš¹=Ê)©²š×:m1Zã4¼©!š(¥Çæ]C”’A!-pîʨáZ›©ìÊhªFÛªÊG±|ûm¶1ãx-ã_JM퀘4É™v¯ÅdMƒë°¥‘T›"‰ñBŠÑ0ÁŽÕ+½999$ÇP.ýsr6m‚6"EÊF‚ExG$O:Xl Juèöfy=¥tñű͚Ó-Û]áñôãSoüùåçË]Iäí„•yÌs¯ûüâ}]º oÇðë$czWIӒ–é˜{Ñ èÇ3ÖwÄÒR Q©S5~ †—©‡÷ý w•#ó}ãVxÍ)6ãc¶ –в4'§Tz35LšËG|QÊŠê$§;À0€Ã$Y+m¸]œ»ÚVfò^^ŽXÕ許LŠHºg3ŒØ¤’…¶R)õž‰ÁâR¹^-JOº7@òÑINé$ÁdO¢B|ËkÉiz·eGAº3ÛiLò¦Ï˜ ¿þ·ŠMc_8á^úPíÁž uSÜÅž\{²³ÁW=Z;¶~E•Ú!ï¸CÑ$ÅZ{‡Ø/‘ƒÅ ?Šûןþœ•KyÀ·/:È?lgŒ¤‘Òt"ø‰”¿+#£Öásy´.¶JãÐî1¤ iLNFF:&Æoqš]Äå,pRçcNC–•óû4íÄžcÎʰ¸ÅE˳çÚ0a— #mRÊf^>7ºoQc&o|¯ßH›´Ÿ“DŽï=•¤TÊ£Ͼ7‹R^K“Ýê;Ë3 5nSÙjkÑDŽ¿#ÅÂLïÌÏÒÆ¶˜Ù­*l$¯vÎS°nK¶ÚlÓžn]R‘ïŸT·¢"T'“Màg z´üT×BHH<®&2ÿ;C?N[9Ty‡C•—1÷@¾Ì\>¼ŒÔICÍ‹„j5 ޝY!•4æ UîEvöPîBµ‘dA>ÉDre¶‚²xúø¨jö¢¸â8÷G bÛðvB¸h®åGY¤\ͪpøÈ¥G†„÷8ˆVáÝÀ"áw•õ®ðjóeáåÀ½ÂK¹ò„Ÿ…NI«Ã³¤€ìµÂO{…§?ª”Ù‡‚òzûšåá1?Oà2+óñiH¸?(iÐ ÷àŠËs„N$ïõB~n©07pR˜¸_˜Ð4=$Ó/Éî|)òÕN¡:à**ߦ„Г!¡Lš>$'”åËîVÎrÐ=ö„Ý\(¤£J"æ óîæîâæq¥ÜD®€ór™\çä,*“Ê JRéT•J¥T±*¬[•%ÿPÌ‘ny‹Ò JVêY6P©§‰=ƒÅÒÂÇäæÙ™Ò_e«2UËêB·éÚÇûœÛýœ‘} s["Ï9[#Ew¶6D&J/ÜÃä3òI84L>•†VÄÝä³p“Lw‡Z[m ‘-QòixYË:"¢Äü øÞŽ ‘ùò:àGRhš¥ס%à—ÖÁ’-‘ÅIˆp Iƒ$v²X€^–ÅÞÄ·ùáA¿_QäÃ6Yd›"_Á€',/À©¡Á@@–ÒDHlw&"/ä” Q¤2(‰ Q`0X$³ß°s즻If/ü†Ÿ`J°!;çÿè×Uó¿“;¶ðÉM¤/ ížp^í‘ýÝ¶ÈÆÅ.×à¦'Ç?xÛwvKcGWäIOW(²Ér .> endobj 326 0 obj [ 250 722 722 722 722 722 722 722 333 333 722 722 250 722 722 722 722 500 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 444 333 722 722 722 722 722 278 722 722 500 722 722 333 389 ] endobj 107 0 obj << /Type /Font /Subtype /TrueType /BaseFont /DQDWOL+Times-Roman /FontDescriptor 325 0 R /Widths 326 0 R /FirstChar 32 /LastChar 115 /Encoding /MacRomanEncoding >> endobj 327 0 obj << /Length 328 0 R /Length1 18696 /Filter /FlateDecode >> stream xÚ½¼y|[Ź0sæÙg$#ŒR ˆFüÒuK6b~ J~JÂÒ+·8Šíß½!üBìÕ+6®\7tâç1„¤j„Dí+×n[Ñ™«ùBª>„j«–/Yöù‘ißA(sô¯_Šíô  òžUë¶\½ü;¸òcß²vÃÒ%wß÷ؽ5÷C>³nÉÕES3!eȱ~ɺåÞû·¯ òu7lÞBãÃZÈù…¯X¾q›u ¬·Æ”‘ucDÞ‡¼‘‘9hA¹ä¿(xgýÿñÁjX$AR$CrX›ÊT¨©‘i‘rzd@FdBfdAVdC•¢=Ðmâ TÒ› á S‹ßŠ.GîªâÑ-Ð{_9”>^ô,Úƒåh;ºu úz]Ž6¢Yè0Ê /ð¯Ðxo/º &/A“qäö SñM¨YPü”úöçAtú+ÚŠ~‰–¢7àÂqäA@ÍÅ•H'zÕ£[ѾâoË$ÐSè½âo‹Ô‰¾‹ÞÃÜKïµ yètº›p5nÄ×!¬ájô2:E©¥Ç`/zÐtÔ‡úÑJt”Á0§ÍD‡ñ/èI0S?º'ñ©â!À£zÖ V\O…Š'‘U£jBYt º=€~…kq3]Çœ€=äÑt«°hùÕâ#ˆƒ§-„•ÞîCÐ[è-Ìá>*B‰¾_ø0±V¸ÝŽ~þ‚ex¾šÊÓϲÅ5ÅÑâëлæiGSaÝÛÑýðvÏ ã@]?€=yWá™ø~ügf‹(6qCá? Å¿nkд ­G;ÐnÀÍcè‡è×h },ÁüC*JýšV1‰LETÜ%PjµÂn]v¡Ûà9=~„8€ãx þ%¥¢*¨µÔõÔAêsz7}„þóÇâ¤â³Å×`Ï?êrÃãC³«Ûk{w‡ÐóèÊ£Ÿ ?¡/ÐYØÉ5øv|çôÔsÔ/˜oE(>Zü¨Ò;FQxâ°ƒSP¬e=z0u½~‹þ‰þ‰m8…¯Ç»ð0Þƒ÷áûðø+êVêêwô}ô÷éý31fèvчâYì’Â}…‡ŠÝðv:;tÓ{¸hq3ÐÄ#°#èô*¬íïèØ¼­7áÙøj|¾ïÅã÷©Nj µÚHcºŠvÓ~ú6†c2ÿÁüZtèö‚¯0P¬E„nd@ M°î~x£0Ë5ðÜûp½Øú1Pí§@Í_¢o`6 ð,ÇìÄ~ÜÏÀz?^„—àUx;~ĿƦԔ™rQ{©{©'©ÿ¤þHo¢ï¡¦GéŸÑ¦(’‹bðt‹à}Šþ*ž#ÞͶ±—±ÏH~:Q=ñ“‰ßCÁ_è-Ü\x±Ø_¼²xUñ‰â3Å犇‹§N¥v«€¾ðøQ-pN7š†Áú/G›€&‡Ñ]è;ð<ï0ŠŽ¢×âþý'úúžÑ'€ÙÏ„wú} ïdÆn\ôÒ€âËð ¼_#<7âðƒøaœÃ¯âSøMü3ü+üþž¯ðßñ×”–ÒQªj§¦P3¨ÙÔRj9µ‘ÚA=@=L=M½@¤~Xþ%õ+ê#ª@W&:èNz^;²¾~‚~þ9ý ú=ú÷ô×°7 àÈɸ/“fV271аOËDkDûáù¡X.^#>,¿%þ„³¶“É>ÍŽ°Eà”ÃènàÒ‹>@qÏâ µVIãר£øü65ÂŒS*<€¯¡UÄÆ{ÐÇÔnÚ‹[諱 øøNÔEѰ‡*êQj P7ùÌ.Žö‰~Æð3 nÅ«@Þ¼ôÓ mnC'‘·øHåï/Gǰ 8jyñAà…¸ŸZIm¢þÄ|K«BO¿tó1ð~ß'~ -¤B@mÍh?HòàówhvPµh>z¾ 0íÙ^ͬ Ç¥GÐê>j7u´xšBès{ó™)1‚ܯFþ =k{“úµcÄø <ÖPIK€>~Œ<Ô£h9½3ÔNêoÌ{è}*EÍ§Ãø¯LM£™€§›Ðþ KÐ!|õ5v¢}x'¼ýGø3ê#´ý © z/µ ÿÿ©n££¨@ý_«ñ ?‹LXB5‰®>¦Ð+ðÃèg¢Ò¿ezèãˆÁ¯àê[ÚAµãº±8޼â¯ieáÅI¨*ïfäg`w6¡÷‹¯Ó5Ìfê7Ǿy‡2á»éu¢þâ_ ÛE7Q-h…èS¶m£&„xtÑaTÏPVØwJÒ°S&æ®o¾¡f¡*ê ü%ºïîðÀ›ôä8ŒVâg¡-ѯYÐÿ¤‚Ôì¡·‚œ9Ž^j¿d»ŽZ zfž(ÐŒ jø ³mËg&z´éAHÙEOñ­}|¶¥9Ó”N56$ñX]4R[U~Ÿ×ãv9œ½ªÒfµ˜MFƒ^§Õ¨+TJ…\&•°bCS…;Ü“‡9ßPŽñ¹;;kHÞ½ –\T0”s@ÑäKÛäCB3Ç¥-yh¹â_Zò¥–üù–XíÈ LMØÑáväÞnw;òxþ¬~HßÙîp䯅t¾KH+!ítBG‡yU»#‡‡¹ÉW®îj‡áŽÈe“Ü“–ËjÂèˆLI9¤r&÷Æ#ØÔ‚…eêH¡D ‹ÊYÝí9‹»¬ G{;–,ËÍœÕßÑns:jÂ9¿˜¬ÈÝTs,uÀJúÝð"$ZÞˆ†—6B3ø `è•[hX“NV§I9éŸyÕnÇð—ÐîÿüÒ’%å±Wý%"IBçé êÏ¥s¡P®ºšÐ;  klòÉšð•yêÏîjØ>4³º ¤#°çN'Áêíy]™ÜÎYý¥¼]fA|$4£†HÍ©s5†9¤f繚ó݇Ü@¾GûÞ“øÎÿU¨ºŽUé6þ/ÕËKõݽîîYóûÃCå½íî»$Wªo<_WNåt“úiUNQ6Z¨J\x¾1Éô+rŒþÄ%/˳ E¡;&çÔC¥x@ætþ¿ì”/~Az àB·ò2séÐ¥ù¦Kò—,O1LÂÕÝ7xXvIÝd;ÃÓݎÉÃCÃKòÅ—¹j÷ð °ñrÃ;†Îa4_û=ã÷ê¨úê©Já²$*W ¡"u)HdM3L‹Mts+xÈ*xKò„ñ}ß'>S ƒŒF“×ç3(”F$æó™:C8^åËÓû›~˅؃ÏàÓ ¾H¾øÛQ»6ÉÓµ¼ÒjUË õŸA­V¼Œ'FhptE¿à{ÎÀC;C¾xŠW¹½ dP¢ú.†¢#½IÃËÔ>¦o¹ªxj´6‘¨"mM>¢jgorÕ™*ª*Vo0êe±×Ì¡:C¶p0 :Í dI§Ñ˜¥Íå¼Á]‚årXˆu¥üS*Tþ ô|z64¸):;®žøjœL¢>Ä©íRÕ†TÛÕ¯‡ÌYyõÖ¤4Ú”&X}z©—dv©Ô¯¿1ˆB¡Á+0 ;ˆºsսݹ4ðè«(Yü9J@€{ï/~ÒŸ4ƒ˜fŽÉ5Ô7˜Ä%’hh³¥”¶Ð­©u±bÊ š%>ú¯i™D¡4ø[]w·„BFÃMëgLëZóê=›W4Ï2x~Äw®Øß^·ó`½{bþ¥T­ª«˜W­ ëfvl¯Û¶f?^²¦ŸzEefNadWûŒ'~ùû9ÓíÕÚíOÛƒE¼z Kd˜•ÎBóD/V2>²‘•ö3™í£›*¥t}I‚PŒÛåÇ‚\q»Ø$ (©×JÜ.1KÍøÑÐÞéëïÈþ´ëþý8êV›j ¡à²iý/ß¾ epÄ'Ú3ѳlêÝÛŸ(ü`dcÚf°*µ¬ïŸ_7Ü€c,\µÈ ìýZàûVò“oRe$ªEaò×ZP N‹Zü-;¨Û»ý©ïyŽq£5‡¬”•±ˆ¬~. ¾Å‡¯ñûŸvÒF®&û¦I À(àÇäþÀá )-š ÿjÂ?äcíXï²Tdå 8eä|}&!#‘ÜœH&ä|,ÙX2a“Yå«e«åÈ~'g 3 ‹ sâÌ…n®t¢>ÙeïjšS»+y~XÿáitçeǪŽ&F“ª>„}ÿ-‰fh*#í…Nͼ7ÙÌ»=¨Lêõ·ÇçÓ­•a™œÛ´kË><{Íœp/ôVƒJÃz'6óÓ C¯tÏÀ?$r—Þß¼oϸÀ×W¨å^³ÚìeD-¡´½’YR* ­ö6J›ìl—¤KÚ)[ ™§žã½‡ù.ó”n„9îUûɶ7û’RW¥&+qiåY‰T"ÙDjp a/‘µ(mU¶ˆ¶Ùän–ùårGºÂÀ(ƒÕº(ÂÖ& Tµ303«âa ý`qY|¡×Ìç4pÏ?Ʀ‰=¢T›Š †ÆËXBÂÖ%”€ìtµ ,EJŒF–•”!K TÑBò#K06¨;ÇϦa{VìTÕ—DîYöúù·ÜdÿÕÝ÷æ±ñž5+Úæ}ãë÷^{m²nÅGx[Ì9°½iyÕgù ûpãss›z§-mZ5Á†;ªï#„ û “éÓÀë“ðŠˆ†å̯ÉÒdusBY1oj5µ¥£íàÁ„›”[-îâ!ê–ïàÌTêD±,”É#bjR_?¯p2LG;vó0Ž;/çÕÇ÷5{jzŸÍ#­SpŒüeÔ¡ Ù¼ÈÛ6>ätùýMMjc܆£&ùÛÀöâüzЭÔÿ¢QudT2×ðsêútª.š§ #¦:ež¢yuTÇÃ>×Ι¸vYì7eþ;;81>1~žáÆKk€Å¨ÇÎY=˜Ø9€Ð]¯¿®z}—Hýº*3pžÏÊ&û ¡ˆ¥iƒãÊØ³ŸÑg]®šùY'‰:xÝ9cké`ÖMS¬À~ ósVP=à¶Açn(%Ê:·l(—Ùz²ÔRíÝ뻦®Þ¶pa¦š‹{m^ƒš•êB‹§:UÍÏ?¯êmk7ÕO}²sÚÂZç·J•–llRÒÖIoj+t>xìƒ9­KÀq:+±õ—/¯þŒzªÍÔ:puÛÀ@O;걨#+ $75ý‰œåO&3!àÏjFÓ°ŒOÝ=é íÝAã““ž›’Ó¾j‘$Ó®Q¯éÞ¦ÞÖýP÷¡n±¦¢‚k™ªoi™Z¡i™Ê´8;԰$OÇGÂ8íž‹¼÷„Ù¹B«ÑwRFâ‹Ö·8n¼é¬Ó¿LÇP%Š‚ÌÐu¼4¨H»×[Ó•/ÂAÚV'ƒ„4+|„:ˆß âà‰ž·¦‡‹X¶Ÿ‚iK¬ÛOÕ`Äœ ¡þ=;øÞM™Rçð_x÷X·KiÌVF=+Ô-j°ËXœ–™SÐÃ&“‘ ²–`P)_ß&Và^Ã[(,>‡|`j¿ U=£Û¸éGk’zOןHÄ·}zçu?íO…l××κiý ÿx§{¨¦g sÓ=‹&%—¶ ÎY½™¹Oï}«{mݽª>róÊ•rGX­Ñ;55¾D²cöm=MË’¡A»nŠ'˜_oØ3oχvÇ£3þáÚžËÒ+›ØêÝÒØjYÒãŸlT€ 9|dB=žÁ¯Óö±sƒOéÕâÕÒËíkýÛ¤Ûì×ú®õKzÑå>ª7Ilƒ¤ÆTu(F:}}Gíü@2Z߃Ý5¸!V¡àl½Íæ@aTæjjõ55µî:†­ ËÌr[CÀa«­Që‡u gG¬×‘Çž…×Fl˜¢GêVC¬^0v 1¥P™JÁ.`uB€¼6§rw©UÛ_G l»s1°ÙêÁf;âp5)ÉðRlV¤j!€ ñ»ã:}‹ÞU’kË O_ÐÉ*ª¤“u%©^"#–uã!Ë&©Âÿt0ÊW^cÒÈ•šT#çÚ6Ïå¸7-ú*oû€ù¶jîr‡8­× Úómk¶5´-* N“¨´Êðt]rG]ľßÕÒ›ÕWp¿™Üû6sõuÖ€˜ö—|îþâ'T­Èþ{{x¿i}:i¼2Ô†xm2Ä[l‰¶¸±Ñìp΢ÁÚ(ÎÓðVPT(‚œÝ©·Û6¹½:à´«MÃF@éÑ éFZ‘ÇSF衊ªpéSI^Y‘Hò†d’W'er™Â,·(f£[4O©ÙS69Ù4×ÄØ¼Ÿµ†.«fûÁ:pà€RÁ>=PÄ¢ñ„â€Ì%fÈf¿×hM)Á¦‰|'ÀÆûiŠa°N¯7ƒ òø53þ€_@vN©QE• FUÄ ¡<®ä aH½ÙÌy|zLJŒ¢²c¿^£ñc?L¬ðcpÂ`5qXNH †” q0 ³ï³ú]òPP­´&íÃ\Ÿ8nóäõc¾WèÐê(Nr¿8ûYP ¶D°$„,X+Á2U ªA–N-‰ I°ÀvÊb`lâã¯@LŒOW ¤²=ÄÉfÎ ‚’ PÒ çeQfT&¤Ç@SB¬>ÍJÔIf‰·Ë t%Ð+Æ ‚©íó¹Ý NV,°º‘(Œ ºßG³4°ÿ9⡦Æ®x±Q«p‡Ýr|LÖ½.¾Ü1×è¨×éôS¢É½nK´Úܽò<­Räu›b ‚K›fQJÕ2Ÿñûº«¦uÞðË@@ãëµìžçlÂ÷]Ux”ٺĢ3;dnáÍþ_´U…ƒüT)ÂZÄaŽ·&ûP_åî&FæGå¼|¦œ‘Wuæ*£U=Â-oÍi z­ÖP!×Ú­úBõ²“øEÒÃ+h¯iñ)í»ZJ›ÇM¼Ì.Õš´vÙUÓÊšèkÁ°ÒêÀë× !fÉjù€^Èz¥RÛ¥N(%ÇZ^m+ÕWXʽT&(U–Z3§´¼ñü™W™ÇÇÎ~>ø¯0~«ƒD †ð&AÂÈÉ<2aGÜ©²êÇÿ†íñyÌ-)°èT ÄRöÅ3›’¾¸W8}Sœ¤ùú ½&8—»5éK¸<é›5fŽõ ¸p?­[«—êào¶€Þh¬ÁÒŠÅÊyú…ƒéÁ¦E™9³WéVׄ·)¶¯ _ÙMß¾=³{Ò£ôê‡ëô >¨|¢áû‡S‡Ó‡›žÏh²ãXãñôñNïåõ«Ö´Ó³Ñ@ûìÙôîúÛÚè —§®©ßš¾¶ýÊÎ'Sâö¦üS"s6ô‰œ®ÞB7áé¾ÀìhoR¦YÜÕª”¥1êNÔi4­u,Ûûbõ ŒGeé4×Ô¢ojjA¨·“ëêÖwuuûä]MMiY°”GKSw—Ú5ì$:ߢ÷Fó„D,Þ ¯J?RÁ<•8¾!§qš˜ò†&Þlâm•‰ M¸i&¸ÿÞ–çšNâS¨“¢v?7ûtWÉ8€;)N£ÐIÈZJÙê°åM‘DbC×™.ªËÒ45™ºLÁ¾ öÂE:†ˆŠñ³gÇÕ`OŽn‚ò‹ì‡ón;<Ùó6„¨,'.2&ÆÀ³‡?"T˾<ü]¬|…O‰â4J° 2K‘š °ž¼AEªB°=SL  Rao ˜Ê‡Ë¥»˜Ú‰KI EÉø`µ ™!¦ÿf‡4\ìl¸ÏÛ%à¶ÐnÝ9±äÇ/Ý8¯yñüd:ÖfšòäݳfÔ6i×{¤b™Ì’Š9-;æûÜ‘àŽ¢åŠŠêÈðÕ3:î?XiT;½™—–E÷ž0³NÙ$¥wš÷ϼ®ÑÁÇêfpݵíÙ¶tkáÚ*•ŒÕ…; ;bQwô;¸uƒB§µ¨T¡Ýÿ95x™Óf5û‹hkCá—Ôm}:©Ñ­(ñŽtäsÀ;õxoÉ«)Ûbü#ecL1"e‹0³ØÙÒÙöYŽmøÚšÝö§ýß œ¤Núä ñÂÀ«˜ž/oŸïLß5ö’á+ž[=+¹Öœs©áìÞš’Ý j£šýn F.ƒØ‹ àªqá}8\3~kÂÿÆø%]˜´å©}#ÉÓ5ÄÝ Ê $.U -¢éÂes8\R„aAN‚Ñ|&ŒÃÄÿæp¨g|lìlè¿[ÄÿÆò½—‰W}‰Uü¿ÅäDc“ ýècÿþ7k©¤ÏÓPÚë·¼øã…±Öªk j©B“Ìrƒ½éZoصÅhÕUú§>>áb÷w¸­ »O •¦\[2³¬° K­Ò)«çênIùk|Ñ­øîîj½Å\óÎs–?E]±Édt2bؾäÜyhF‰,è9¾UBIi±Œþžîyóã¶íˆñ³xyÀr‹îó>ݣ槴l½.m™¢ë²Ì“ÌÕöéX™B¡ñÈYZ$2y¹ž"iÙݽ vç¤ä^v?K±«Šû…cmÄCâ'%ƒ`O’oÈEG"ôš­tÖT>'$ÇÇY=Ÿ‚»J„ ‰Jâ¶V8”?wF$¸–¥»-=º¿0vëîç¾m7ß|ðé÷ü}¨ëοS3ï+üúÐáÛïÁCÏO\ZXðîâ•øIÁ(Ú SéŸÀ>¸Q ÷òÝsðŠGÏ)^RŠR†n4Y5ÙÐY=G¼\µUµÍz(pBòRðDõi«j’k&š«¢£(á╞º˜J…ŒVSÔhPé£w‡-ŸáUWÔ݃<8âÃÈÉÓwò. ¤Bngµé­V›Ï#“C¯ +¶Æ6«:|Ü|Hº6ÉÊ–€_¼Á‘dy.9ƒÅ<;“ÝÈ>ΞbEìIº ì’ÐQ›Û·’“ÜXÒJ®ã¬‚‡X [UâŒÛ,q«É—åéô‘¹ç‡Èž_ó‰9¢Ÿ(Ñí¹›“MHp/rÊâ\8—ý7ö pB[¾K)a‹-Ÿê À™_àcœu6Ô×_ptä\€.ߪàu¬;80p}á¡?Çz¢]FS¢GZÊ[=&ÎQ•Xß²:±våìÖ®ºµ?«£w¼sÅ›~[H+ …i&#§ñz™ÆôÚ^½ÍÎú'tSÓWì{séÌ9_?]²ù|°M)Àwýƒo¥@N:!ÌÂsèEÒE²ÙÁô¡Š槬Ò[¬û¬Å½›y¡ì‡Q‡óO`õ`Jï 8 ;#J¬Ìãý¼Kï‹1ÀЈãN½Ãátp²€Ó¡ŽJyéL)-=IñôÂHð´ƒà£Ö”rð‰æ„ƒ'¼‚ ¸€¾²*9ö;^u¼ë8ã(:Ä o;r˜b‚Õx¶Œ P|<Áš» ¶JøbAá^,²v;áÁÄ*×yéó ‘ˆ"¿ÏÁ?'‰„¢•xà®Ã{gÅ>—¹Æäd(V"×TX“½KªíÕbǃ'z§¡‘žÕX°âÐUí~o[¦ÆÎéÄ‰Š¿ì‘¶Þ+L×SëÖÖjj©°ÿÅq°¹ÿûE/ðžÆ&—M•È™ ³ÜP‘ö‹rwŃ4ÁY</*^Vûв"OµäÁLÞ0›äUœFo`^+ÏÎÄŸV¥ßu|èøÂAïpì…<å`KÒ¾}ÖaËfA9$’f> ÁéJe¦Ì×ÕÄíx2‡Ô_6 Ç$g'€'Æ„³îÌØx)(š\/Ðn_ù8Ëd,ùÃÂ^¹uqcéTË_K _&’o þØì­êi骪»qÚs7w.rjkLÞf¯øŠ¥ÓÔ•£ñ;78¬ª•šPò·o½¦=êÌÔ﹋_õ„KQ‹Û¸~NKÀ•ùùšä’[E´?4<öps²cñ $5¿ ¬$ðÓ¿':C}£¢ç؆ÑW˜öT¥Ñ]á¨rP;€”(;RU`FIJ¨ªÒnÃÖÊ*»Yda°ä–ÅÂ0ô=èq ‹urPàœÑŒj1r‹QMuUÐMiL¯u ÃlŰê$ƈ#U¡5òõ©Ä)ã»FÊ(ø8œ¶…»ÄÇŽ,*ŒÄ§1’s #‘L‚;1ñÕ¸zŒÐôXIÞI#*)^Øó ÁÂÄÄ/G¥‹xŽE™ VŸ.Ù䈨Ù8ëþ·ÖM ešþ¨æ‘C•j¹%hîu.œÝ˜ 7:ž¹_¶þîùÌ …/²#‹+5Z·~¥åÖ_C¨~5Éo¿êT¾Ÿ}è5ƒïço–¤-iJ›¬›R×—YcÜf¸ÆxÈð#ôOƒtNm_Ó)ÝmèCó t=Ê(g ˜¢JqÊ— Ì,|iøÊøeŠÕ7e2:©ÌçoL¥&QÜÑùü¶æÚx¼l1…Ø #šæt½N—1«ä6]3ØLZ6,¢‰k`Ë<§MªãÍ–„Ž7$9Ý ÝbÝ^Ý~H^¯ˆ{m|-®õ:öim%›É&|]Â"ÜÖê %N·¸‰¨·=n£m–f©Í¤3Á¤²«J—ê—¸ä¨ÈÆ»µYaà<KÞañÆ…–äÄñœiE|…‹0›É^¸s(N‚ B‰ò(I©M‚_@ÈÆl0ËS†²WÐ! Ááü¦/ÜÃ;àüRKÌúë.5ÅZ¨†úõçýJ¹&ØkŸÑÛ÷‡•êî]Vˇç942CõT®»¯÷F‹üƒs͑ͭFzÓÄ¡[ÜZ ·Ö´½Év»§~]øôç|]÷Ã8¹Á¦Ð؇Œ[Boýí…—ovëLmøñûÓJº' ´4,|Çç¾õŒ¼:àTɪŸ>μïd‚•M•]Ýè© +”*Ö̲ØáIgÀ,çsÚˆ6«¥µ {^¨ð›‰mE„ÛHuRq6_òŒ¹h¦fÞ¼Ó|—ù³Èl pÃÔ%|ƒC¡Of}3|‹}¯úßK´›°1rb¨M8JãJ KàH(Y)ÜÕÖ'*yg2ZÉWά¤+O^Ãtã‘’Ê8Ómbb\ abPTâ=­eG^ˆË(3GÊg§r®Äaì³…«Ehð ðæQ°!ñÀG4)39-Ö¤¬®ÒiñÀ ðu§A\ö­Ë ±|iD°ÆÍ¥ûw¯Qg4óÙñüªfÓ`¬õSöyk~ßàm-, ³ž ·%^Uƒ¹ŒVÌà‡éÝÚŸŽ®Ž5R·×À…šã‰š¹·=Yø´‘::1 üûJ‡Iì™ôLáé›\ÔÓÄæx øîfÀÿd,á—*‰¹À"¶5ã=2‚ŸéÆSmsñnË“øû–ÕÏ6Ϊ;5Õ¦¥ÎÍÎÓ–·œ"©[Q=ÛM3«•ª®µð->àtQV+àõßR T“lžüÒ¯Òq†´L†Øä)m­OÎT[ZœÃû]ï¸(×i%5ÖqOA<8¾ÖĈ¬²ŒµðM݉¾*ÙÒ2Å¡ä•{•‡•ŒÒÚ³LÉc=AåtЕzˆ vÊÇã •ÇK·zÄî"õYá û¼ˆ=B[úΤ„7„‰n¼`–m@ñb%ê÷‘ËÛóW·¥£“úÀ\é˜eEìw/ó™«BñŠJœ³³eîlUi¨lð»³K|NCÛ#‹šS§9ìpx¬*….ò]K‹È4µÓd§w'žoŽÎSËj>•Eª®Lì+<;ƒ3ÕNÕ^9=œõã`á/ÓcUF¯3ì0©}ß6þMÕZOyJöäPa2}+à¶ëø×á:s:)µX-AK³åiê(uÒz4½A¿Á¼iyÓªì² ØVÛh¦.‰ˆªBvkUÄ•6‰³N$fAìÊ“n|CXÏéß^áÌãS|C†—kNCiŠ­&"ï2=n¢fšvšr&ÚaŠBmêJ7v½Ú€³ 37Ð yÚÍ+™êˆíSGlŸ:á0ì]uש£gÖí¬£uÑ:¾Ž®#â5uN¼–XwILþ1”øœHWÁ2*…ÎÖûˆy½ä+‡ðØXúªKIÐ^àB1bËߌ)™©å#±úÚW:êêvY•áÌ ³êäbU“?ê ·¬-üô7÷ßà"­>½R¢“ˆXqEC×Pm£ª±ÍP/¥w§—ß[Ðw>2í¦™µF®ÒÅÁX?ã­Â¯D8?/E$"™kêe-Ô5¶‹½¯?æ¦7!=ÞsD«Ìÿ‹×ºÒ aRÚ)¥Ø™¤óÅÏùjg²žz ¿C½Eÿšþ'-ÓMt—²_ѯ\M­ ¯¦®¤U<ª|Šz‚V–E—Rª7©)¡ åT¾ø!o‚4¥D´\F¾DH½«Ä‚G~kòöà¦+²oÆHÀ¥ë£´À0ŸK¢R}‡Jõ¹.ªWjU¢òØÂKÁþ3ZšS@nT&—+èæUÒ<…»Œú}´°~R¤PÈy›#‘•cù=ÂÇDZƒ¡Ì8¨Ì³âdd>ž.hrš¥¾2ªW” 0 ¸ó ïi^£/c†ëÕ¤oPcLÅC™TE¬l•ðÀó­qíøçHýe ”/ýÊW‰Z<š¯r·Ð¼Dú’×9 ØI¾—§IìN©ÜÏRׂˆõ®jŒTyçMl¥Ž>\ «l¨òÑ›,Qu¢½ðEõ®HoBÂ×ôiÅÛÓ»cÇWd¾”X$ÂO¶NøfÛ9H¾#Z/Úƒ($=ÿ«^€¬³ÐæI.ÿVômAò2#ö’_ßV‰S¸’®p‹ŸQP=¤;„¢êé;Q#@?@žJfPñ4äƒT õC™à Ñ‘›´z;]…ªéªâ8Ôõ‘2hÍEnúÎbÂB¨û1L—€g=F9üg꽞9 Z&¾†]/Y#ÍÈÖÈ£ŠÿGù‰jmÅ2µGý†æ:íwu‹ô‹ ÓŒa“Ux·*ôW”A«–­F4!æ&ÙkˆF”ðÖÚòˆ‡Ð´Ö¶Öþ¾PßêuË7O_~Õì ë–¬ŸÙ[ÓµeÉÚÕK{úJ÷רxæÀŠN´ìßþF¹J¸©*ý&¹u Éh êD]hªð›Äéhš‰f¡Ù¨V2ÍCýhÍG ÐB4xõOÑ/ŽvtÄø<ÀP­GÁØ ¡Âê‹ílÕÑ/¢ýCxìÄŠ~‘:ŒüˆƒÆ'FŒ6¡W~¤­­œ¨o,%F«kb´Êè<:¢óô (õ ÔÆ¾h•Cì ýÂh  Ž>Nß0’æ*ZMô(RÓ#Èa&„>„ †ÅŒ¢ œP„À -ýìÈíæ^¡÷ãËñC0Èè æÜf‡ˆÚAí ©Å/R9G§°iIJ"Fxo¹u,s'ÞL ^¦oÆ&2ñux¤.ÎçÔ `¶E€> :½%Xéàˆ»ÔÚü%Ø–„©ÃÇhž™/þu4ík޽DßH”– cï]'ß”Y¸ üyÔ['¬«_¡o€-b)‹ÄÔ¤nÖ‚˜‚Àé³b䋺£Szbäôud29ì»—ú¦Ä´ÞIýB£‘Xœô©ŽkIÓ†æ˜öE°Å‹gyƒ·9nö&ÄÔ^_"&öVÇ0¾Xà=Þš¸"‰Çôðžôžö2"o=ÔÆc–t0ݘ¦Í^ x4àmô2/Ñ7y%ˆWsY›36ü L…éäA>x±Z®GÄY1½Ÿ:L½J½C1ûéÃô«ô;4³ZíoŸŽÐYz½˜U´&©q@îbˆ÷Cø"g!lr‡†0š1Œ’ qVHe  5‹ÿ¥†ð¦Gèjž<0 omÀ(ŠyLB“b IÉ‚C«‘ð­rêZÊ 2O‰›…¸Aˆm¼5¡Ü›PÞœP®J(ʾ„²3¡ '”„²UM%‘))‰ñ·BüšÏâ0ou(¿p(_q(ïu(·9”kÊ%åb‡²Ý¡lUâ܈”`š“8*ÄU$ÆG+z*ôU[k@eñ%¸<¥ñeHFì/r­JŒì µ"!0eH#Ž!åÕ)€¿Ó.ÀçG|Õ\?Wɘ­òCTÒ ?…ìØ ð{è ÿ.ªàeøèˆ{-t{„€V)~t LÄ…I®ñÕBõÚ‘º+¸V ¾æ$Å«GhÖ$B`¶ÜÍ=bŒ{ ;‘"YtÔ·›€þÞîŸñ¼pÿð䩃#Ü'¾<†ÜGP÷Ð7V9^Îý¡nŒû¯ºÝÜúÀ9νë{›{Û›g á uBÃç} ‡ìPí«[ÄÝï{Œ»§4ö°GhtlæA^Çݯ´Õ=Æm„a–¹¯à•†t +˜ó±ë…õ˜ §ûÈÀ:nJÝJn²ï 7©îm®Å½ˆKsP~œKyƸ·0W­[è^m‡—ƒ•Ý9ÝAnNÃKø Äâa!¾–ÝÁnbW³+Øn–gÙz¶†u±NV/ÑJÔ•D!‘I$±„‘P$Ñ+/D´©^¬&@̘Òj ÿX@01(,¡@ætt7ÕÝÛ–kuçÙâì\c¨;'¹ ÿÆ{pwîÔRÔ}™#÷U¯;e³æçDî6œÓv£î¾634ÎQ·å1êëÏã"éq‹üttæo¹ÓFàÀ-w ã•YsVÛ¢IMnÿ7ÑP9¾èÛºôc®ÊÝ×ÝÛŸ;P5‹‘D±j ;7¥×†#µº¶£ýuý'ðdj{ÇlRŽ'·œou4¢¾®Ôl²“f@Ý;„f‹JÍ8è ͼfÏ"NhÆágI3 3ÒîÈA®£ýÇ m˜è Ðæ ³±ÔÆ+´ùø¢6"5úXhó±H-Lgšx<ФÎCšqy ÁK¨žu¡Ú]ªÞ^ªÞ.T¯¿P/U(U€êÐÿGŸåmÿ·«{Ûp÷Ìþ#Ô6æ´ê-hŽ5ï´Ä•ôûHÈÉÜm9¹» e³àdpdP¬È‰¡Œ…@š79Í×ÛN2¶œ4W@±²\UÓZÓJª€œI•Šüìº\e¾¾É “<[®RC±&:®íº¼¼#W=ÀÝ>€Ì«Ûᯠ6ÃgëÖ­›7oÙJ>ÐÁ×Ûk&ר>_GÎ2Ô>ê0¯nßò¿¼ùgoYÒ‰e;r> endobj 330 0 obj [ 250 778 778 778 778 778 778 778 778 778 778 778 250 333 250 778 778 778 778 778 778 778 778 778 778 778 778 778 778 778 778 778 778 778 778 778 778 778 778 778 778 778 778 778 778 778 778 778 778 778 778 778 778 778 778 778 778 778 778 778 778 778 778 778 778 500 500 444 500 444 278 500 500 278 778 444 278 722 500 500 500 778 389 389 278 500 444 667 444 444 389 ] endobj 8 0 obj << /Type /Font /Subtype /TrueType /BaseFont /LABAXT+TimesNewRomanPS-ItalicMT /FontDescriptor 329 0 R /Widths 330 0 R /FirstChar 32 /LastChar 122 /Encoding /MacRomanEncoding >> endobj 331 0 obj << /Length 332 0 R /Length1 4648 /Filter /FlateDecode >> stream xÚ­7{X×õçÜ™ÙY#»°ÂBÀÙuA»ˆ¢Dì"‚( Qˆ ² ŠFBÕD‚I4Š±ÚØ<š˜DÛ$M“4+ú-j›økšÆ|ñ×ÖÆ¦y؆Ä|MmÓFMe§g4±ŸôÎáÞsÏãž×½³s€hèÔÖŽ@$À"✠1¥µ§Ûõxqq ­ÿ À'-ëZÞ±éËdž;¾|õúeïôvïOý\{[`éÙââÏ"ûhO~;1¢Ûù Ñ!¢'µwt¯³ßÀd¢ß'Ú±º³5€Ýl!Ñ_QtÖuYg²}™h×m޶Ú]ßû@T²±¿«sm·¾6­Õu{[Wï›i›ˆ^ `9B<### L œ‘ÄapåáÌ™§ º UBÃÉ=qúÇ4ÎÑøs¸”ä$ ¿¬ÿŽ3¬ ƒ…‹ ! ’a#‚¹p ‡JxgC?̃èÀ›`þòÁOÂ+´c=t’n9|Ü´ë°þñòáÁEˆ€¸ ÈÊðCý8ì…Ïà‚¾Oÿ3äQÞ!8¥ÿ ‡à58MgõŒ ˆ6L ñüœ³³ ²ö+®“ëçöóÀïá?Š„ûÃφ‡õåúCú[ú?){"Õ>fÌ$ÅP  –R­W™÷ㇰ`ˆjw Þƒ`Â8òœ¥x nÀãq<_1ÆlL&Ÿì~öÁ1v‚â’¸.Ë嚸‡¹§¸çøÝÂRaðaÀò¹¸5Ü^î ß>ªWéè/êÇ(7EcœiÌ¡lk¡žNpl0kÝoÜ%Šç$8DQ£ô†Ÿ„?Âyºs—©fœT /`!QœeèÃ9X…ó±žÎg6`WâFìÅûpÁ¸ò$Â#øžÄw †ñ/_1‰ÌÉ–ÆTVE°ˆ ÀZY;[Á:Ø‚gÙ~6ÈBpE\9 иcÜ)î]î#î_|ßÍßÉÿœ?Á¿Çóÿà/ 6Á+Ü,,´8-–ËÓ–â*ñgâ{¤¿GàÛO+¬g³¯¡—ͦ÷ì—ôëô+VA'±àÓT©gèÞN#xŸ@%È%ˆ$¸‡jêä´ÔIÊD·Kž’|CR¢3!~¼#.Ön‹'EGEFXE‹Às !˯”7»´´fOS**² Z #ð-F³æ"Vùµ:š«ÙTs]«©’æ²ÿÐTG5Õ«šhsBav–˯¸´·}Š+„·Ô6Ðz‡OitiçÌuµ¹Þe®%Z»Ý´Áåw¶û\6»üZyO{¿¿ÙG憌ÓÈì,ºT‰(ðeíNB††_KR|~-Qñ™2.ÕXªÕÔ6ø}7¸ÝÙY–µ*-(¥ZLæØvcŸ‹TëÈwvÖ #~ؽTYº=¤BK³± |§Aãk6|Ø3µŧ%løÄù yeåà[B¥–ÚúË©4Û+FÉfƒ <@TÕ™e›4ÜÜ8„ûhmŠßà4¯tiJ©ÒÞ¿²™ju Á$5ɯ|Ô4ÕD“ÈÎröÎrSQ†²K²K <ËíìÅgïåÿúX”©wü ᪺«uAÓ2‡ÂÔ\­¦…biLm3¡¿u&©ÑÓˆ”å -¢¬¹ßv#íÒ„T›âê¿tPʹ¿\Ë Œq,©¶ `,ã¼z#H>¶¦ß(7}Å¡ïG¿eƒ ç–.T“çp)ðs8Ž%EXÄ9‰ÖˆÏÝåuÎÌÌyç «G çÙ.VÛF ¡¸p¤Ðvž¦\ožÝmŸLÃ-ô„.}-T}}0ÄýárªùÕm ïfB;ØÁ¯&GK<'Y£ãx>ZâìR\\BBÿ’µÂž¨î{GUœŸçoó} Åűh- oÚÞÌõÆÆåÏH°ˆ»-!6AL›ÌìM'û^ŠÛç_ŸS{&éÎç¸&÷µ¸ûÖÿ&¼/|ù§áӻݳ^Ä\f<ùÏlŠÇ•ª+‚aŒM´Ð#ÆXlvK\<Å䨈z)&q|¼SõÂјÎ\SBØÌàV`"…$NΟ‘o·Mf“gÄ'ÄÚÙìyUóï[4+î±Ù½7Öþ6éÉ­ÿ­á‹=½)î;6œÆV”!îv7à ¿H±½¯†¯Ò·/ ÒÔ8aJT”D±X§°Ähéu÷ºï•f,Šês¹^>mú´ü¼©ô#dQpBi™ÇSZâu¨Ôã)3ó¥Þ…Kš :ÕÄÇKsä;XôH‹õÌDî_-âÅqF ámÁ¸G{U»Í1Þ:^°ŠÑNòϸzFGK‰ Σ¸Üø Þ c÷.ÂX8…ÅTê ç.ã…ÌLªÉš[!~¼ÝŸ0Þ=½§Û§¥)-âôÔ<Ö‚u]#'ÖW:Ó“LÂÎh¡Qˆ¸4·z Ÿ<Á’ ÷¤wjŠ-ùŒõk0iÉ=_.‰)¼€h5écC—Ö_ÅîðnºÉíDF\Ñ7°Âf“~>ü¢xäªäÊ#o€›=M4ò©¼ŸÚ¾¾zéëwëÍ,!Cëèa`#˜LÝìg8D<4½ÄŽÙµÐ æ–Õ–U–fÖ¯èh[›]×Ù¸íJo©·A\ïhDQ?j‡ñN=ÆÔcñÉ |ªÕ /‘y¯9»ÌÙf΀—Ô(ƒµKÄ]ü¢d>ã‰ý7ÆÑ|Œ]®†:h´z•Yé ßO«ý´bð3†±º›B»›Ø ;i½“Ö}L l¥l;‰ÓIœNât‡‡%DÕ‡%¦ÅùD^ç›”—¨b¢¼&å!o¢<&%3k­êaü«±î`ŒüÚšqòQjª¡dÌ n™/¿‚Ï‚ $ÜiÎ÷¨ã\Ò‡.é=—´Ó%Ýí’^ÁíPC‚ÕæŒê¸étTV#×H7ÖHGpõ7rª#]z9] ¥K?I—îJ—zÒ¥ìtÚ=@-·„?1種Jé«Jé—•Ò£•ÒæJiC¥´¬RrWJ-ÉÒ¤dé†dzzÅ<³+"h9¸Kzpñ.ÈõÈ%!üò`žœ™•/‡p[°>‹Ð½Áúä’ñ¸ 2x¤Œú ƒø.ð™x=zM¼½¦ü»AOm[,z’К`Ñ0•cä˜Â•Á¼aâÎ Ö7É%˜7fs*ø¬Îí&ñ”`ÖÛr‰'C¦{ä™bòLõ‰cجO#uaÕ3BˆA9¼5Äð|ÉS'_Ì ñĹ²úcFˆ½”?ðRä?xšäßUÊÇÉÂëõÃò«žÕòá,sÃO}G ëðuƒ©Qò3žÝòÓžmòŠLñÞ<ÓÞÃõ&z(ƒ˜‡ämdfm}`‚òíy†‡(yY\™U%·û15FÎÉš!/ð‘k=·ËóG=Íñ™¨ÂsØLçKU*I‘K<)òMEo˳|”IP.0¶åi£Î§æ˜éåÍ•3)=þ<¥>WžH.QÍ–o^..ogˆÓE¯˜&¦ŠÄÑaµÚ¬ã¬ÑÖH«Õj±òVº·VGH?£f¯¸Ãb3…7fÞ\ÛŒýßH/#C+£«B}³†;â{ŠÅ±Eö‚rßu¦æ±9ózOŠöpÕ‚íù”Fmª±ÐS«´éFÃ2„gñ¿o?5P#Ñn<ë¯3ùn_c£³J›[ÓÂOý+B$XAý !ü”Ô÷B•¶Ð´Äò A½Èˇ Ã]Ù|SmÛ¨š‡¬šÏ@†Ú0xL56ÕÞ6Ô¶fø}¦Š[M•­BŽ¡BÜK[}©©¡×ŒÛ©™†RLCyy¤R”g¨ LÍ#…¼©¦Øó8kT\7*®3Å‹¿猊÷ŽŠ÷’8óô´•þwz?¾iÑA6+þ6ÍÚöj’ûZ\®Mµ–iÍ-­í´i+m>m“âs ,ÞsñC¼Xñ À}ÃÀµÍ\¬.6Ï[v¬ñ_ãkÛU_kv\ÇØÃØÃ×ÿuÄ~C¼Åðå7|ù _[Ô-¦/#7ÿŠ¥k¯ótßqGÓÚµMðoÄ ¦J endstream endobj 332 0 obj 3309 endobj 333 0 obj << /Type /FontDescriptor /Ascent 750 /CapHeight 0 /Descent -250 /Flags 32 /FontBBox [ 16 -179 699 676 ] /FontName /LCQCJB+Times-Roman /ItalicAngle 0 /StemV 0 /MaxWidth 1000 /FontFile2 331 0 R >> endobj 334 0 obj [ 333 333 722 722 722 722 250 722 722 500 ] endobj 97 0 obj << /Type /Font /Subtype /TrueType /BaseFont /LCQCJB+Times-Roman /FontDescriptor 333 0 R /Widths 334 0 R /FirstChar 40 /LastChar 49 /Encoding /MacRomanEncoding >> endobj 335 0 obj << /Length 336 0 R /Length1 7480 /Filter /FlateDecode >> stream xÚ­9 xSUšÿ9÷ÞÜ<šô&i“4Mrs{“&4mZJß4múH -`©¥´`±¥€EœòPXF¨`Q¾ÎøvÄwÖTBetQ‡Õ®À>wôóµ3è¸jçµèèB“ýïmQÜÏÝoçûöžžóŸÿqÎùÏÿÿç¿ç¦@ vÑþu}`GÊi¬ƒýƒ7y_{gë}¤€«Y³ášuK_|Ghv0ñk®ßº¦é´ yú¬ ¬î[õûMÑç2Îâø²$˜^L«ÈÔ"îXwÓi,E<qïõëûûÒèn@|â–u}[6hcô!Ä{þ }ëVÿÓîŸ?‹øNÄýÖoº 6‘â!^¼aãê ¯ÿe3ø;ü2¤Pö£ìHk¶BR(|ûaàoyXµå¾ƒ£ÁŠ«s7a­'·¬Ì:p¤ÞÆú1Ö?'—¥’\ $ŸHýãBùŸÌÔéG‚'ànx¶Àvìß B4¡†ÁBè†s$Š; ð#؃r_€šá:ò®ñ$ ÀË(ç‡Ü6¤¯‚AŸ (ûð”ÃrØ ‡á$¼‰sçC;, :šzfÃýp–ü‚eR#8SÊ`ì†ý©ƒPœi'ÜFd²)5 =XÖ¡^?€¿‡×S¯â¾xЫ:V£äb\é0щ’!´† Ô§Úp¥Nq„hisj#޲B D¡æAê}3Ü¢f/ÂÛd½‰M5¦žKýZ‰Ÿ‹ZTB \á&\á>xÆá+ÒIM)_ê‘Ôxêxê(KÑ'nqLýÜ…š^ûqÞîø7ð6–sðI#sIi#Cä~rœ¼FcL³‡cNL} .´Lw“‡Z—Ã\Ôû*¸úpå;á`uü¾ â#%¤‘õû yš¨Ê´ž¾Ï„˜f=û {Ž‹%÷'ÿ’êJu§nLÅÝ¿‡k);Wì´V Æ«pïƒèíè;¥ì²~ ?ƒÇ1ÂÁó¸ò \ûexÞÅõ?…ÏP‡I8_ÂE˜B-Òˆ€%“¸°øIZ­½ÚF“A²ƒì$»Èn²u<@Ž£äWhÉfÚE{èvº—>K_¡¯ÑwèÇô3úWFǸ m|’mf—±9w5w3·“;¤)›:Ÿ,O.M®H&Ϥø”)•—LmO=œJ Wÿ¤ZR é`=B¯.À|´ãi1zw%ôø}³­yÚóG¸ÃÇá úéK¿Âݽ‚^>Âý.À$1!°hç,ŒçŒƒuôfº‡þÞC¤?¦?£?§qz„žBkü&cbüL9–³€YÄô172û™Ÿ2?cždN3g™Iæ"3ÅL±%l%{{3{7ûû6–?qf®«à–p«¸ë¸¸aîn”ãÞå.hÊ4q^æÛù[ù½ü}ü(< /ÁxÒ.žƒÌÿsnû.úŸô^ò+Œ¬Vè'‡À†¹Žr­àÆê`îÃs ©ßaÄúI²ó ò’Ï¥Þd<8ûÚÔ›ÜNôá0žx žˆ3ð1«#‹0\Í”`ü®ÂÌR-ž]T.ÈåÍ rý>9GòŠ·+Û™å°Û23¬³n2¦ô:-¯áX†ÈÉM½ÞxnoœÍ•çÍ+Pp¹ }—zã^$5}[&îíUżߖŒ¢äšÿ&–Œ~-Io5Tä{c²7~¦Qö&ȲÅ]Ø¿³QîöÆ'ÕþBµÏ檈IÂÞ˜c Ñ'½ÞX¼ip`8ÖÛˆóGFÿ𩾠ÆÍ¶È¨A™9 }Û‰XÜ)7ÆâYr£Êcü±¾Uñ¶Å]±ÆlIê.È“†~yeäúxzhf¸:sœoˆkpjïµÊ`Ÿ÷pþ±á;¬ì ¥­’Wõ]Õgúº•%Ì¡¸]nŒÛ·s|ƒ^êÅî˜a~ˆÌ8õ7õ­nBÓì›7ö*X߈µ^éÅ9éPwWœ áÄ^E]EõéM¬–c ¥w­7®“ëåáµ½hsçpÚ·JcNgt<…/¶˜w¸£K–âµÙrw_£ëp ·o}:+êÍú6§ ܱc®„&/¨+¨Sà\ɱcþ~×4ýÕcUnâ„­í_[(ŠÈóqqo¿è’q+J³º†û+P Ÿn‚F¸6®k誛r~AöèFyò³oSúf(¿ð9(]ÅÙ_ ò/õã¡Pœ&FI‚æE­ z #¥¥LŒc»uÉqr=8BÂùê©êEØ.œª†Úja QlfÉfÉÀjÕ”%.Tqÿy"Áœ¸Xê΄Yå8®U ¿î²YmÔn´›\î&Ërí*y«ö{ò ·ÿËKÆ—,oùÞò¢2­¥–ÌÌ‹¯Ø'—Ì)µ{-~Ÿ_öù1½0“É%2·;B$ÄÝ5³´ kV©OöXfÍ*õxê2¬¥sJJ-–ÒR¯…e96ä–ê뢅§CB5) U‡„c{LaGh»0ÁsÛ_Ÿ^Ÿpáu³¥²k%Öp8Œûœ²W«ÙbW(<'„-Ê;x6|©K³‹Þ¶Ê˰XkHiIn TÊÔ𞙣/#(.{¦T:Ce o"™vMó²ó²/Œó;iQ‡/â\oMn_4T:wg…*§$ýÁWNîÈÕ”ÏÜjehAöü$'i2*ét\šQ«ÓYYà,V ×Ìrz Nw¶Öj±x-œÍñn5 Ýzû²(<Ës!!¤„ÚTu­vJ[­D_eáÄZål¡32étœÏ:Î÷8#SN‡b5ÎHކX%&P^’"M£X%Sºy¹¿&‹ÌúìþÕò¶a™[²ccòœžÓµ\?—x«t[Ù|„'s“c\óŠž‹œä Ø«ñÖ§žWWêcæÞ Isô• ŸOð¹J„guµÚ{ìÛr¶ùnϹÝwÀý ô`΃¾ƒîƒÒÁœƒ¾£î£ÒÑœ£¾—m'í'§Ü§¤S9§|'ýoä½ú0ïÃÐW²W'—Ë]P ;f`8[ÌØšf`aºìsdgÉŽt»h§v³M¶k7 /k[$ÝèÊ>± ì2 ®"ûf§›¡ÝÒÃÙ˜òD NÎ6 ¬Ý»¦0z±<`PI³‹Ò…B¼¨œF›å(+RòX­Ù^¹‡ ‡L‡{´˜”Qœ€€ÐRi®¬ )ŸO†.’ÏA˜Äí™ÂÉ=˜&´8Zií¥.zêFL sˆ¾|i )¯!sìÌ×Ñl"œc}i79'7&žq‘(eætT®uë¶hè…ßþ$ÔL6·ìH^ÜÛ({$Û,1Ú_—×XiH=W±Ïé̺| •øtŽ:õ;ÇöûiLNÛõ~òÅïçe7g~ïúºÍá;–6&ïRýëO}¼ÁÜQbŽ>Æ<µÁ€¿ª2£lÖÚÈÇã“—æ¾x­ò͹él„­ ¸ÊªK#͵݆ÎÈfÏË]™C™®ÜAl6ð›ƒî|‰HÃz½lhMŸSìq‹¦Òg®LFRp~°Þ3§¸X´xÜžZ³%-¨Ge¹-¢‡| ù†F÷*÷n7ãöy=+=»=¬§¹Þí<žz= ~^]áài‡rXÍöB|MÜà‰ž=ޝÝ8yɇ—ÒºâÄAꥬV7­—škš ZÚfPù Y -Ô™™E²::—ž~s¢Gxýugä„Ã9}†Þ©¬|G%ÔžWÓ’–Àñ!!‚GzHO.ÚÐ&â{O1^¦+ tÕdå@ yER6ÓCC£e ‰" ¹<Ë«& ‡QŽJ ·´²(+Ía’y£6+»Â¿+lµzf™f9=ºõ¡ùμL¯-sYqA›/'37×cÈ08 \ÁOü¶ “Ý]Qá …—^Qì6 5gªëŠ¢vãu¯µ²LVëìçù“MÍzVÌM·d7WÌ)Ö[Šsr9ÎÀñÿnIôª¥RYõ"ó¢ò"Wô¯Éÿh* fºÕûNêËT7~C¯Ã¯ûCÑU6Ò•{mî–Üûs9Ÿ?”8ž'‡\Y¦4žñ騀ÕÎ]<Ë $i·øý¹~I$«.õ€ÏºMªsãc³xK› ò5  >ÂÂc¹­2ž/ ¾óʼnó““ÌP‹OõàT£Z8?‰jÐW*ïØ=Üö 5íYÔ”6ÝÃkËäg œ&ÂI奢ÃxŸñ’z5ÁðF·© \ò ’Ò–KŒnêPÔ±Uåd ‚+äôûn\Îwú¶Îm dç¸mtGòƘ[ŠÒ³d*j´ˆÑ6wP¯7ñs¢–Ëz}F£äÆ»)½P4_;©æ'õéaRýW§WNˆVÅ_Øz bÄwãí¿dAwI^HbG ÉŸ&jZ 4uçeßÊZöw©I®Lì¦Ô$» Ö3w‚‹ð3w¦Ž3îÔ—ÊožDOî &üúÿˆ}Š[4£ö¨¿GjpEK1ÿ1¹q¢JXf´Ð(ßÓËšÚZêC×®[½©`þM}×_Ûê/#ú3ÖÕ°ú;¿ä•m†¡Êa,†åÐð,}ˆ¤A5ˆôž±¶J1AŽhFxz`þè|:ºqt=°ñÀ>:*ŽVÑâ*:êm£¼Úh‚Ž<]U"f&è¾±f1#A‡Xôv–Ý‹Àœ { z‚ôB`JÐÝŒ º ^unE`HÐï#ÀûÎNºý;ÚÝ€OÐí4 z .AoFÀ&è6L‚nE€ÊlA€ß›@‚FÓB@G”´Ñº !7À0’µj»\m¯TÛ µÔ–=²Á¸~ƒ±NO~ ˆWÛ~µµFMÆ?Ï ÿeÀø<€…Èp«-ÍXh<³Ð_h^h¬^h,^hÌ[¨LõhAþ9µ•ÔÖµ·¿h1¾Ñb|¥Å8Úbìo1–´ý-ÆùרyÈøîññ!cîQ2º‡úÔ‘ôÖtÐ%OA+Npv¬-_|–¼^Ü¥HþyÌ{T¬Ë"Ç ŠUðçgà8ˆ*|ˆá!èPá“Ð*ôÞ±¶R1AVŒµE\5Ö¶ Á²±¶ºÇÚVâK¡MÒ1æ='Ö™I;¾”¡‹f–Xû¨ |á¼1ñÝ8Ö°R¬Ó‘:hPÅjpåN„.Eñ:#Éœ™Æ<£¡ «Â7ψ“U Ò9&~‚óøÇÄ;,ß$è“Qƒø^àœxºí.ñT[‚"ù…$‰¿ àgħćÅÇ*åÑ€:Éi±‡¼ -‚{§¥ï ªSÞLŸ8#îP–ÄÙ·ãÛ‚gÄÔµ×Mƒk‚8¹k‚çÄ•â÷Åö€:þ ¯Ê]С®=¿êŒØTçoBÈ3bÌ{F¬ª GE•Q;•OO[6ÍÕÙfïS‰…Ó;)À-æw¨º‡PM4]ô‰E©áq‰¨u#GÉ.üÀ!;¢•üÈù‘üÈ&~ä:~d-?ÒÉÌãG*ø‘0?’Ãxø ­E+hMÚ4­^«Õj´¬–â¹ÈH¤>ˆæ)Y&C#(@Ã*-«ö 3ÿÁD‰–BKƒƒ–îÅzÖÝXoźë¬·`݆u ÖA¬Ã©žVFÓazËaº{ Ý6CÜFo›éÝF·Ìô¶ÐAµ‡‡øieM„c- ’Š“;ãš½]q'û³ã€m·Ãf¬uÔZjÌ•MßÑôδ¡oÇß< tùCZÛ¶þÃôhz‘üRm?Ë/óâA^•h½FTU`Dy™™p¸ã÷¶^ÙÂÝ/V:)wwk<¬ü>6Nki$Ö8NkÐÝ5ïÑÚX»B‡÷»Ql™*†Y»Å J(FžQCežPÅú§Å¼´FkSŠÑÍàUżt³*vN;¼±*Öx¸ªJaŸƒªÈFö¹ËDö}[dŸ*²oF$[ P¤! ˆÎ  Àá@ŽÊö}Ãî˜f‡§Ùa•]þ ;8Ínžf7#;ôÿø¬®ÿ[¤c×^YoÃ+Cý’æÓâ¹>ÎËÿÓ›fìü šúš endstream endobj 336 0 obj 5424 endobj 337 0 obj << /Type /FontDescriptor /Ascent 750 /CapHeight 0 /Descent -250 /Flags 96 /FontBBox [ -28 -82 768 682 ] /FontName /ZFRCJB+Times-Italic /ItalicAngle -15 /StemV 0 /MaxWidth 1000 /FontFile2 335 0 R >> endobj 338 0 obj [ 667 556 611 611 611 611 611 611 611 556 611 611 611 611 611 611 611 611 611 611 611 611 611 611 611 611 611 611 611 611 611 611 444 611 611 500 611 611 611 611 611 611 611 611 611 444 611 389 ] endobj 26 0 obj << /Type /Font /Subtype /TrueType /BaseFont /ZFRCJB+Times-Italic /FontDescriptor 337 0 R /Widths 338 0 R /FirstChar 75 /LastChar 122 /Encoding /MacRomanEncoding >> endobj 339 0 obj << /Length 340 0 R /Length1 5800 /Filter /FlateDecode >> stream xÚ­W tUšþï­ª®î$թΫ;¦ªSIºMçÁ#òè4„`À€ &„@@"1`xI…&Âé8(8"E›e:‹(#ì("êèx8¾v':®=àèHºö¯êaÎìžõœ­ê{¿ûßÿ¿ÿý·nß â`;0àkïjë†~Êà÷°L‡4n!$2] Çò)–¯Ã‹µ0Wùá§µÿ`2PþWÑy\ð4Ü/Á&Ø†í» È…Y¨õIh€%>˜ˆ= »Pî[p@-ÜB>Â9žNxå²Áû ûW@/ŽÏj”ýWxŠá&Ø Gà4¼ƒºó`,„StH{&ÁCpŽü†e´j*€iÐ;a¯vò¡5m‡»‰BÖkc°ß.´ëçðOðíMô‹‡ÃÆ2”œ3!2øH?FÕ "Ú3q¦E8b˜˜i­Öƒ£¡|P³¡íÞ ÷Â~´ì$œ'ËèfH«ÑŽk¿×׎ÏA+J0;×ClÀöÁQïÉ"jÕ²´Ç´íeí+#O8AÂ1åPz—Â*Ø‹zCèñ»pßQø„Ä‘¤Š4’~òy™¼EýL>³‹ ²"'ißAFÆÞä¢ÕÅ0í^7Cμþ†ÐÆÏà[â Y¤ˆÔǨ“^GWÒuôýŠeØAvTṵ̂„b&xŒäT´¼æâ»ã¶Т܇¹{-{NÀÌ̇0ßÃ%ž˜‰‡¢ö9hß»äj¥)T¡3里—©`Ö±o°£œ?¼7üÖ¬µh·iÇÐûp.Ýs=N7Á2´xúÞ‹ÙîÃÜéï|wãð<…+ì0¼€3¿‚s¿oÂû8ÿçðÚ0à;¸ãhEñM&øf“|ŒZfµ‘Ì'½¤l';ÈN²m<@†É1ò*F²–6Ó¥tÝMŸ§oзè{ôSúý+caœŒ c|š­e³‡8+w3·•ÛÎ6M¿.ß^î ŸÕxͪåj½Ú6í ¬þň¤âÁ fÄ‹Y‹_ê<\Oó1»Ë¡VÂ-˜›MÍ}χÑçàæé7¸–^EïÞÀ¬¿Ÿ g…`ÂøÑ³çT\Ϲd2zT‹5‘…¤™,!ËÈÍd%é$·‘-d+ú8ˆï^òsôò1r˜!'ÉgäùÓËÑ8j£2ÍÃÌÔÒ…ø¶á:è¢[é.ú úÝO¥OС*¦g0_Ò0ËX™l¦_?3—™Ç´1·1{™_3O0Ï0¯1ç˜1æ3ÎŒ³El {=»•½Ÿ}‰=ï_8WÈMçr+¸[¸[¹înˆ rïs?˜¦™T^áðwñ»ù}ü„ßÁ/ñK»ú9ÉÿçÝëax–ž¥~ø>Çì ÓñÛ™Dž…Fv1œÂÝ'ƒþ>H^Å•Uíä0¤à^G¹zpbq0ûð»íOXư|ž‰û òÂǵw˜ ¨}ö·s8€_|~gáSÖBæáþq3S„ëwî,|“'M,,ÈÏóæ^çqçdg)™.YšàÌHOKuØS’“lb¼Uˆ‹±˜yÇ2”@ž_™Õ*«9­*›£Ìž¯ÓJv´]ÕÑªÊØ5ëZUn5Ääk%}(¹òï$}IßI"ÊeP–Ÿ'ûY=[£È!²x~3¶÷Ô(-²:f´Œ6›c.ŽýŽÎY%­²_ÕÛ9ào­A}#åC_~“Ÿ#¶”ò¡X]³ ÕmÛ:º„_MSjüjªRcð˜lÛ µq~³¿&ÝåjÉÏSIu»²\e¦ï74«|µjªFÕòjÝ”ä¸7$ÂòVoÜ eEÛ’f•ikѧ°yU»R£Ú·Œ:~$/·ü÷F™#S¥Ù³Ú:fahgGÈVj»©údÔIû[šUÒŠeÝ\ÝôˆŠ_ïi]#«e¦Ò9°¦cž6 Â‚Í®`ZšoDÃ?6¿<ÐÔ¬¸ÔÊt¥¥­&ãH ,Øü\ªON½–“Ÿ7âè›áÂäWåWé8Ãåè‹àŸwDúß<kÈú±~Á•¨Ýez¡Êí2Ь +Óõªc: ´OG1|Zaµj©nKõ˜rÙ¢"\L£2öŵ=mÑS¶xô¦žì+ ù—۪׫ææbÎ1?˜&4­Â蘚Ÿ×«¦+Ý¢¬¦c¨ ãØÖRZˆqw¹ô” †|° uûüæ-Ãòô ø ½-*mÕ9'.s’êœí—9W†·*¸‡ƒO²jιò‹Sý¥*Iù_بþ½›<óèÿz3}–÷gòS¢¹¾D†ï'j¦ŒŸc[,á²^ñBÙxÙ<¬ÆË ²LG«I›ËæÆ’hšú¡”›þ·WBÌ+—¦ë;ѾÖÎ3c8W6ìôyÌVsŠ?ù©6%ÍîLI¶&9“Kzš•IöS¶%-=]Nkvˆ¼éK“R’©Å#Y¸rÚ—™*äx¬¢ äĬýÄáõŠe¤Ð[æOyÆG¡r Ûe-ðnO-¡¤Äk³—ØJ ŽñD¤ž4‘,†;’)9Éž2erñ´bü—œZ”ãžêJ¶ž1ñ&%3gjÑ´)}Shr²41UL"\\ÜŒåÔ¼ <í­¢«‡vûôëÆ§äš%«71Ñã¨e󖤻ó—+¶pé¸e¤ùàí¾¢RÌÀ:ÜMyô;úÒùŒYöE±‹ì»-÷Û·ÿ.ÃìwÝ7GãBtõpll]B 6|E>óã.‹…‹ÌK" \BbWËr1ÒœéæÄ„9K”XŽuz8‘e1œ…¯] Ç9žóŠÞ‚¨/«4›ËôH”ž:uŠˆç ÓÊÇÒÄÞs…Ž KÓÊÇÓzD0 ˆLïNt1îâ¢/!‰ä¤{²këMÙ©äº/êP²Õ‹³¸…}=áÑÎR·v\uñ‰®%lIí0Of„ƒ\í²¥—8WšÛ^†'ãÄž¡}ÊÆÿœBRë{#)+KÌÊ(‹2¸ÄŒzûRû–Ì-Y÷dÞ“uÀ¹ßµ?sÖ!ç!סÌCYÇœÇ\Ç2e½žrÚ~ÚqÆyÆu&óLÖéì·sßö~œû±÷{E¶($#ÙŸï-pD± ]mXZ£X¯d9ÒSG¼]²S»-E±›»I§‡WÌõ‰%KÊ/Ȱ‰ùDÉšoÅ b|A:~>R*(H·‰¬]‡ÝTè©ØktMš/âŸÞksbK°—èËÏ«•¸èvq^+®Â]æ‡Ñ zð§/Ë\“¸4‘•yqÌ{‰\Œ¬Í¥OïÍÛN™q´^‰æËMÌÔmxœŸY±üÔ R\A¦Ø™«0—YÔv+Áeì. nžÉ >ÊLi*Yã´l2ÑþóWÞZ²±®/|iw2Á•räk¯Ê­)±—»–.a[l–¼êâã9šsiQpo–#ŽÉÌd›? Ÿ¼37½6ùöµU î½±&|Ÿ‘_ã™7üñÍñe 1ô‰‘6_FmL;; ž:Àr嶦ß2!Œ 3„>dN3¥Úž«Î5,û'mŒÙ£}Í®‡uÌÐo^Ó HŠhVt^o&Xƒ…â­E„ÉxKü”<„41$¢³™ô3άš¦êº™Þ¦Õ]ëóçlh[»º=zSÔ¾ÆÒÿðtÅbÉÇ{Þ6Ÿ§8¼4Iô`c‰¢÷û¼ˆS€§æ Í¡C=Cƒô@ÏA:$ •ÒÒR:$5ÒòF¢çJ‹¤ä ÖJI!:€¢÷ $„èn[ˆîBCôn„øíG°†èN!Dw àVqBlˆÞ‰€ûÅvKˆþ Á¢}|ˆnC0…è\ˆnE`Ct ¢›ИM¸×oD€íõÅ#BÀBô¼ÙW•DËÉ­Ð Þàõú&£¾Á¨“ŒZ4jv¸[X×-TÅßã½P /u»Q'ú¬ÂWÂh§ðr§ðï ¤/Åq5çKjÎ6jƒ0Ð ”5“„Ü]Õ7xyȨQ»Œz‚Ï^'|['¼]'¼Q' Õ íuBQ]'„È}¶~áý~á©~!§_Púg?ö>;_–cx®Gç‚yÒóä$Èè¥D~”IU©ä”²:ýBG@2ð(T“lÄÃÐdà3à6ëý­ÁÆ©Rˆ, 6–#, 6.FXl\†Ðl\ŽSÜƦ <*UÙÈ •ó¢S4À Õq.â3ˆ³ƒÒ*]¬^.UYHTb8ó"Ä Ýð*$GÕØ¢Z±è|aX:+•†È¢ ôêÉJ7…X”>t‡è3¾Xé÷¨ôZã}Ò™ÆÅî—š°;(½èÆ!G¥g¥ƒÒ“n£çq·¡ä@Dì9dFx0"ý€ÇPy¿'Dö•~á>+õéS¢öm¨`‹ç¬tkµ1wWVyp4rWzF¥åÒÒ·1þzÙàÎm2æžSzVªõúg¡ ä¨ä—ÏJ3=ÆÄ>É`TF¨âˆÚijŠdh›4htF<ÉGóš Û½hf¶/^Ê’z$Wõ*i¡d‘,cdv¤ÏWÂåÛùÀz>p XÃñÙ|`:(à™|`ŸdN0‹xV‰3ǘÍf“™5Sü.’BÚG¾\}wI2‰:˜X½f¶HõšF¶'JÌêªtÌt7–»±ìÄr–íXú°Üe –MXz± h=§¡ôŽa1Ò¼ƒn‰vn¡wG[wÓMÑÖ&Úk´ð#~NŸ1X"Z¿Jö¨¦ÝxUÉÞt¸{[))½•ŽÊ„ [ɬšPµFkïã'ð^ýúÆÍ/â2ýC/‘úÈQ^z—ñ†Dý (0†@@¼Î¢§ú`ý ÍêÓÎu²ÞМ-õj~W¡•´Ü_3B+thih¥ÞÔ´ ØbC wíJƒRPŒ< ’.†Æú`à¿w”£‘ endstream endobj 340 0 obj 4102 endobj 341 0 obj << /Type /FontDescriptor /Ascent 750 /CapHeight 0 /Descent -250 /Flags 96 /FontBBox [ -10 -19 768 682 ] /FontName /FDTCJB+Times-Italic /ItalicAngle -15 /StemV 0 /MaxWidth 1000 /FontFile2 339 0 R >> endobj 342 0 obj [ 444 611 611 611 611 611 611 611 611 611 556 611 611 611 611 611 611 611 611 611 611 611 611 611 611 611 611 611 611 611 611 611 611 444 ] endobj 112 0 obj << /Type /Font /Subtype /TrueType /BaseFont /FDTCJB+Times-Italic /FontDescriptor 341 0 R /Widths 342 0 R /FirstChar 74 /LastChar 107 /Encoding /MacRomanEncoding >> endobj 343 0 obj << /Length 344 0 R /Length1 3708 /Filter /FlateDecode >> stream xÚÕ—{P”ׯŸó]vƒ° (¤ˆ²A$DQ.5„¨­Uk¬Z‹Æñ‚N*BFSQ$Æ"I¬¥–Ò$M¬1©n‰QcS+#Æ66šSmê]Z¥©ËÄe·ïyXÓ™Nûogú1ç÷½—syÏ{ÎwÎ •0‘;»¤¨Läbi‘Òkö’ŠÄ…“«,‘¯FLqÙ¼’¢Ø2·È~±ÕÎ[°¬8+¶±0׋ óç͹²&7°EǃóÅ~T½Yô¾óK*–ÆœQOˆ.ýÁ½ tv‘ªÀvÑ;DïVR´´Ìuzpè1•̽Ð{‰!z_Ñû”•–Wñ‚èù¢?P¶hnYá™[E/\ábSÐóÑ3r@â„WæeJh m8Ž!Xk¬ÃpLE Õu4ª¨QiX'Þ!G#IÉFfš[¤Ž'±'8&Z12Œ{å=S¤V½a XŒ&µ MF„1\½…£^­Ä˘Ž>VŠÔ¼…s'JelE¡õ„QíÊW±X¹QŽBc„1!Ì@uÙöhÌÀ{ða‹Yb\u"_uHïóqç1ØÈÆ,Ô³$Ò}ê¤Ú¥N«‹Æ$| (¿:ná_±Ì7mvvñx»DÇpÓ ùÇè"Uâ×¥Xm´©™ÿD™}2°ľYêùaÖ!Í”ÈÑŠ±ò—jÖ‰%Ë®ù€¬À$û$¦«z,v<#¹Ÿ¹K5"ˬ³«Ô!êu2Z”ºìH@Žå5R…X‹VÛg 3Nã)T·¥æN|f×[$Qv½Q¥fuåìI¨±k#™ñÊ{†¬Hû&©½FÜæµínnì#ÆU#Ü1sìëªMu89’U£Ý!›¦J59c˜ò;²Ô>GŽ#BZTI÷-¯^Äj¤ç:¶e Ý>#ùës|¹ß,H<<Í›6àßÔD·3ч‰¾îË÷ƒ ¬x{šÏîå3“]>+9éüsžO0nbAâå•êvÔÌ|1N.Qkbû¨ü4½k 6YÅök²gˆÍ ³àP.Û°0¨ålKܧZNµ¤G{¼žd¯Ç[lÁ_nÆû/69#:n.r¤‚_ÀØÀh{¬d+crS#=®hg8”}AŸ^÷\Œ9×#Úæ’ùQÝc¢âܧšO5{bsd”K·š/¹ßoóäDåäxrið?ï?S¹#p;ò¨¹ÁJ"1¨+ÜH•yF續õ¨± , AF÷_OWÞÁ^+Ü?ÞÜ©jdNf°°NÙ÷3/ ¨ÈK…­\:9PR ùÖ£äB7\R'^¤n°TœR Åk”¼£å'm"+؈“šÝÑÛýñsCÛ‡ºîÚ;Û1¨ó£ƒRn¸Ïu¶wfHPÙ^SJ´#)7¼‰±Î~I÷¡G ²2³­”;5éVùú;­éV웿 ®Ö¨*NÅ5§ïn¿دr¯|Ñh[ص0ðÐK].µ¢¹ô``ÿqéZ;–è¬þ™Gm×SÓÏþwï,»û6†VW½ÐYÇ6v}g½œSÛîœu­úÒs÷±¬ã(¶wb¬5Òz–ØîCÖ«»ãZxZJ¼äEg3Wò ç59U(ª¨PŸÉFçO9vDÿÉËJf•.Ðû–Oà-}6ÿ‡Çú—˜4*•Le‘&ž” MÉÙIúÉ;ädùò6ÙNÞ"ÿNÞ$ÿF~Nþ•l#o×É¿è†?Sn•oŽìVjZ6q•òò2y‰¼H^ Ï“Ÿ‘$Ï’ ?%ÏŸ§É±Fö¤-ï$Ñ>¤íC‘-üžò‰µåÊ¿#[Èc8,«$gÅ³ŠžUØ/žJ¬”QmzL¡ÎðJ|CŦ=¦PgD[ôת[® —Ë™¡k-ïÒ8ÎÓ¬µŒ–¥äSäÎzq^×w]ŽE%-Ë»4¶ÔS~·”qõŸ¤§ ¥\ý2®~c+ÅBô[)W¿”±i‹‰ï²Í|r9—œM>N’ß!gÉï5ý­?Fm:ãœF¹€ü69•ü9…œÌ•šDy"ù(9ü9žGŽ þI"ýûMK>¿è‘”Gyd.g3œò#ä0r(9„|˜Ì‘Ö¦ì9-g“_%³ÈL2Cl&Ò)"’iäŒö§ü™JÞÖ·ÖR¸CûQN&û"R˜$7†)7É&¡—öDÉ‘)¿3uýÞ´$PîEÆçu탯÷rì8ÖŠ%{’=BtKvbà‘myk[´ÜCãD‹æˆQ!_¿F-›Ò&@ê¶‘üº"héN†“÷ÝÈ0ÒE:1XèÓÕï(ðŽâ=¤ÿ‹H uÏŠñÏ”ÙÏk¥ôþ¢”—¥ø¤ì—â”_&ã«kUyÿÿɃþÿwOÂ?y( endstream endobj 344 0 obj 2123 endobj 345 0 obj << /Type /FontDescriptor /Ascent 701 /CapHeight 0 /Descent -299 /Flags 4 /FontBBox [ -39 -216 662 745 ] /FontName /FDTCJB+Symbol /ItalicAngle 0 /StemV 0 /MaxWidth 1042 /FontFile2 343 0 R >> endobj 346 0 obj [ 744 549 713 ] endobj 121 0 obj << /Type /Font /Subtype /TrueType /BaseFont /FDTCJB+Symbol /FontDescriptor 345 0 R /Widths 346 0 R /FirstChar 33 /LastChar 35 >> endobj 347 0 obj << /Length 348 0 R /Length1 5684 /Filter /FlateDecode >> stream xÚ­W tTEšþ«î½}»“t÷í¼ºIÒ}oçvÒm:!!!NÒM !b€B ¢‘™ð6 L”Ó3¾ÑqgÇõAäÒ²Lç Ê ;‚€ãct¯Ý‰ÎxÄÑúîo7¨{f÷윳·ºê«¿þ¿þúëÿ«ª«€@ žþî0öœÁìêÚ ½ùÞæ±þW³f`mÿ²ãbC!£¬½ióšw³ïØ`z€Íéëí^ýLJ똿Á>e}Ø`9žR`™Ž´§¯æ”[ évmÔ›Ö÷t“|Dº ic÷¦c€>‚tÒÒÍÝý½‡w>Ez7ÒyëoÝ >‡‘Vö öüîË<Òïð˱€6mFHE¼ØD ÅlÀ<²¸%ÆôC€ú.æs˜ÿ[®Æ¸R(Š=­þ“ƒò¿Häøç†§á>x 6Á6¬ßQðAÌC¯= -Ð “$ÓqŒŸÃ.”ûÐ7’pŒg ^E¹<Áƒ‰í«aûçCÊþ ¼åp-l†ƒp ÞFÝ…ÐKàW߀ð¼F~Í2j5CôÃNØ£î‡"¨FMÃp'‘É­ê¬ÀÔvýþ~§¾óâ!I·± %ãH‰‰¸H€Œ g,  =Ó¡GZŠ=#mT±W”Bê`>t Ý[ánØ‹–‡wÉJºWƒêQõ·Z,±>ZQMp5 ÂáAŒÌ|K–R‹êQW'Ô—Õ/tÏsàûTC3ê]kaêâŒßw1MÂ'$…Ì%u¤•Œ‡ÈËäMbŠ˜]L„8QýrÐ3^œMZ]sÑîëàzèÆ‘ï‚q´ñ<|MÄCJIrˆ!¯ 'i]A·ÑÝôyú:}“¾GÏÑÏè_ãdÜèãSl#»œÝÏY¸ë¹­Ü0wÀPvé«XylYlel(vVåU‹Z ©ÛÔGÕ(FõOº'`;È?Fu!,ÂÔŠ+m¬‚Xƒ;ow˸*öâ®x ç·ãôk\K¯àì^Ǩ¿ŸàÌþßÁ%ˆáÆeÑÏÓp=™8£FœQ;YB:Èud%¹ž¬!}ä²…lÅ9ŽaÚC~г|œ Éqrž|E¾Æðr4…Ú¨D 12t ¦n\ýt+ÝEFï§{écô úÏT¡‡èiôÆç4Æ$3&)Çb2‹˜næfóKæ ææ ó3Å\d.1—ØR¶‚½šÝÊÞǾľ‹éOœ+áæpK¸ÕÜÜÍÜ(w?7ÎE¸÷¹ï e…—ù6þ~7ÿ ?ÂoàaÜi?üŽBü_¿ŸÃ³ô, ÁGð)z`ƒ{gyZÙåpOŸúWúyWV3ô‰gåšÁ‰ÙÁ<ˆûÔ?`žÂ|>Vç òbGÕ·j_§¾Í c GqǧâŽ8 çXY„çÇõL)®ßÕx²à ˜9czIqQ¡¿à*Ÿ7?Ï#çº%ÑåÌÉΚæ°gf¤§¥Ú«Åœ’œd2òŽe(Â<¯KRò»6_ž?¿H£ånlèþAC—"aÓ¼Ë(R—.&ýX2€’kþ›d .¸"I© ªŠ ¥,)gƒ²%Ëw`ýž Ü))Sz½E¯³ù:aFÂíÆRÈÑ”Ò%…”yC}£¡® ꛨÿüÓ¤¢B˜°eV'kšhèÞÖç@Ð$BJ– )Óä ÎcòBÝ«•ÖÅ¡`¶ÛÝYT¨†y•r½bõ'ºëš¾A14 jém0&,<6zwT€U]þ”Õòêîë:¦»SÂæWìrP±o™t|O^®…îN0?F¦Bóæu÷ŽÎC׌͓]Õ}7RÍ×H¨“Žtv(dKš¹šéñIôÊ!­¥k¤˜äz¹ot]úûqKw¢Å'\­ªûÊ‚Aþåºâ÷+sŒO/† M«Ñf)Ùò€ )Ùè*hE?vwV– ßÝn-dcѬBB^ܧ%X•@‰¿S¡]çØeNÆ3|™s¥{—Œ«ñ~yÉPŒùW~V!3-ÔW©Ìÿ…Ý«ójûÝ ãGû׫˜X>œ!DI”Ò’ |ˆÀ4#eBÛiŠM›ÀᾪºTµË–KUP[%\B‹Óe›ÛæÅœf(‹~WÉÍùëÉ(sòâÐo^9ê9æž;%¤1ðzºÇ#xrJ…Ò.-§Ù¾Â¾%w‹ç®Ü»<ûœ{Ý{s÷zö;÷»÷çî÷qqÉ=ây5ó”ý”ã´ó´ûtîiÏ©¼· Þò\ð±ÿ[Y2É$'ÇYTä/v$°8[lX–XXb•=Žìi²ÃjíÔnË”íÆÒçãec³™X͟싊slBN‘=3¬6AhK-¬ÅÙèB1gÛÖn‡ÝPâƒ$±Ü›¬7͘nJðà;Sâ¯"¶T{ÔNÕú5¿ÔÚ컸b¿e›pb—±Ø¡WP¤¢€˜Za«¨ðk .Lù/’ LáØŠ8§v Æm'ŒØ[+ãåêŒéä¼ÒÍÂÿöÙ¥ùüìR^CfÙôÎvgX—š9kfyY¹ÝBäÜ|o1ñòL PfV{Å:§i“~÷Ÿ¿ð7’MÛcwe—;ó*1ÐSW¬°W»W\Ç5ÙL…©ÔÍ[9š•tqidÇ‘Âäæ²ÆŽß^ݘñ“›ê6ß½,»Wožzžy‹¹ Äx’óºj}޼ʊô²«ÖU?ì}Ê;á=åýÍÜß{߬x{®•­fk¼9eU³«k;“—VotíJ½7#9¹ÌTî ™ÕlÀ+ù}ÎÂdRíNM^Ÿ$'7[gÍt9Iª¡Âc«°ú^·o¯Þ5kæL1ÕåtÕÚR¯ô¤¢<ÓÊ0Bž†Âä sµs§“qz\A×*×Nëj¬wº—«>‰P?¿®dèŒç¡Šl+Á¥}Bà†N®8¹Âq%ŒS—cxâÄ. F1Ä¡’¬ê3Ž,-|ZÔõ’ BÖIá èìê,dOŸTš9× «–dÚ™²ò²Y3µ¿EÏXHF:† £eà ®Ù¥eå—{ðÞBø¼ñLÞ==Ån©+—ž3Б-máÁB©:ɸƒM²YÁgÛô¶æÜZŽÝžÄÛ̓ ¡ÙÕõtÝ"wšÓÍÐܤ$ÞËr±¶#×>ns/u”ºbn«ßduT¯ÎZ_tuÑ\[¾…|⛕ìw/Xö«ß'^E0¼ì'Ë®·V] ĨÓÇ&¾Û|Õ)õžx“Óey Óžkûel¿1Ë”ª÷üà®Â°P§˜{ ‡Å7›öÄ7žEïÏà+Áë0S|0_mçÈCH]sjbƒv_i«_ÔÐTïo¿¡¿÷Ö¢ºoº¡'ñŽSÿŒ¹zÿæM‰Á¼?O!)øøéý‘Ö 1Jï øÆ0O÷-_@ÇÇÇè¾Á}ct\¯¤ûÄ}•t\o¥û¤}­4JÃÏU–ŠQ:iÓ£t!-JïBHÒݶ(Ý… DéÖ(A°DéNs”î@H‰Ò;’£ôv„¤(F0Eé? £t;¥Û Qz¥[Ø(Ý‚ÀDéf4fžÙ J‡VDB˜ˆv7êÒi5¹ðõNÖéåµzy^¦ë¥ —ì¡óús]ù-¾ïÌäe½ìÑË´€¥ÏüEŸy²ÏürŸùßúÌ/>|Üš‰S/¹@z‹ùl‹Yi1¶˜«ZÌ3[Ì-šª/ñh&“zéÖKWÀÞdþºÉüV“ùõ&óx“¹§É\ÚdÎk2GÉ¿l#æ÷GÌO˜óGÌòˆÙ9‚­Ï²6[Átï´Í¨àµHk¡ø<9ÎR$ÿ‘ŽˆuÓÈ1¨d5ú…N€¨ãah yˆ ]ÇgÀkÔÚ»"­³Å(Yi­F¸.Òºay¤u%Bg¤u± Zõ.íiR¬³‘6t•‹C´ÀÕp!â3ˆó#âZìŒ4¬ëL¤t±y)bŽfx™d$ÔØZ0k|ó!ñ¬8U%K#âyÔ“?n²$"~èÒgÉâÞIñLë½âéÖ(Åæ—Ú±9"¾èÅ.‡ÅgÅGÅ'½z˯¼º’}q±G¤¨á¸ôý>]å}¾(Ù{Xü™÷¬¸]µoC[|gÅ›ô±ûã°Ö‡½‘»Æ7)®oÛ¼zÿ«%»°]{AåY±Ñ§ëŸ‡&ÃbH:+Öûô¢Î¨Såqµeqj–¨k›1¦7–ÄgR„S,l×m÷£™y«èEwÃZq‰hMá#d^ZÂd{ ‚?Ƈ‡ùð­|øF>¼Ž/åÃóùð>\̇sù°‹O7¦£Å˜bL2#k¤¸/Ò£êGídI7X­dõº@µ’Æ4JŒšêtŒt7æ;1ïÄ|æaÌÛ1߆y æM˜‡0ª=§õž £ô¶CB¼zÝ’hÜBïLÔµMtH¯á&~N1Ò%êˆBîQ »ñ*©=Ù ^T÷t:23‡jµ©5¶ŠyÁ¿Qt%Jÿ÷ŸãïîàÿáGš[7¿ˆËôst½H^Ô˃‡yñU^ÜÏëÍ× @XëaM ü*N8œÊÍ×t(O;;•™ZEuv6+ÅÚ›c‚ÖÒêPp‚ÖhÐÙ1ÐÚP›Ö;Ql¹.†§v-ŠA¥(FžQCcžÖÅzâb­ÑÄZ5@1º$]L¢u±IMìà`e(x°²Ra .2ÈýÈØEÆt‘±„H¶.âõ¢HƒW9˜ëEƒÞ\íùžÝgÇÙÅ:»ü{¶/ÎnŒ³‘íÿüzëÿéÐ ×ÔgBm-ÞˆªH Ÿ¢ðeÊËÿ“Ž[Vþ ÷¯”¡ endstream endobj 348 0 obj 4048 endobj 349 0 obj << /Type /FontDescriptor /Ascent 750 /CapHeight 0 /Descent -250 /Flags 96 /FontBBox [ -10 -12 768 682 ] /FontName /RBNCJB+Times-Italic /ItalicAngle -15 /StemV 0 /MaxWidth 1000 /FontFile2 347 0 R >> endobj 350 0 obj [ 444 611 611 500 ] endobj 82 0 obj << /Type /Font /Subtype /TrueType /BaseFont /RBNCJB+Times-Italic /FontDescriptor 349 0 R /Widths 350 0 R /FirstChar 107 /LastChar 110 /Encoding /MacRomanEncoding >> endobj 351 0 obj << /Length 352 0 R /Length1 5520 /Filter /FlateDecode >> stream xÚÍW}XSWšßss“$!Dð&„&„(*Û€ QëGµ„¢‚ˆ¢ˆ€2(®Zµõ ZÔqZ]§£<ŽíÚe­áÊhÛ©íØuÛÚm­3µ;n}F;ÕNmg\ûiåî{o¨û¸ì{ßœó;ï9ï9ï×¹çž@ ¬¼uMµ- …Ôs†Š¹®½ÍúÊÏþñj_àS¶,jÚð_{ÔÔÅN-ZÚ±ðÚ•åÚSÄg5Ô×.øìxñxÝ$0¦:bö©žˆN'>½¡©mU @)ñ4´K›ëj1ò‰ŸF¼º©vU‹6Ÿ!¾’xë²Ú¦úâíÏÍ!~ñö–æmÒGÐEü Äg´,¯o¼aþ+ñ¤?êmêCý‘=RSX)÷ð BE b掀@:Oå²\«¤Û|Øß•.p£iw¤Ð“Kài PlÎ/‚%è§þS6™ ó°üX zZµþ†ÃB8 _AÓAxIÚ y´^ Ì‚Ó`ƒÅÒ  :¡ÑØtè–>.‘¶Ñ¤­6ÃvAíÃ0q©t(eÐ çñaéœÒ4Qå"+ƃ&ÁZ¹ æÁZñüÎb‡´Y:MjHß(( »^‚cäÁ-Ìî„ÛK#%DÂ1K¤™ÒQémÒ“…´Vž!Ú{à ‡ë0ˆœŽ‡¥Fi¹t¤«6ÀVØ ¿‚ßÃ÷èB7ËeÍrÖÈK‘¼öl²æ²ç\@Æàl\†Øß² wLj‘ö£µrIc/¼oÂÛp®‘¤S°›ð4;ÌÅs»¸}|;ÿŠd—®’}a¬ mƒ#$ÿ1\„Ëð-|G>˜Ñ‚ŽÂ|,À ¬"z 0Žmb/±Ãì:§å~ޥм,ý§ô E%\ãZÑ~˜L>Ë\N´›bõ¼A¹z›"öGøѧð%ª0IÓpÒcÃt‰eDäW%.ÇDŸà5FN1Æú¹·SªM|>ß!¥IùÒX¢'8Š|E©&ÀÃJæª)š ÐHšŸ‚M°…âÚ û)‹ýðYðünÀM¸?"‡4“mtŽl‡]D»‰öS,ÿ‰vò1ÚG')ǧ‰Þ%:ÿAQý„²w…说Ǯ“ß‘:Šq„äŒZ”ŒâÃè#ïfUâBÚ-¸×uã^ÜO‘?ˆ‡hgõ“÷Òûx‰è/x•¼¾‰·Èïæ!š¬øü{’­'ÚÄž§r˜½Eô-7ŒËåfqOpÜî÷2÷.÷9åq¡ªSµOõ;ÕYx/çëø~ ÿKþ†?Ç_S§«k¶kvi®QVfSn áþ'žvX¼ ¬õÓ‰0Tô®Á6øiÉ«•O¹î èyè­ŸƒëÀÀF±_`6åè×|·›öÄstVŒ¥7ö"½[:¡sá<”â)6®B*dñÒu0KŸóm|%·R©˜ifüÐ9wÊçƒ%tŠÓØàkÒGܲl#Œòff8Òíi6«0"5e¸%Ùœ”8,!Þd4ÄÅêc¢uQZšWq !Ûo/­±†2jBª {y¹[æíµÔQ{OGMÈJ]¥÷Ë„¬5Š˜õ~I/I.ü’Þˆ¤÷Ž$¬EPäζúíÖÐ{>»5ŒUÓ+©ý¬Ï´†®+í)J{‡ÒÖSÛf£ V¿¹Ág aÕ*moèô×øh¹/¹­sgS Á ÑòÂ!˜X»¶ÁL KøC»ÏJ¶û”1Îá¯]š6½Òïn³ÝÙ!œXgŸ{I(Î54]žg%Ñ•¤Û½X¶ºbØt…½0¿FnÕVW†¸Ú`ˆÕÈ:Œ®P’ÝJZý©ù.ûSËÿÌ=ƒ!æ(­­ï,¥Ðt•GØ™«}†¸Š™VZ–m V†pS0b„b{Ä‹z»_î©Yb EÙKì Kj(æ0£R´x-~{­/‚i•b²7YaÜÙæuãm”w±»XÆñ6óº~öT¤ÿÓъܩK„3îÄeMö™²Ö)Jìdë8¹ªuãHŒž ’—‹CQk: Ѭï0Ø­_%Ê~ý‹û{j‡zÔÃ× 7åtÞÙ4>ÔV¾% Ž¥ï»|Â{Sxµ@[V¥8Ðñ*ã˜%J­’µQa–sÔ¶hšÙåšz³hÊí¢©†oЦnÁ#E·‹ä2zTžÑf̤â௾õ"ßðÞÓÜ…3è.a“.ó{鑇ÉÞhÂxÞ¢K‹µ›L¦øaÉ–4‹=idrN†3ÓS¨5ÎRª-µ<¦Uå^”Ü‘³5y‹skÎóÃ_Ö¾l9f:oMQe$³(®Ìävg»²³Ý:çð””2SÖÈ,KrùÁdLvšü.ΩՔ÷jPCœ'ÇãÑh£t®ìdË𔬘4ħ9øÜF;ËS»G:¹œh¯ÛSžS–“§3:mYé#½P2²¼Å¸ÞxÎÈËŒyéyùžýÃ)caûÏs{¡å‹ÇT8ÁrÑXh*4·{Ú '\´˜á‘¤"úÝN*2%jxC»kN»¡Hc(ú©1Áe6i EV¤™` †§Ðaë‹Ã“âóâó32s0³Àv·ça, N¥GƒvŽe ¼jÏVGí‰Þd6¤ºñ“ì®!f§Ê‰Wâà›ž÷£¾Ï<›‘îäŽärIö˜Ä¤Áfœ®i–Ëçæ2“%.Ó6¸·èLZ—E•›«q<ôãÖt{œW Íåv¨<7Šió⊾FÔ*üÉ[w2¬ì$„¨ŸäeTà|e…Á®ùæÎÈOS‚ƒ—oxto¤;mD£[…šî,jjˆ24WñâQ‘0 ­£#À´`ñÄI%®Ç7Õ¯p—4/] ÏWi•|ç}À#Wüf‡z‡† ³.±LH³N‚ø0ÛF` ³­Æ0ÛB`³Íqa¶‰ 6Ìž&ЇÙS1a¶‘ :Ì6èÂl=½,OhÃl&ÌÖ¨Ãl fÿ@  ³Õ\˜u°0[E€ˆó+> àû´:Ñ:wqG:n/ö°òÞ@µÍ'Oö³:â%¶€ê¯”úEâ}VOõ묖ê#J‘Ü®ÔÍl!ÕRûQ¶ˆVi-Që-ŽfùxZA§”ºW©5Þ„Vý™Výo[õ/µê×·êÇ·êÇ´ê‹ux–¾±zìSêz¥ÎðFÕ«o«·•E>£Ë¢')uŠR'y‚ú+AýAýþ ¾&¨ŸÔ§õʼnØIWj=>¥Ô•zµR7(õ ¥v*µÑkÌÒœ¥ß—¥ÿe–~~–~\–þÆÑ5P:ol¿þr¿>³_?¢_ß?\ÿ[ÚAq+ÆAÔ¾ƒ4:bø2!Œß‹Õf‚›¸!V§|%V;¾«3„âdü Tk)>ø)TãlÂ?CJæ/b#“ñOبðÀ‰ÂEç š~>EࢳŠàÑ™EðžèL#x7ÿ&:G¼%¬oˆ ‚“b ‡àu1à!8!æ„ÅÀ‚ã8*º—ˆ¢{ƒð*†ÀÍzIýz±:™zŸ«SÖŠÕcÖˆÕã„b7®„ÅÆ¶!V¿—°•Pö­º•ñfèVÆ—a£Â7ÊãK°Q‰ÅbúŸ&Ï[D>ËX':'‘š¹¢3› (FTŠB±gA@Yì1(΄€2išèî%±GE÷²Êý“E÷{BqV€åYp(Òå¢cIÊŠg(î!\d¹Œ#Á«d%œŠRY(ËÙ#yH»l¢³ŒÀ*:G¤F`ŽD>Q ȾÄËÑ} àVæG{HÿÕ‚ð}uºð]Ïá[*7äM w†ÑáMþæ¼"|éÌ®;G _8u§n»p¾û„l œ# ë0áœÓ(|0 ï9®§h¿ý¾zŸpÒ9_x6ÈoX…Þ8á°3_ø—@ŒÐX*¼ûâ…hÎÞÀ.á4ïYçR¡Óéßèµh“¬¤u–»S„w÷šÝB“‡š¢Ðè ㎠K»„GXKæÖu‡z£…'È–ª@¶0+ ó:A£v sÊçÔŠÈÁ¶% µ &›Y'hÙV*›©k_×Á ”‡»ì¾>8謲Þ'vy»”9G§˜¼ó>]Ûîèš|à‹›,뚺óÃ;åᩲ®²®²®©Þ©Š.ÿâ™%+îy~ÖÖi<8 +è]ÿo^Œzµ endstream endobj 352 0 obj 3786 endobj 353 0 obj << /Type /FontDescriptor /Ascent 750 /CapHeight 0 /Descent -250 /Flags 32 /FontBBox [ 16 -15 757 676 ] /FontName /PYACJB+Times-Bold /ItalicAngle 0 /StemV 0 /MaxWidth 1000 /FontFile2 351 0 R >> endobj 354 0 obj [ 722 ] endobj 104 0 obj << /Type /Font /Subtype /TrueType /BaseFont /PYACJB+Times-Bold /FontDescriptor 353 0 R /Widths 354 0 R /FirstChar 119 /LastChar 119 /Encoding /MacRomanEncoding >> endobj 355 0 obj << /Length 356 0 R /Length1 6104 /Filter /FlateDecode >> stream xÚ­7 tTE–·ê½×¯»“ît:I§ÓI÷{M'é–Î’OçÓ‚!BL¢Á„ÿ0ü$ÃLÓŽü¡ëºº¢Dm†éü°’TP”wäøÛèxÐèèGÒoï{öŒ{vÎÙW]uë~êÖýTUW€hØ ø:Ö´wCü)§±¶uônÏ}¸y?ÉàJ—u/_só‰Op„f5#-_½yYÓüžoô)Èïîêl_úç‡Ëý1{q|~Œ'¢KE<µk͆MñŸÁ#ˆxüêuít;ñËŠkÚ7uk+èc&-ââÚö5#»A܃xZ÷ºõäw`ñzÄ3º{:»ÿÝFñ;ø¤PüQ<ÒÀB„56I¹þ£ðËó t–Û€^ηâ˜5`ÏcE_äoÃ-r˜ËƒÌðsò2 ø§ÉùœðܯÁ&؆ýL…Ù8׳PÍ0F|0 ­zv£Ü÷`…jXE>Å9ž‡.xåÒÀûÁ‚ô¥Ð‹ãÓ¡e BÜ›á¼ï£î h€E0J‡ä÷`:<gÉïXF ¦,ȇ5° öɇ JPÓv¸‹¸ÈzyZ±¬A»î…†ßËï¡_<èU‹QrÎt„舃øH?FÖ&´gÔãL8b˜hiµÜƒ£â |Ps  íÞ {1ÛGàœ'‹éfH®’_Æ âZÀñéhE!fèFè 8Ã~8 #ð#i¤F9U~R‘OÊߨ¹âÀŽ)ZÔÛ Ëaê ¡Ç„óXÆàsMf‘rROúÉCä$9GýL&³› ²&Nÿ )7z3­.€Yh÷­p´ãÌ÷À¿ÀÚx¾'V’JòHy’Úé t]GGé7,òcòÕŠ™à1’3ÐòR˜‡eÆm#  E¸s÷ Zö,‡·03ŸàZý.ŽðDK<$µÏEûþH>¦Fj¡.ZA?a¼L)³Ž}—ãüá}áïä&¹Y¾]>†ÞŒs)ž+qº£ÅKÑ÷^ÌvæN);±ì'à8ˆ+ì0¼‚3ŸÂ¹ß†÷à#œÿKø m‡‹ðW¸ hE41aI )XÒH&F­³ZO^ÒG¶“dÙ‡6 Ãäy#YM›h+ÝF÷Зè»ôý~A¿¢?0:ÆÎ81Æo°Õl {ˆ3r·q[¹íÜaMþÄÅpAøæðâpoøŒÌËFyªÜ+o“—C˜Õ¿¨‘ÔB $‚ 3âŬ΃ùXêq¥µÂè€e° s³ £¹ãù(zxaž~‡kéMôî]ÌúGð9zöüÆÏbœ“p=O%9èQ5z´,"MäV²˜ÜF–‘.r;ÙB¶¢ƒXö‘{ÑË'Éar„œ ÈEò=¦—£Ñ4–Š43SMaiÇu°†n¥»éoèôú}†þ+•è0} £ñ5 3QŒ‘Ic °ø™yÌ|¦¹ÙÇ<Å<Ã<ÏœfÎ2ãÌef‚™`óØBöFv+{?û{Ë_¸X.››É-â–r«¸µÜ÷7ŸŸ4ù‰wñ ü~¿Ÿ‚ÇáuxwÚµßËÿ×ïQxž¡~ø¾Äì¤3qïL'/@=Û£xú¤Ð¿ÑÉ›¸²j¡ƒ žu”«;V+³÷5ÈŠg¯|!\ç òÂ/Ëï3Ô¾R~ŸÛŽ9ÀoÆq¾`ud>ž·1y¸~—âÉ2 À—3}ZvVf†wê wzZªkŠSö”d[’5Ñ’gŽ5Å ÑQz–×p,C dø]³ÛD)½MbÓ]sæd*¸« í×Ú$I³¯—‘Ä6UL¼^Ò‡’Ëþ‡¤/"é»*ILb1gfˆ~—(©r‰!Ò²  û÷T¹šEi\íש}6]E ˆ88Bô[»ªD‰´‰~ivo×€¿­ õ” }ý¥>3Fb-%CQŠf *Û·uY(~ÉæªòKI®*•ǤùÛ—Jõ šüUÉNgsf†D*;\K$pUH1ÞÉáªf‰¯”4•¨Z\¡8ƒâ‘Œã{C&XÒæ^êZÚ~k“Ä´7+SÄz¥DW•”¸eÌú3z¥çß;Éü ™M›ÝÞ90C38'‚¶)Xû^ÄjoQ'íon’H?*sÓ#Ntºü ¥m¥(é\®®•msÛ€ ›A›Í7"ã›_XØärJeÉ®æöª”#ñ0аùÅ$Ÿ˜t='3cÄÚ7ˉ!É,Ï,Wà,§µ/ÿ¼3Bïx”*7ú)ÂÚ†«Q#Š!®¹è…$vˆh@“ ]™©43a c&Šá×L0+$]eÛ€©H‰)—fr‰—ÓèÿêzJû$E“fºJWIöÕƒü+}É땦NÅœc~:1MhZ©J˜‘™Ñ+%»ºM¢”Œ¡‚zŒc{sQ6ÆÝéTR6òÁD¤í š"¸K’ƒàËö6K´Má¿ÂIX¤p¶_á\ÞæÂÕ8¬^~$múÕ_ŒÉçï*’ˆåawª| Ê~׸ðΣüëUøt,ïNã§$D§úâôÞO IK?Ç6ëÂ#d5X½¦‹ÅÅó±­›(†²bÓ¢ØLŸæŠuƺ±ÆiòC?q3ÿv*ÄœºøzŠÖgxÚ¹*z0šF‡èŠá¨¨³;¾<Ÿöi§NÇE´:] œ9ÎÌU³œž‚Íž¬3›E3'šY޵{8ËÚõ{öé«á8Ës^“7+ Ê&ŠË´Úb%…Ù£££Ät6ÛV2n³^4õžÍ¶^lµ•LجJD0 ˆ)ÞçdÜyé^B0 ñ–ÄçÖ[ÒJ“È _=ÔéZÄV¶¤r‹úzÂczNW³zBròqÎ[ÙÂêažÌ ¹êÅ­—9§ÍXŒ7õ6à‘¿`Þà¶â/ó¥Vg7f/ÏÞ”¾!ûîÔ´=éϦ8¢øôéÕéLvBª¾B$Î7ãsékcR½9ñ“äÉDˆé0§¦âíÂ[™Äç¸Å(OQJj®‡ÅH›RSsõy¹WÃЪ,‹÷Ç•51^vÍ’ð*ÁP*.ŠKãÞËä"Ó§A+i\YÄ=£””’ÜKÏ``”N¼²,ÜélA> ¹¦0JlrI‹†3XygXëãW%r:z²¥líkû?8÷_Ëyrò‘Á†Ò'îíËÉg[\ц$žRÆÅiõĪÕ&¢·uÞ»êÇÎee&WþΡù­á±žrg+¯4ùóænð‘Xß³œÛQæq§Æçß°²äa÷A÷ˆû ÷ë³>pŸ+|V [–ºSò‹g”T—5G5–ltì6ß—•¯+°K ës‹žj=#Š”8ÍQëô®¨Ú˜Ü‡˜5…©±…1ŸÛé™ë©päæäf‡ÝQköù3ÚQX`‰á}ЧVfDUÙ—ÚwÙ{ª£Ê±Ä±ËÁ:ª+ì“ÃQ¡'&¨˜SžÝ{Úª,BÀ,lËÆãbÔÄõžj=ÕjU2áUŽŒñÝ\–׈éżX•ÄÌA/®ÌÓV›’ŸXsb$=ä’ÉvÊtTv‰ ÙÓ¦“ÛñA“§æÊ… sUF,‰‘<)W ω’œœü‚Ä«»¹àÊ^Ãã6O²ðÎiщÆòñE íßÒèÉKôÚ¬Þh²UÕÙ¦5ÔN)ãØ>=Ÿh¯í©ôÏ(© +ç;ãìN†NÑëy7Ë…ŽÝòd¬³Ñšç;c¼ºkÉRÛºÌ3gŦÉçžÜ(«kςþàÊKuʼn½ä¶˜âK„hUüøÈO›¯@y\>'òVÜ3º«/[åEaìh!üTøÖ¦Jå{®¹ÿqìŸäqæù[v=¬cp;à9‹otâ›ä, ©º8|…i`%VŠ/<îEà¿ !NÔYÌ“3j”ûà¼Ê•5Þ…+Öt®Ïœ»¡}õŠŽÉ—µü-ÖNèü»7Qk&¾Áü°à%ú‰Æ¦@Ö !z¿Ï‹0  ðôÀÜ¡¹t¨ghè90H‡„¡"z@8PD‡Ä¡zz@DÄ…èÝÌ!ºAlˆîF` ѻĄh?cˆîB`ÑðXÝ *DÏÖít!ú+ÚíCÀ‡è6š½¢[°!º¢› 1›àÿâF¢½¾„„Ðå±£õ•ÇÓ²ºÁ@Vªí-j{“ÚÆ«­ImÙánúnC¹ž¼ƒoh9©¶jç3v¾é2ŒuNvþ½Ëð é‚:dØÕ–óÅ×ÎÔ¤:Ã@¡¸ÎSg˜Z§¨úÚ2¦¶Nµuøk ß×þPcx·Æ0Tcè¨1äÕÒj !ò¾Ø~ÃGý†ƒý†ô~ƒ«ß`ïGê Ã1µ1 ;†ï†ZTp6XŸ!¼DN€ˆ^ äß‚â1¡<‰‡"VÁ_™„# ¨ð(T’4„‡a¡ Ÿ·V¡·ëg!²8X_‚àÖ`} ‚–`ýbÍÁú%8ÅÍP¯YÇ„òXÒ¢ªrþäu0H8áóç…å8º*X¹D(בr¨TÅJqæF„)Šáå’0©&vÒB#V…oÎãE!Ò. ž´ ðÙÂK‚Â'î}Þ%|ìN×ß'¼U¢H~m!’ƒÂ«nrTxAx\xÖ­Ržv«JDÄCZF¤ð¨*ï÷„È#G…߸Ï}Ê”¨}*Øâ9#¬­Tç^Ë=8¹Ë®jF±U Oí2ƒ" yE yN눈‰´T«WŠÑ ªb"ݨŠ)bGzŠüUGŠŠTöeèQEzØ—¯¼^dPœIVEÜn©t+"G¦¸Qàˆ{ŠÊNý™½0ÂΊ°³TvÁÏlO„]aW#ÛûÿøuVü#Òþ7UX ¬Ìª^WùhIƒ¯ÞõK:ÖO~Øøo°ái endstream endobj 356 0 obj 4373 endobj 357 0 obj << /Type /FontDescriptor /Ascent 750 /CapHeight 0 /Descent -250 /Flags 96 /FontBBox [ -10 -19 768 686 ] /FontName /LCQCJB+Times-Italic /ItalicAngle -15 /StemV 0 /MaxWidth 1000 /FontFile2 355 0 R >> endobj 358 0 obj [ 444 611 611 611 611 611 611 611 611 611 556 611 611 611 611 611 611 611 611 611 611 611 611 611 500 611 611 611 611 611 611 611 611 611 611 611 500 ] endobj 19 0 obj << /Type /Font /Subtype /TrueType /BaseFont /LCQCJB+Times-Italic /FontDescriptor 357 0 R /Widths 358 0 R /FirstChar 74 /LastChar 110 /Encoding /MacRomanEncoding >> endobj 359 0 obj << /Length 360 0 R /Length1 3700 /Filter /FlateDecode >> stream xÚÕ–mt”GÇÿ3³Ï³K a“PB )ÙB€)„ˆ”ʆ"TÆbJ „%dK€’bå%â[ bĈm­H"§])RJ+’ƒ ”`‘ ¨¶X( 1Öšb”°ñÎ?[> Ïñƒçøì™ßÜ{gæÎ÷…‡µ0.¬( a6ö‹¥YÒS W.O[:»Æ¨ù€îWZ\Q’òf¹”×.^R]¶¿êLÀcë„Ê•”¾398plùGËÅ÷šú…è{ER^±|U¿«êˆè§E°¤ra‰š¡¤­sEôøŠ’U!_µQôNÑÓ––T,zëÎñ€;@ôA¡ÊªåÝÉxCô{D¿;´lQ¨¸aÌÑË_œØìxìˆ\l´>p_Ìrë§ñŸ?ƒÿþ“QÁ‘ÔŽS˜€Mz3&¡M(Vmا¶!¬2±YJ'àyìÃ1Iã‰ùf·ÔéB ¢EÏÃIÑÊ¥ï|æH­z­u*V Ií@“Ž×“Ô^ìÒõj žFy†IÍšý¨@¶ÞƒbÏgõ/P¥ŸÅ åGŠõd=«—FçÆ9Ó0¯"‚ݦB_öcŠêïåø .`¬‡¨Õ $ÒêEPçÕÛ:¯«£ªKr¦óW&£LF»Ó„:à€è)˜d<±òéví!ñÛT¦¶9'Õ.žŒ¾Y؉­bß)õ"È2uÈ49®b†ü2LX²‘â ä;-(RõXá>.s%eæ€Ú‡lSçÔ¨cÔ뤷DuÉMÅxO@s‹± Wˆž¨ÏãQÔèkRs?Þtjõn™D§^ר=s‚YN>ÂN-úÉÌ$Ÿ'+2Èé@¾:¤3á7»UãsãœÐ—uœ; ¥N›jWî(7]ís:e[Õ¨&w,&ª.7[vÇ»ñÒ¢Fæñðê kº±£ƒ^×ñ­02ÍÑé/?Y˜v|n sä-jšß›A^¤OuÚÁîî¼BOŠ37â Œ˜t_Ä“>øÂ¿+¼9rf^aÚAå:%ævêü)bœ](¢ÕÄ,ö©S2{ÎBYt‡§ÌyNv¼ÉÁ^¸ÊçhF5·6gÁ¶ùló褄@Bz !PæAW•IéºÝáï|o™›ž¼"Ùôqæz#=˜t[؇-®{Toƒ8oï^Nœ¿5§­+§- £ºr$­·'ƲuµÚ­G—¨íaŽ.P»Â²I[¡JöÄëcìãnñ`‹ûŸd鲓 ¾Â:µ,ÝB†¹¦_fÍä—0ܲû]‰m-É ±½³AΗ¡lä•YÏñÔ°F ×m=dzNæ¯UJÖ±dŽHÉZ¬‘^–¡á5ørÄfKŒÐΈµØÓj[~ž\-÷†­µºGc?±V5-«ÈGÉ•õŠÜžs]…e˜*-«z4¶´#ÿB\ýGXB%W?ÄÕ1¶J,ÅP±Urõ+›µ|ŽmÊÉÅä"r!ù0YL~†œG>$/–=ëQ+bœs)’Ÿ& ÈO‘sÈÙ\©|Êyäƒä,òääLrz÷[éÇè-Sx¢ï§<™Ì%ƒÍ$Ê÷‘Éry/9^ZÙsVG~„Ì&ÇYb3Myy7™IŽÄtáÊ&3Èá&}8’[mwèPÊéäô–WÃÈ{²C =MæÈÈÿ<[ÿNZR)$Sr{öÁ‡È;Ø÷ÖJ&û“·Çè—Ùé‡éÑ‘ÜÚ’ä-š)Z{LŒ•%ò4ZÙH›(iÛöå銧¥Gö&o#{‘>Ò‹±BWnW¾QàÅwÈÈK—JZÏŠñÏ—ÑÏëZñþ¤¤§%E$‘ä…Rl¨UU#þ'Füß}©ÿù5 endstream endobj 360 0 obj 2004 endobj 361 0 obj << /Type /FontDescriptor /Ascent 701 /CapHeight 0 /Descent -299 /Flags 32 /FontBBox [ 41 -202 550 729 ] /FontName /VPRCJB+Symbol /ItalicAngle 0 /StemV 0 /MaxWidth 1042 /FontFile2 359 0 R >> endobj 362 0 obj [ 250 600 600 600 600 600 600 600 600 600 600 549 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 549 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 333 600 333 ] endobj 17 0 obj << /Type /Font /Subtype /TrueType /BaseFont /VPRCJB+Symbol /FontDescriptor 361 0 R /Widths 362 0 R /FirstChar 32 /LastChar 93 /Encoding /MacRomanEncoding >> endobj 363 0 obj << /Length 364 0 R /Length1 3476 /Filter /FlateDecode >> stream xÚÕ–TÕåÇßÏó|¿÷¢ ^Т†(wD„ʉ9 ™ÓF Cb$ˆÈÙDn¢&¹&ÊÈÜ•~YŒ9rÕ3ëÔ92לÛ´ÄÕÂå~°•537ÆZ3Ç™tÙçysëÚÎþÛ9ûÞó¼žÏçÇçù}¡Ä  y+ë*˜Šõbé•T²rãúäµKš@%zbM`u]eBÀ˜kÅߺzMcMÊ¢‹RÖÑûE¿ª¶ný¦ñª+WTøÖÔ¯¬Äýˆ.mbl]å¦@T´ºSôI¢'¯­¬[õÆäZôѧêÖ‡…‡D/}j`ݪ@Åc³ö‰~#6;;" m˜±|ôÓøïŸ‘4ˆ“˜‹ízr± =¨PèR»TØ!Þ¹x]8&i62°ÂtJ™aôá út9NˆVƒL}¥äEX*¥:´ÖIØ€Õ†«sÕØ£;Ô<Œ2LqҤ䔚¨C–Þ‡ ç+ºÅ 4èG±AùЀ =_Ñhw.b¶[ˆr<‡:M>ç­@’Ökñ{œA¶ž*´ê*‰ô°êSÝê´zS—à%uT «“îBþjd” t{Эq+ºEOD®q"þ…vî‘.ñÛT£v¹'Ô±Œ~™Øûľ[Ê…iÚ‘a$rœÇ"ù¥›v±d¹Í"Å=(qûP¦:°Ás‡Ì•øL·êB–iw›Õ1êíÒ[¼:ëIÂǯÓ<ØŽónHÏÓ§qšõE)y¯¹­ºSæ#ÞíÐͪjtNPä– è¶b¢ÌŒ_òrY‘)C:>Ó©ö07î úœŽñ¢ÚPƒjÈ3ÓªºÜ!ÙͪǓyjØ“¥{æxb¥F³ÌãáÍ-[F° 3ó¼×1Zaz²/¤S?WÊûBiòñåþŒéQ“}ÞäŠC㓎Œ—:‰îò;)dR£BNjÊ™ÿä<“1}qqiòAå]PivÁŠ1.)Ñjbû‚‚ŒÑ½\nsjܽ²c½HÈãÀ£¢\í`Foo&|§zOõΜçKõÇùk 7˜Äá³á6oìлë<éàÉ)“scŽ!©yÆ£°Ó£ƒŽŠ6ˆñFqc|ý9Ã9™˜1œ#ùLå¿Ì—çÏöÇeéFµ+\ ¯Quz0\¥öe“0¶R•àÄêc›”7γÓÁNŒràª(ß©œÞYàð@¿m0›?'vx‘é¶I%›ƒà –”ÿøÝ·ŒÏyO©(Ï#Ï^jü0/Ìääpâ%w;Þï»aYxÿ¥þ¨­» ç$jìUàT£LR©ˆŸ”_‘½•XÚÁí’e>äÉà}[μŠDiÓƒq@aÁÒÍŸ¶¤±®ª~͇wLø ÙùÿîsxÇÄÊ-…üݤ\„a”CÜ!Ô” KŒaò}r˜¼Dþ“"ÿA^$ß#/'ß%ÿF¾Cþ•$ÿBf”¢|o£Z®ïóÔ¬lpŽò[äYòä›ääò5òd?ù;ò·äoÈ_“§ÉWñ $Io¯"E´Wh{Ed¿¤ür„Öòå_½ä ¾Hùò8yŒü9cÿåçÉ£dùSò0ùò9òÇä!<‹›$®C£ÚÈËÒ¿µ¹õŸ‘õt%¿œZ“xž‘Õ#6ë1Â<±Y‹Á0Kx@î“?‚§åÈ’rO˽e„¶\{ø!c á)éÑ•ÜÚž’=¸Q4k³šíéÉH Öc„¶…DZXäý¬ó¹üÛìÄuÂïSÞKû÷Øû£´<iïyû¬fÛ³ƒï²Þä ’51è`íï°·Ý”¿M¶Û}Œoá3Â6Z$` »è½Ÿ¼}ÞKï=²“ îf™Vzw’A®é7Yfy®±yGbÛNËdKdï´àzѬlä߯ñ4³D3×mdzUæ¯_<[éÙŠ#âiÂéÕ¥Çí oÁב#6ë1B;#ÖbO«­ù5r³Ü¶ÔæQýÜÎR´l"o#7rÔòGÏuÖaÔlÕXÓZŒ¼Ë®þ­ôPÏÕpõŒ­kqµØê¹úõŒÍZ ¾Ê:µäjr¹’¼…¬ ¿L–“7Ë‹`ÏúÍÔÊçrÊ¥ä—ÈeäÉ¥ä®T åbò&²ˆü> endobj 366 0 obj [ 250 600 600 600 600 600 600 600 600 600 600 549 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 549 ] endobj 99 0 obj << /Type /Font /Subtype /TrueType /BaseFont /FDTCJB+Symbol /FontDescriptor 365 0 R /Widths 366 0 R /FirstChar 32 /LastChar 61 /Encoding /MacRomanEncoding >> endobj 367 0 obj << /Length 368 0 R /Length1 5520 /Filter /FlateDecode >> stream xÚ­W tÇ™þ«º{zF¨¥]3è {Ô’FÖèà !ŽA !<€ÀæqÈÈÀŠËl` x;ÞÄŽ È4KZc³†9vìÍó3Çn䄇-;ñ'hzÿîò²û’÷¶kª¾úëÿë¯ÿ¨®©‘° ð6·5µƒ ^‘sX'4w¬’?þ|íÀ•,l_ÔöÈ©«8ÃRÀ¨‹–­]¸`Ë?ˆ`‘ö·¶4-øÃOÊ&ȇ1­8u*²éH§µ¶­ZÙkVU—-on\Aúm¤­mMkÚ­^Šë §‘–kjk9¶å é>¤ÓÛ—¯\¥?G¢"‘Îl_ÑÒþ›oWóHçð³pŒ€áᑊëÀ98ò>=]…u,$r3 –iƒDý3¬×±þ)4KqùÚ¯ÿ“Œò?¬áÇûa7¼‡>nÀþS A&dÁŒîP ÐG¼0×x¶¡Üwh],%×pÐ P.|°p|tàü ¨@كϡ…µpÎÀ§¨;¦Á 8M{ô`¼É/YF ¦\m°vé!Æ£¦M°•(d¥Þs°´¡]?†…ßè¡_ø=‰$ãHñ“NòyŸ|L}L³ ²"'édŒŒ½ÉB« `Ú=æA®¼~=hã øŽ8IÉ'•äUšB¢ érzš~Ã2l7Û§ß0-¡˜ #9-/ÉXf`ÜVCZ€g1wÏ£eoÀI8‹™¹ ýð=Ü!ቕd’<Ô> íû-¹B£hUh9½Êx˜f9{‰íã|¡]¡oõz½A\?ŽÞ_Áµ Ï8= sÑâè{f{#æÎ(›±l‡WàuxwØ!xWþ×¾Áe\ÿKø m臛ð¸hE$±Ä“d,é$£V‚Yõ“©¤ƒl$›Èf²…ìB÷‘£ä8ù#YEëéºn§oÓKôcú9½N¿¢flL ãŸa«ØYìA.Š›Ç­ç6q‡,cn† B„æ†:Bçu^Ò³ô}ƒþ²®aVÿhFÒ Ñà3âÁ¬N†)Xü¸ÓæÀ|h†…°s³£¹ãù"zø&Ä<ý÷Ò‡èÝ%Ìúeø=zög¸ œÅ8ÅýœEF¢GUèQ™AêÉl2—Ì# I+yœ¬#ëÑÇn,»ÈÑËWÉ!r˜œ"7ÈMò¦—£‘ÔNe𙩢3°4á>h£ëé6ú }Žî¥¯Ð×é/¨JÒ³¯iˆÂD1éL3™™Â413»˜Ÿ1¯3˜sÌE¦Ÿ¹Ã 0l>[È>Ì®gw³ï±Ÿaù#gçò¸±Ü n·”{Œëâžãz¸ w™»mcQy…ŸÆ?Åoç÷ð=ð2ü ~‚oÚýÏ ˆÿ‡O¯á-zžúà|‰ØLÇâ»3‚¼~vœÆÓ'™þ•>O>ÄUÍä$àYG¹HÁêdöà{ úï°öc½*Çsy¡ú§Ì0Ô¾Dÿ”Û„9ìÂ7>߈ópµ‘)x~Ìcòqÿ.À“e8€wäˆáy¹9Ùž¬‡2ÝéiJªK–†¥$'%u:âãbcìbt”9$Âfå-ËPÙ>eB£¬f4ªl†2qbŽA+M8Ðtß@£*ãЄeT¹Ñ“”ô¢ä¿‘ô†%½÷$‰(CqN¶ìSdõ|¥"kdÖÔzìï¬Tdµßìך}6Ã$$\.œ!ûœ­•²JeŸ:¡£µË×X‰úzÇ÷|ýeDN6ôÚÆ÷ 14«PÑ´¡Õ‰`HøÔD¥Ò§U*M“îkZ ú§Öû*“\®†œl•T4+óUPÊÕhÏàtS³ÊW¨– T-/6€nùpöÉ®šó=‘ ”M³ëU¦©ÁXÂîQJ¥êX×çü¼Ûóíd~L•¦Ohj隀¡éž& ªiR5ÓeÔI;êUÒ‰ŠeÃ\Ãô°-ŠÏi\"«6¥\iíZÒˆ1OìRaÚZW01ÑÛ«ã›OW\ji’ÒÐT™|8º¦­=2Ô+}““ÝëÜ8Î…!ëÍ)Ë)3pœË¹1ŒØÿèäSîô5Äši÷¢F C”Iè…*7Ëh@½‚®Œ5š–±ÐÕ<Åði „Ū­¢±K,2bÊ¥‹ŠÜu 0JÿWŽ4 ŽXÒÅ[`tdßÛ0È¿ÛW=5+ sŽùiÁ4¡i%æÀèœì5Iie5 C~ŒcSCQÆÝå2RÖ­ya>ꦩõaZ†ùIAðæyTÚhpNÞåÄÏ08›îrîMoTp75/9ñª5ãÞ/ZLˆõµ©$áÿ`·˜| ÆûnQðÎcüë•{m,ïÎâ£D£YÞX† ï#0ÔJÇ6ØB½d8=âÍââ)ØÖCi±8€$6#†+v—Ý5Ö2F»]ÄýëóÁ±`ÞЖã©ÂãZÉð²7‰Ožà˜9d¦c»m·ã5ǯ’­^á5×ÒÈîH©ÑÅG‡ ©Ž‰ÀŽ7ßk}Íe³q‘‚Õf‹e‹‰áªX.‚BbJ’56&FŽábå–cS29‘eS"†¥äóˆÅ$ÏSì/òœGôäæBé@q©uÀZl),,Ì;}ú4/æ%ŽïOtÞ;.æ9oÎI?è1œÌ)ƒ…¤Zxw¬‹qägx±ð–ø¸G¼ký£é%CÉC_½Ð¢Ì`+f¥q36®õEp¶êeª‹uÍf «Žòd\(ÈUÍs‡s%ºÅøOjÆ Y¿Î³7Ty/Å¥¥‰iÉùb~2›\ã˜ãX—º.íéÔ§Óö¥ìuíMÝ›v0å ë`êÁ´ã)Ç]ÇS§]H8ã8ã<›rÖu6õlÚ™ôO²>ñ|‘õ…ç{E¶)$99%'Ç“ëÄÜ$Q´c›5ˆyÑJš3i¨âŒvHê°'(k;iÍäk@¢g¦’&åä&ÛÅ䢤ˆ¶‹â´˜\1:7 ·‘ƒ r“ì"ëÀé°äeB„Tàb-æáácNì1ŽB(í/õ{£Ôî(ÜÆåz¢6ˆ§·Ysf‡IÀ ÆÚ =Æ€Ä[ýž;äˆýD<9' â™m¢uÃi+Î6Ñz·‹™z¯µ£ð~3:?ƒ]B JÈ(c’îÑ®ø(ÂÅ$Œ‰¹tD%5ÃKÜ<“L¼”UW¸$ŶÆBoÿ÷O=UduõÆÐí•Ê0WÂC’·¹,«²Ð1Þ5g6{Âf·eÇPÍÑĈ;3ƒ»Òœ‘Lj*[5têɬ¤ªøYV¶:wÇ#•¡gÍüšÏÒ'·^ž]|‹«IŸì½½ö.êýúu|ãðßl÷¾PŒ/+ŸBúYè 5Ñ ”ê;ïûgØßéýìJXÎìãëc ~?½aÎgðfm%X)ÞÚE‰_D×É HSsÌà*ã?~Zù”ŠêrOÝâ¶–•9“V5-[Ü<øí£ÿ k ´üÝÛƒµ¦¼M_"‘øÁ Ñç‚þBI£»½Ä€%ÀÓ}“z&Ñž=Ýtߊ}Ý´Gê)¢û¤}E´GîñÓ}ò>?ÕhàHQ¾¯Ñî`•§Ñ.„X>£ÑívnC5º!Z£QÝ‚ ht3O! Ñè“xFlB°iôGVnDà5ºÁ¢Ñ'8®G`5ºÑèZ4f žs«@£ÞhDB؈qyµzËâèxò´ƒ@–˜í£f;ÝlãÌV4[öh»°¼](‹ ¿Æo"¼o¶Ífëj¾iúZ…÷[…ÿhÞ!­øA(³å¼qµÂùZA­ºj…âZad­Uk¨ú?œÒg¶.³æuT ßU ŸT —ª…žj¡¹ZȯÒ«ü§×Þ)\îÞì2:¥SHéÄÑ·ŽF×Dƒí8ÞkPÁÅ ?[z›œ½”È¿åãRÙPrŠXƒ~g{A2ñTtÄCPgâp[ñÆ ´¤‘¹Aÿx„ÙAÿ,„YAÿ\„† >.ñøÍ)uA¹O*³“i ›*§ .Q ÝÔÀɈ'¥E8»2X1_*³‘2¨0ÅJp噈Ɇáe‰Tc´0 «ÁŽJç¥þ"Ì J7POzPú¢NcIPºêÖèï銻O:çV:ë×(¿W‡ÃAé]7N9&½%½,½á6G^s›Jö…Å^’5+Âóaéç2M•»35²÷˜ôŒû¼´ÑXµo@ë2ÏKU˜k·…aQ&ÎFîÂÌ>i¾ô¤4ÍmÎX6¹“ë̵'—ª2MýÐrLòÉç¥òLsa¯d2JÃTAXí˜05J2µè6óž䠋Ùu¦í43Ý-¥I+$WÅ"i†d“lãd3þÑÈFo!x…lâ+ùÀR>°„ÌäùÀX>ËRùÀ0>Îc­QÖHk„ÕjµXY+Å÷"NÓ¯y³Œ“%Î"`a–5û"5Z>Ò(±R¨.sÒ.°ÒíX·bÝ‚õ)¬›°nÄúÖuX×`íÀÚ¥_;bÌî¥]ô‰£b¸û]78¸Žnìm¥k{kh‡Ù×øˆ±&b°ð€Ô;U²SµlÇë—Jv%©x¹ÛÕàLHè(u–Æ”Ø 'Tþ¦q°õüð8ÿé žûRã_û.nÓ¯1ôy×l㥠¼t7%j¦£@À˜C p 8SÔçk¦×«ûSÔ‘FGOi¨Qs{z/-¥ã}•½´Ä€†ú^¸BK}ÓŒq¸RÙ€b³L1<µKQ Š @1²$C ÙoŠ5‡ÅdZbˆù @1ºdSL¦«M±>CìðŠ"_åá¢"S„=+L‘ì‰ûDºé6EºE’L·E*܆ÈáT7 v§šì´Øuavn˜k² ~`g†ÙUav²=ÿOKù?#í[<½<JKæí“T-ø5Ç+ÿ›Ž•ƒvþ_Ol½ endstream endobj 368 0 obj 3885 endobj 369 0 obj << /Type /FontDescriptor /Ascent 750 /CapHeight 0 /Descent -250 /Flags 96 /FontBBox [ -10 -12 768 682 ] /FontName /RBNCJB+Times-Italic /ItalicAngle -15 /StemV 0 /MaxWidth 1000 /FontFile2 367 0 R >> endobj 370 0 obj [ 556 611 611 611 611 611 611 611 611 611 611 611 611 611 611 611 611 611 611 611 611 611 611 444 ] endobj 65 0 obj << /Type /Font /Subtype /TrueType /BaseFont /RBNCJB+Times-Italic /FontDescriptor 369 0 R /Widths 370 0 R /FirstChar 84 /LastChar 107 /Encoding /MacRomanEncoding >> endobj 371 0 obj << /Length 372 0 R /Length1 6080 /Filter /FlateDecode >> stream xÚµ8kxSU¶kïsNNÚæ´II›4M{N’&mIÛ¤-éBs I)-…Rª´0`K)°@;àÈKG,¯‘Añ‰ Ž:^u†4Çñ=ÈÐõ°ÿ  ÏC:¯§wý†¼Ûé|¤ë‘.¸iuW§ö÷šãH¯A:³·sÃíTú¤–Vuöv×?ppé§”ñkV¯[M¤ie}kÖv¯Ùü¯®m@sy4pB™ÚÆ9×~(¾ °ÿƒ”ƒÿGü5ùZµOB³ërƒ¯™¹&Ä?ÄwßOcÓP޲Øsñ7™\Ô?ª¼4ðƒ ¬° îG6Á{àÀ‡¤é£ð¼³` CKñCñO¡î@sñ¿‚3i7FÕNœs¬!Åt}üN¨A{÷㎼G2ã5“ÀA¸z VÁ/Qöœƒ·ˆ½)/Ú©ƒù° î†û ¯‘ü‚<Ì&Å{â+àz\Á ·½y>†/ˆ¼@ÎÄ­ñ£ñ8Úv@LSåàa8)žÀl#0Jæ‘ùŒƒ™âeñ+¨Ÿ†Q“¡~†#záVôä~x^Ãö>Z- ä:²†l%;É:™ÀòÜìømên¹p•Sa®®t/ìÇ>¿Ãöü#ŸD´–n¥_1Ffçrýñ-ñÃñçãÄá ã߈m¬Ç37;p½ûà8¼oã^ý ÆOôÄ„k8JΓÏ(P-ÄÙþÀ¬fv2‡Y`°ç¹îÎØ“±‘øñýñ×âÿ‰ÞSÌ.'î|%¶*´€¹0Úa)Æz¥šÀa„!ŒÝ9xÎÃÄH.úYI¦‘äò2LÎ’¯)¥z*¢ÍBz'}Ûiz–žc,LSÀ”2‹™{™G™§Ø»¹¥\w7¨ùŒˆuÅ–Æúc·ÆNÅã÷ÅŸŸÆÕØp5ÊžÖÃLôv.´â.ƒ[ÔXïTr ×sŽa;Ž«: §ðöy>€¯0ç®b’Ô8˜1^RMü¤×9ÉLÒHæVÜŸù¤t’dÙL~I`{˜B?Žb"'Ékä ò¶ò9¶¯)Gyj¦ê¢2mÄ6['í¢=t9í¥{°=IÓ£4ÊSÃÔ1ØÂÌiæóó>ó ka׳¿`ÿ…=˾ΰg/szÎË]Ç]¯1kª5ýšÇ5Gø•üïøw ‚1þ=œüÉ9ï‚ô^ú-l¦3𜽊—Ðh=îÄ&r„<Ž‘zóv¶w±ÉØJ±%c» cr¾Ë™ç°Û$17ÇšmÉ2›23ŒÒ ú´TA—’œ¤å5ËPE!G]‡vu„Y—£¾¾X¡Èèü£#,!«î§:a©CU“~ª)£æ²ÿ¦)'4åï5‰^òƒ¿¸H 9¤ðëA‡% æ¶!¾'èh—£*Þ¤â{U\@ÜfÃRÈÜ”¤C …ëú{v†:‚8ÝŒK..ÂÄÀH¤(‡azç¦3E#¶8‚¡p–#¨Êg¨si¸yn[(˜m³µ…Éô.Ç’08¦…ÓÜãÕqª¶´¡íâ¢åÊúa—n©c鮨 K:¬ógma¦³=L;wØä†M·\4ÿ@~‡…vÿH¦ÎºÎîuš]õ ²C¡:w#Õ8OÂiéímarG{bêÚ^t;B §c…NrLsôì\Ñ1‡–¶ˆE¶„Áö04·E²ä,•(.2ožbà ××*pŠÍ¼9?¾=ÁÿÓéUoøÂÆ–ïãBKŽ™¸Ì°Ô¥qàZ«”®» vvU¡>í½\NšÞ±S?G…9§Þ!í¼¸QŽÑÏÊéçhœúK  Êv~Ÿ(ÇñŽ²á¯Ø}ø;Æàý0ý(%39M”\/[åg2̱3†Z’4üLYÚ¤Ïlu-f·{öWþ¦1ÿlýe“~Ìÿ˜_ÿv¥ÞrƒÍ¯ë^ù–küöX”ùËU§úEðnüòÞç)à’'pSR“É¢H³tÂK¶ ¿Rçm›ê~¦ÑR/ëòMª(/Ã¥qÜiÓ=žiµ^³¦y<ÓÕ¯†ôø(3Èuà-ž ûdû³ä3ÝE#ó2¼ )W-0³´šƒ¹\êÁL¤G©öˆ”<`‰R~P=g¿Õ_…ÀhíMß(WAŽÎev]Z§Õ¥w².Á”ìÈ >Âç Æ¥!–’•ê2»¤l0ìÜø¨Ýø³ô-‚Eyé†IùÔag4FSfyºrIðÔfÏwô•åtÓ*[ÍÓOlv9üá–îš›c^Þ2°ðq'^­¥_þš¤Æ>½çïĸ)_¼4v&;väROè‰1%žø-Â8¹Å «å¬~ãv#u+ŒT7¶D{ÁÎ|³„¿à0^¢dUdÂc”l– ‚Ž¡¬6ƒÓò:3Æž2Qâ=¦Ó Y&ó)²lä ²Æ÷7v|+ütSuӥѫä’Û]êt,3Ã`Ì4eØ|5Äg˜ärØ5¼ÏYN—–5cg76˜ ,óòÈj×Î%]™Õ4‘µæj*0xËrô֓ʾM…/ØŒEÍ»’cšÒ4žðQ¢“ L)åŽb¶í¶5gfxF›Æá.4«¼ìŒ+—Ùä+—ɦݻÉûw«9–Ž1¹ˆßm^8.g†2É7&’d²˜¨E«÷ˆ^êXÅ(¹"O±3°z¥# òk2x¯GÌMÎsx²0sàx™>ßía1|ñÁ²RL"ÿØ.Q= ~?&SzuµƒF éÕ08LE æ˜ÞéÊ4»2ór‰Éì4åç7ÑûÝÛ¶a`I_å"ZCÄd¨ÀD)3ýcÄÇé-å9U)BѶ¬(m[öØ©tVlÎü²Ú³÷Mº.6Ú2esºÊÇÐ<Á©ÍåǬ·ûêoŽõ¬“­VÝäUd?~ñbÖT鬉¯ñìR1Ž)ø ³Hv9tiÕ)å9$É,é›MVó>«$êÓX«S»Ÿ‚•wæ%çcdäd)e?—/JçõiC$.r/à!SóOµ½ý%·oŒôïN¸ÝåcTçòÞW*ŽçöSþ"÷Ô©î"ÿÖ•UIiÞ”Œ2÷áUK+;c®¢fª*½bHöÝLÎ×f²©bjuŽŽ×Ž•­¬U}Âû+>J§°‡Àóå‰I’m§FZk×È)¶ä|MZŠœlKÉ“sm`§c¶Y6qËϾkyÕòîÔa³~lø,¢ú7±ƒÀXÿ¿Y̯ZgÇü¸Í˜—°ˆd8圗UTšøTâÀsî38J^c¸¯•e™9„&¥‚¹.Ïg·dNZ_Ñ?ÑÔËqIæÐÔ>c¬;=+?dwfæÖM^^ÝM3.9ÅX=ã~V¸¬ø01þ9÷+æL&Zy»‹wy«3ª³«m“íš$^›ªMÓ“¼f{¡ýçÆ;Iù4ŸÉg+i%SÉjÊ|¯·:½Ø›mͶú,Æ ^ÃkµÕéFÓÌK/Ëö¡Fqñ¼t»Ýf/öúʲQÁh³ffƒ³  R9ƒur¾^#šSüF-ÍÐ{õôD%c²0#CƒØj‹×B, ŽTMª]V{1µ¹lÈ96Cr×Ï+}ýWÍJœ×¿»¨¬/÷_]”ÀÞTòÄï3ùŠçô˜$¼~xØ­æ×óZdh C®Ü±$•d`Ždã÷¨o’+ßWž‘ŠŸì}W>“¤„äûlŠžIQ¬D5•ÅDý“…”㵤(–%åÄN³Žþ5ö å9+•5‘VªsGq¡ñÂ(!16¥ä¸xÅÓ"^.‰²È¹TÕ"ø 0JŸ‰ˆç=d“øÏbñßkÄaœá¥ÖñÏMâ‰"uÀ?O)³ÃSX ?(§ˆOxî÷ì«QÅËÕùîmUÁþBdwà4ëJðã:"®-W,¤ˆ+qÆEb²”ÓÄ’¢Jqžç¤8׳Vœ“°43¨‚zÏ Õ/e¡6G¬õäˆSk^§Ñ“ˆX­ ˆ“ÆËJT÷Jkf‰nt=.Nl-íh’ÈÅâu7ò7ð×ñ•¼÷ò.ÞÉçò9¼Q›®Õ㯇N›¬Õj5ZV‹y«5Fãd·rܽ4¬Ò³*®§JO÷%ZŠ©…_Cw„ÉžÌþ€9^c¨® ^£ëïÝ×zrÂ÷6Îk ?Ó.SxN{cاkCäcr1") iù8Ô¢òmÁövscxVs[”|ZEÁr¬…áGÈÀšÃ׫ó@!²‚CЪœ‡V@¡2¦l…ª¶#¡æÁYP-¨Em<ªš‡Ž¨j¯+jƒ…¡à`a¡ªÂ•À€ª2À•(*ðÄʽ848èñ¨ZÉaâU×íM«å¨•—£JM¹¢2XVŽ ƒåeªØóƒ¸(!nIˆ[TñÂÄ% ñÁ„ø ŠÝÿGO÷´ÿÞ‘…m; TÏŽP7¾á]ý=æðÖ%’4¸í¡ñ²ÚÕ±¤«GÝá‡ÝÁð6GP\xàâŠx¡#8B­mƒäî`d¡¼P-ºlßÓú‰­ßÛêÛsÉö(“õ)¶¶‡®!)â튭b+¤ØÚ.oWm)¾…–Ï›¶îÏú›o^¼nÝbø/ÒX­– endstream endobj 372 0 obj 4373 endobj 373 0 obj << /Type /FontDescriptor /Ascent 750 /CapHeight 0 /Descent -250 /Flags 32 /FontBBox [ 8 -12 699 682 ] /FontName /NTHLZO+Times-Roman /ItalicAngle 0 /StemV 0 /MaxWidth 1000 /FontFile2 371 0 R >> endobj 374 0 obj [ 250 722 722 722 722 722 722 722 722 722 722 722 722 722 250 722 500 500 722 722 722 722 722 722 722 722 722 722 722 564 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 500 278 722 722 722 722 722 722 722 722 722 722 278 722 722 722 ] endobj 122 0 obj << /Type /Font /Subtype /TrueType /BaseFont /NTHLZO+Times-Roman /FontDescriptor 373 0 R /Widths 374 0 R /FirstChar 32 /LastChar 119 /Encoding /MacRomanEncoding >> endobj 375 0 obj << /Length 376 0 R /Length1 6744 /Filter /FlateDecode >> stream xÚ­X xו>÷ÎŒF²^#ÙzX–<’G²„eI`¿å‡0Ø11›`bcL @j^’€±ŸÛöö$´B'L¢×g£¥ß…}(÷9Ø¡ n&ïcÏ@?¼Šr>ˆÁƒ`ÅúÕ0ˆíó¡e¿†2¸¶Á18o¡îBh‡¥pŠŽ¥^‡9ð\ ?b™Ô(j C)l€½p0uBû&œ w‰Ü–š‚.|7 ]ß‚€_¤^Çqñ¡ØX…’‹±§cDCrI” ¡·  =³¡ {Z†-Ž5mJ `«L((ÔÁè@»wÀ=p-{ Þ&+éff,Õ˜z!õsy~`û|´¢£v- ÀfìáAx&à/d5¤¼©GS©WR¿WâÇ DlS -¨· n‚ƒ¨7#þ%¼ï$|Ht¤’Ô‘62D"¯7hŒ 1û˜qVàÄÔŸÁ‰žñãh Ðê2¨D»WÀЃ=€ÀÚø1|NìÄKJH#y”ºè,º†n¤§èïY†a'S+–PŒžœ‹–×À5ø.E¿ma´hîÅØ=€–= 'á,Fæ=œ¿Ë„#}¿ ¯Ã;Øÿ'ð)Ú0áÏp¦Ñ ðµ'¾>B¯Õ`TÛÈb2Hv‘ÝdÙK¢‡Éqr‚ü =ÙD;hÝI÷ÓÓ×èô×ô#ú)ý£a\Œ}|†mb—³G8w#·ƒÛÍU•N_L–%¯O®L&ϧø”!ULíL=’J`Tÿ xR F°„ bT¯Eø¶áLë‚UЋëùfŒÍVôæƒèÏï⟂#§á\úŽî5Œú;ð!ŽìOðLC7ýœó¹€ሚpDKÈRÒAV•äF²†ô“[Év²Ç8‚ïAò-å£ä(9F^"“‹äs /GuÔDÝ´#ÓD—âÛƒó`ÝA÷ÑoÓûé!ú=úýG§ÇéYôÆïh’Ñ2ÆÇ”ác®a1=Ì­ÌAæ1æ ææs™b.3ÓÌ4[–³×²;ØûØŸ²oãûÎÄE¸yÜRn5w3w 7ÌÝÏqãÜ;ܪRUœ—øvþN~?ÿ ?ÀËð\i_}^ËÿyWû.b5dî72%8Wã΂§F´hÎìH8T,˜ðçû¼RžÇ-溜9Žl»ÍjÉÊ4›£A¯ÓfhÔ¼ŠcJ 0&ÍïvÇó»ãl¾´`AH¦¥¬èùJEwÜUó¿.ww+bî¯KFQrÍ‘Œ¦%£W%‰à®‚ªP¡;&¹ãç%w‚,_ÜåR§;>¥”[•2›¯z$<láŽÙûÝqÒíŽÅçöǺQßDõØï>É„ÉZ=¦•5Ç¡¡gg¿A–ˆÅRc,ž-5*<ÆëYo[ÜkÌñx:C…qÒÐ+­ŠƒT7gš+šã|C\Õ€ªÝkåÀˆûXáÉá{¬êêVK«{VtÄ™žN¹ S0n“ã¶í“ö/É+¥Ø=3̧¾ù=}ÃóÑ5# Òd·Lõ܃TËunÔI‡:;âd»eseÓÓƒè“brM÷:w\#ÕKýÃëºÑçŽá8´oóŒ;щl1÷ð’ɯ͑:{Dz`¸}ÛsÙQwö×9¡Â û®Jºl"Tª“±Òcß•ÆßîI׿~R«Èz±¥ýª×ˆlˆ´Gw÷ºÑ€ ‡2OÎúæÁpï<ç“ ÖÆ5 ÝÃB…ìSÎ'HîáK€a”¦>ýzMÏLÊ'\¹(ûê„Aþ•r<Œ`Ì1>}&4­F©˜*ŒçH›w<]mèǞΊúÝã‘C6’ˆÂ*$â»w¤i7¬Ê‡h$اÝ2çäŽe©ÌÙ}…sµy·„³ñ¸òAd‰«ó¯þŒ‚53Ö_'Öÿ…ݧðÊë]%á7|êÕG5,N£$A ¢™ *>F [M™Çvj’d=؃ÂŪéªE˜·NWAm•0$fsfK&É)SU𸢂›÷×Ó æôeùƒHê³ÔÛÌö僽рڠ¶Æ,OYY«Ãæ²Z Y.‹^“ã00–Qù4Žœ·Y¯7øäõ¨C´Z¨& j¸jº+/[Ÿ0z}~ÆúíÁ PE"Áª p’,ºØ:= µShÐÔ>C8¸S8&syyÐd+7•ÛA˜"ÂÉt>g6é*ÅIeɲY‹‹ÊJËð”œ[’ïŸë±Ϩx•”—?·¤´xW1µXÄÙÙBátºÊUTÝ^íx£¤ríño~cÞ¬éâµhffìMÌ£Áò!ãñh#]Óš‰ŽG¾-©ÀlÄÝ”Çq;á‘hïœo[¦]fÛ¯¹Ïö¸íe§:ªÜs³nDGu ºö¸VÛlÎÀB´$ª~Ü£Ñp:½Z£Éd3gš¹&–Ë àpå¨3Íf·™Ët›YŽu8e]¹®È¹«î¸ÀsA!CítU­zZ]%{¢uØ®ˆüÉÓÒŒs§&R83/M/“Ké¹Ù•áÌ>A½ó”[Ë™ ¾RÄHÝŠŸóÅéËÏ­!e5¤ØÆ|esæô¤¶Nc˜øyÆI¢”)^R¾Î¥Ùª¢_üû÷ƒMdKó®äåýR®Ç:KŒöÖ4–Ûª=]+Ø4&M¡™zx#G——ôÚuL^Ûñ^ò¥; rš,ßX_·%|ÏõÉ{•øúR3o2wC”˜¢OrþÜÚ€ßWQžU:k]õwüOù'ügü/WþÊÿFù[•F¶š­ñ;K«æV7Õvj—UoÉÝg¾×¢Õ–jÊìÄZÍFýî@SÀU¨%Õ³vc†¤m1庈YUî5•Q¿'°0PŸ[\T$šs]¹µ&s4*â=•”—Y|#äm(Ô6ºV»öº—7·1wUîÞ\6·©Þ•+äæÖgêÔEÏÙåŸhvFp[;%pƒ§»NwÙ¯†qêJ OÂ-Åœ â ® sv‡>9êJÉ%ÁqZ8 »ÚìÙsÒ‘ÊTB#áÂÂ`Õ«Á…V\$©xÆ@pa´®î:eWZð*·#ߘ•÷ÌÖÙ ueîçTth{ûè@¡»:C½‡Í0ŽÆVWûìö–¼ZŽÝ•ÁÛ\- ±¹ÕõtÝ"O¦ËÃмŒ ÞÏrÉö7Gr¶¸y†-d¢A­V£³ ¬ÉÕÌV©¢:Éäs=>Ÿ3Z­wÖ×Eν%¼u]qœGˆÈYØqÞ!/©pX&Ò¡©½4]‹L𜀯Æ\”ãÇ•w?ÀX¡¿ÓAð3×N„âÒ “«‘+Ê´ÚpÙYm™¥fy»Ä(EH˜È'E‘ÕÂE‡Ú—tÈÖª¸Êd£á TÇyK¤Vg×Ïj ­Ì“2änV§Ö¨HkÉÔFQŸ)…}ôÄpë-·Þò¬¹„nœîP¡çþtݱº¶êâ… {ò7¿B7¨µ:ÝtHC4êõ•ù^C¶Á¥-Ù%•Ê›¾ ûtOÝh¬ºDˆZ¡ON|±í ¦¦Roã‰_ÿ ¹úoŠü/$± †äcÉ#j‡(MøÊýBÅþ&5ÅH}ÆÞ™àd|Ü2w÷R'%ÔËè˜flPám_ë0Qð-à?"!M óLÏ*ùÞ±¬­½¡¹>¸d톾ÛB 7÷¬_Û;ó¯Nê3L}Ð÷7o<*L!¼ë/Â;år€Ó‡‰ª@¤÷·•‹ z_4ˆ8ªåéá…c éØÀØ=A÷ à~'‚6Aï@Às|7‚&A¿‰ NÐ]|‚îDP%èí\‚î@`t;“ ÛИ­ø ¶t0jD$„€†Èku´.‹V“[`èÉ:%¿AɯSò,%”œ=¾I¿q“¾.ƒüú‘~EÉ{•<3jè×ÿ¾_?Ù¯¥_ÿ/ýúI?´"Ã¥ä\4«U¾UoÕ·ê«ZõE­ú‚VYÕ¡ù“JîQòܨ­Yÿy³þÍfýkÍú±f}o³¾¤YïkÖ'È¿FMCúw†ôO éó‡ôÒÞ5„µÏ7¶Asï¨-¨àÂx[¡øcò¸q”"ùçq÷ ±.›œ„ V¦_œÁ |ˆñ(,Qðð«åúîñ¶¹b‚¬o«FX1Þ¶aùxÛJ„Îñ¶UØÅõЦ4Y2îžëL¤ÜŠÊE3]´Â•ñÄgŒ‹7aëÆñ†Ub†ÔAƒ"Vƒ=/Ctʆ×é‰eFiÆB&™¯?.ž§*dÙ¸ø1êñ‹,I°d\|ÏŸ ÏDµâ»þIñ\Û½âÙ¶ÅêŸ.Áêqñ'~lò¼ø¬øˆø¤_©yܯ(9œ{ØP#<–¾? ¨¼/ ‡ž¿í?/î’»Dí;QÁöÀyñ–¥ï i¸)€­‘»&0)®ïÛýJûkÝ ÷š%Jß +΋MEÿ|4KmV x‡Ð©3ÔjµJͪ)®‹¬Dêýh¼Ãd©T¬œ³JY rNÓ[%j Íuv: jºÓ]˜öbºÓnL»0ÝŽi;¦­˜1 §ÞNn=A‡éíÇ…tñvº}¦r;½k¦tÝ:SÚJ•.âçä>Ç›$5'âªýx5Œ“ƒ9q¼xì´[­ƒµöZs©|~ãßȺgòà—ýïnüêCZÚ¶ý§éïÐõ"ù‰’{ž_åÅ#¼"Ñr Œ*£ŠÀ¨,0ú*?:#`wÅh¹®#þ´«3^$R®Î–xXþa‚ÖÒêXã­‘¡³cÞ¥µ±v¹ÞmìD±åŠîÚµ(2 yDY yZëM‹¹i,Ö&ŠÑ-àVÄÜt‹"6)‹¨ˆ5«¨PDØ`@`_øŠÈÈ×EF‘‘‘EÄïG‘¿,r,ÏÇüy Ûû%{IšN³Ã »ìKv ÍnJ³›ü|úêÿéØÚëê­P[kWnˆ¼.®’êã¼ô?é¸mæÁ"ÀÿÒR endstream endobj 376 0 obj 4870 endobj 377 0 obj << /Type /FontDescriptor /Ascent 750 /CapHeight 0 /Descent -250 /Flags 96 /FontBBox [ -10 -19 768 682 ] /FontName /VPRCJB+Times-Italic /ItalicAngle -15 /StemV 0 /MaxWidth 1000 /FontFile2 375 0 R >> endobj 378 0 obj [ 444 611 611 611 611 611 611 611 611 611 556 611 611 611 611 611 611 611 611 611 611 611 611 611 611 611 611 611 611 611 611 611 611 444 611 611 500 611 611 611 611 611 611 611 611 667 ] endobj 61 0 obj << /Type /Font /Subtype /TrueType /BaseFont /VPRCJB+Times-Italic /FontDescriptor 377 0 R /Widths 378 0 R /FirstChar 74 /LastChar 119 /Encoding /MacRomanEncoding >> endobj 379 0 obj << /Length 380 0 R /Length1 3580 /Filter /FlateDecode >> stream xÚÕ–}x•eÇ¿÷}?ÏsnŒ³L‚¹a"Á‚1!CÎ`!ј07ƒ«;2@&ˈ&-R2BâÒ"Ùb(#L¸ —‘ R‹È(gýîïŽþauõ_×Õóœûóü^î—ßý~ $£¡Uåa ƃbi“4kÁÊåYKg68€Êt¯Êð¢ªòôp0#Ä߸hImey~K’è¯Kž¢Å Ë+Þ¸~ñz±’ßT'E‰>`qÕòU=ÿ®V‰^!z¯%Õ Êñ´J}•¢ª|UØŸ¬ýѳ––W-¡Í·‡-|Ÿ±Fñ’´èÊ×Ú^’5¸R4k³šméÅD Öc„¶†ïaŠÈ»Xær'ù]Ö¹w ¿CùyÚ¿ÍÖ·Óò\¢¾ç䎵š­ÏZ ¾ÅrÛP(ü¦Ì‰A3Kƒ­m¥ü Ùd×1¾ŽÏ·Ðò5r3kØDïÓäSlóIzŸ•lðUæi¤w#áœ>Î<ÈÇp‡eçe‰m=-’ëkgîÍÊFn‹µìOs4pÞÖ²?õ2~íâ©§§ÅS‡5ÒªKÚ^ƒ¯ @lÖc„vD¬ÅîV[ò!rµœ6×ê.í<È\µ´¬" W²×+ »öu –a‚”¬éÒXÒZŒÜÿaÎþýô„QÍÙsöÃŒ­Kq»Øª9ûÕŒÍZ ¾Ì2‹ÉEäBryYJÎ#ç’÷ÊÍc÷ú½ÔJçÊÅäÉÙäÈYäLÎÔ ÊÓÉ»ÉiäçÉ©ärRçï$Òϲþ‰´qG§<Ž,$CìÍXÊw‘cÈr4y'9JJYsVIŽ óÈád®Ø †QJ~ŠÌ!‡ÈÿT#ÿº­üIryJ®|­6+ôvÊÙäôö—ÃÈ=²E¤=KÆÈÈÿ5›ÿVZ2(÷#ûv­ƒO}Øö-Ì•Nö&oN0 £Ó ©Ò¢+_kë)÷ÐÑz²Å´„/»ÑÊFÊÄI[¶wW -ÝÉd2‰¼‰ìFúIò…žœ®¼£À;Š÷‘[.ƒ´5+Æ_&½/kÔþ¤¤g%E%”äƒRS×5ªšÁÿ“ƒÿèÀè= endstream endobj 380 0 obj 1970 endobj 381 0 obj << /Type /FontDescriptor /Ascent 701 /CapHeight 0 /Descent -299 /Flags 32 /FontBBox [ 42 -177 550 706 ] /FontName /LCQCJB+Symbol /ItalicAngle 0 /StemV 0 /MaxWidth 1042 /FontFile2 379 0 R >> endobj 382 0 obj [ 250 600 600 600 600 600 600 600 600 600 600 549 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 549 549 ] endobj 108 0 obj << /Type /Font /Subtype /TrueType /BaseFont /LCQCJB+Symbol /FontDescriptor 381 0 R /Widths 382 0 R /FirstChar 32 /LastChar 62 /Encoding /MacRomanEncoding >> endobj 383 0 obj << /Length 384 0 R /Length1 6316 /Filter /FlateDecode >> stream xÚ­X tTE–¾Uï½~ÝIºûu'én’î¼î¼$ݤóŸŸÎOH† A‚ !þ$&ü …&ÂéñEÑqgu‰<"2ƒ(+Y!þîèñow¢ãA£3.8ãHº÷¾—€ºÇÝ3sξꪯnÝ[·nÝ[UïU€(è|íëÛº NbËÌËÛ{69ßú`ë’À•®ìZµ~ñ™±‡¦ €‘W­ÛºòÞäûïˆpb›¯³£mÅ7—a¡ûçwbƒáLT)Ò"Ô¹~Ó–˜nèDú¤cÖmhocæ°!¤/*V¬oÛÒ¥­  ýÒÎ[ÚÖw ï~hé«H'wmظ)ü)1˜’Nëêîèzû›Í<Òõül# ÌG™‘!6BÊTËßûPµd~–Ç¢6až qÜBˆfÖC@ø}ÌŸcþshI8ÄåAzèpø?;Êÿz*O>.8 ÷Á˰v`ý‚Ra6ŽõÔA3ŒdáøÃ”ûlP kÉ'8Æ3è³×Q.üp,ؾz° T¢ìóðÀM°ŽÁ9xu§A,„:~²áA¸H~Ë2ájÊ€|X»aø¤C jê…;‰D6†Ç¡Óz´ëWðOðvøMœªÅ(¹G:Ft$øHz×Ú“õ8Ò"ìqœhiu¸{ECø æ@Ú½hÙxŸ,£›˜ÁpUøTøwÊzÀþ)hE!ÔÀ Ð ›p„p†á;²ˆÂIáÇÃÃáWÃ_«QáÀ"ö)ZÔÛ«`?ê âŒïcƒÏH™EÊI=é#’WÉ[ÔϤ3{˜!VàÄð_ÁŽžqãlRÑꘅv/…›¡ GÞÿ ƒhã%ø–ØHÉ#Uäqê ÓéJºŽÐ¯Y†`Ç—TK(F‚GOÎ@ËKa¦…è·ÍÐà^ŒÝhÙSpÎcd>†qø®ŽðDK<$µÏEû~O>¢j¡­ 3^¦”ÙÀ¾ÁŽqþÐþÐ7á¦psøÖðIœýG8–2sÅO7Á2´xν£½c§¤]˜öÂcð$<+ì(¼ˆ#ŸÅ±_‡7áCÿ øm‡ËðW¸ hE0Å;¦d’Ž^+Ũ֓¤‡ì$½dÙMö£‡Èqr’¼†ž¬¦M´…î {é ô úý€~N¿¤atŒƒq¡Ï±Õìögànæ¶s½ÜQMþÄåPAhqhY¨'4æÃ†pj¸'¼#üh8ˆQý“êI-Á FÄ‹Qó1ÕãJkåÐ+a-Æf zóúóaœáÓpãô[\K¯áìÞÀ¨ŸáÌþßÄpó³èçi¸žSIΨgÔH’&²”,#7“•¤“ÜJ¶‘í8ÇLûɯp–“£ä9C.‘Ëä[ /G£¨‰:iF¦š.ÄÔ†ë`=ÝN÷Ð{èýô }Œ>Iÿ…Êô8=ÞøŠ†˜HÆÀ$3˜üÌÓÆÜÊìg~Ã<É<Ã\`.2ãÌUf‚™`óØBöv;{û2û>¦?q&.“›É-äVpk¹[¸~î~nâ>ä¾×äkd^âø;ø½ü~…Wà!Üi?~NAìß}²= ÏÒQê‡Oà ôÀ.:÷N6yêÙ%0‚§þ>@^ÕU íä(Xð¬£\-80Û˜¸¯!üÌã˜/…*ðD^èTø]&µ¯ ¿Ëõb ûqÇ›qGŒÂ笎ÌÇóãf&×ï TìTÌULŸœD‡äWZZ×8eT!uö¯iEŸÇõËаÕ5çã‹Íïìol’\rY¼ÔÜVe?ý [Ÿ›æsNû)'=mضs– ]6œ^ž^®à,—mç$þq×dû›§#U¹‘Ok®{(†Hsq²³Ý‰4I8•™JÑ1úÛg¢>ͰZÖU¶ö EŠO¹dArö_ £4þåO[Ú¦Z4ÉÂPªJ°¯/ä_«Ë^¯œšŠ1Çøt`˜Ð´RµaFzZ/u N9]õèǶæ¢Lô»Ë¥„l èƒåHȽ š&i',_¦·Y¦­ çô5NìB…Ó{s½{«„«ñ¸ú+kS®ÿŒ‚%ÚßY$ËÿÁîPù@•ý®‘ð›GyëUøt,ïNã§$HS}Ñ ÞO`š–2~ŽmÖ…†É:°y…ËÅÅ󱬛(†²baI,²³$“Ë䯭É~_ÄÍüÛÙ söêLP¿Þ6à©ÂãXvxÔÏÛg[E.²îÕÝg}ÂúŠ]ëÓ?áZ5E£‚tõñÈÈsV|y>í.Ž‹Òkuºh8s´™«f¹ qŽxm´Ùì4sÑN3˱'°¬#"Á‘yÁ+“Lo±W¸Ès^Á›‘eÅeÚ m±É\XX˜922B„‹™q%ãq¶ËBÏÅLÛå–¸’‰8[vi)ÈÇD5¼;ÚŸ òR¼„hxMlŒÅëÚ~Sré42ýË;¤…lå’$náÎîÐX§«Y7!»øh×R¶°ú8Of…†¸êe-W9WœÛZŒoRÕöðçÌQ<{3Iµï˜¤$!Éž'äÙ¹h{­µÅº-q[Ò]‰w%rtL<˜tÄqÄu$ñHÒIÇI×ÉÄ“I¯[ÎYÏÙÎ;λÎ'žO:—üNê;ÞOS?õ~'9u±ÛééÞ ÛfÄ ‚ ËLÃf¥$[ü4Éf´ŠVj5Y$«¶‹tzxI[«'F½Í#%‰év“`O'RR¶Ñ$ æ Á˜ËH4£‚Œx“ÀZõ`³j2=!¸#Õ¦ì,£‰‡ÿô91™­…P6^æUÖF™ÉZ¸‡Ëðv#{´6µB” àÍ…¦ÂB¯Ò`áʸ÷*¹Â8N·L‚pn Ý1¢ÅÞJ!h¯U1R·âgm.~ßÌÈKág”’‚R’keTÒ=Ãk œÙ’›ƒ±´ˆ”˜âÎ nž±er ×8t[4ôûÿüµ·šl®Ùºº·JJpY¦‹¾öòÔªBk‰«e){JgÒ¥™©‹7r4.âꢡýI¶(&1‘mú8tæöÔøêØ_¬+ßœq÷âªÐ½j|“טw˜»ÀGL¾§8wB™Ç\T“?}MÉCî§ÝÃîsîWf½ç~«ðÝYF¶„-uÛó‹g”T—5G.*Ùœ°Ç|oldd¾®ÀF,%¬ÏíôT{i‘¤ÄeŽÜ!EÖssĬ)L2=>·Ë3×S‘›“#š e&³Ï'šÑŽÂ‹‘÷a„’*Ó"«+»Œ#)¡*ayÂî6¡ºÂ‘ $$TD*æ”gö\°)›pÓìÈÄí="p=g[ζخ‡qüZ GFö0ŠSAìÁtÁ§„O‰ºArEˆ;+\•]‡ì¬ìÉHE«¡‘pca°ÊˆÅÊàFËÍQ> 4ïöyu­ú®x{NVŽ‹xÑlÍFƒÑh°gåp±ÔËÇJ–ZOƒ¤ÄgÑä#'ÞîÈÊá3,…–"—'cVQæïŽ¢#'·ÉÄXÙå‰2¥.ð¯W‹ ž×ÆÆ)çEçXD¼•åæ˜gäQ\¿ªï’ ò­ØŒ¾Cßd’ t‘"ƒ^šrÝ OÊ´”XƒÆ¨Ë~¯VÊ^pƒÆ!Sì´jŸàYÝe1 ^'§ôK6 ¬xlõô²ÐÛÑæŽ#̬™dNïñ^†uåQfl´å+yÙpÉ¥Ó¦%‹©³ª×Ž?øíÏçxÕõ®>ÿµÕwìfcñB´*}zøû­×Pñ ¾aðkt×oëÊ¿ ŠB¿ ÑÆiÒð¾}ÏrìÂãìFØÀì;^Í“™}áóÊÿ$OÑãTuqx«ÔÀÌo¬ä📑&ê(æ©5Ê÷í¼Ê•5ÞÆÕë;6¦ÏÝÔ¶nuûÔá?cŸý²æ0àÝe,}>B¢ðÂ,Òû‡ê Å ½ÏçE h<=4wp.ì ‡º ÐAq°ˆÑAç`==äCîFÐé.|=Þ¤·#à;²A¤¿DÐéN>Hw h‚ô6.H·#°Aº Ò­hÌ|ÏoF€ íñ ! #ÊåMë+¡%äè=Y£–7©åj£–‚Z²Ç»ôºôåäwЉô«jÙ®–Ñ>C§þëNýX§þÕNý¿uê_$P‡ ‡Zr¾˜:ýh^®Ó÷×é‹ëô9uúÔ:EÕ7Pƒü1µt©e‚ÏZ£ÿ¶FÿNþý`¾½FŸW£O®ÑÉ¿ûL}úûôO÷éSúôRŸÞч­Ï7ÖAwïAµ¨àâP}šø9Nœ¥HþuÈyR,ŸFNC«Ð/Ná0ˆ*ž€J’ŒxU|ÜZ¥½u¨~†$ˆêK–Õ/AX2T¿ ¡y¨~9±êÕ.CÎ1±ÜDÀ©ªœ?5D Pç!>ƒ8gH\…½«†*—‹å:R•ªX)޼Ñ®^®'±SjLS0+|ýqqT/ ’ECâ%Ô“<$~ÚdÉø±;HŸñEйÇÄ õ÷Šç냛_nÄæ!ñ%7v9!>+>*>åV[žp«JMŠ=â j˜”¾ß£ª¼Ï$Oˆ÷¸GÅʨ}*Øæo©TÇ^? «<ع+=cârñv±Á­ö¿Á©rç5ªcÏ-«=ªþÙh9!ú£b…GØ'ªŒ²Iª`Rmþ$•+ªÚ²ÔÆÌÉ™¤ãÓUÛ½hf²Ï(&‰Ý¢«r•¸PÔ‰ºÀI² ?td§¯<ÆzùÀF>°–¬á‹øÀ>0“dðD>ÀÇhÍZAkÐFi#´Z­FËj)`ø_ªrºÄh4¬R²j] JI'8J´jÊm´´t/æ;1ïÆ|æ^Ì;1߆yæ-˜{0÷‡?yNé=LûémÇ…ÉêmtÛTã6zçTíNºeª¶…ö¨5ÜÄÏ)c"Õ”á>™ì“5{ñú!“ýñ2^nö7Û,–ž2[™¹ÔT8»êgŠÖ©ÒûÃcû‡;xüÚú­/á2ý ]/’—ÔòØ ^|ðªDí(Pª@@¼Î¦lùÚ›äÃŽf9G©„͵r†rO¦e´Ä_5LKhn†h™¿Ai‡ªšQl‰*†§vŠA‘(Fƒ¨ˆ¡1‡U±öI1'-UÄê@1ºœª˜“nVÅÆ±cÝEþªcEEª{ ºU‘nöÔD~*2 Š L‰Ä«"n7ŠTº‘c‰n8æNTÙI?°'Ù“ì •]ðÛ3É®ždW#ÛûÿøtTü#ÒþÕ7VX ¬Ì¦Þ¾ø(Y#Uȼô¿éØ8õ`à¿xLQ endstream endobj 384 0 obj 4541 endobj 385 0 obj << /Type /FontDescriptor /Ascent 750 /CapHeight 0 /Descent -250 /Flags 96 /FontBBox [ -26 -208 768 682 ] /FontName /LCQCJB+Times-Italic /ItalicAngle -15 /StemV 0 /MaxWidth 1000 /FontFile2 383 0 R >> endobj 386 0 obj [ 556 611 611 611 611 611 611 611 611 611 611 611 611 611 611 611 611 611 611 611 611 611 611 444 611 611 500 611 611 611 611 611 611 611 611 611 611 444 ] endobj 88 0 obj << /Type /Font /Subtype /TrueType /BaseFont /LCQCJB+Times-Italic /FontDescriptor 385 0 R /Widths 386 0 R /FirstChar 84 /LastChar 121 /Encoding /MacRomanEncoding >> endobj 387 0 obj << /Length 388 0 R /Length1 5800 /Filter /FlateDecode >> stream xÚ­W tUšþï­ª®î$թΫ;¦ªSIºMçÁ#òè4„`À€ &„@@"1`xI…&Âé8(8"E›e:‹(#ì("êèx8¾v':®=àèHºö¯êaÎìžõœ­ê{¿ûßÿ¿ÿý·nß â`;0àkïjë†~Êà÷°L‡4n!$2] Çò)–¯Ã‹µ0Wùá§µÿ`2PþWÑy\ð4Ü/Á&Ø†í» È…Y¨õIh€%>˜ˆ= »Pî[p@-ÜB>Â9žNxå²Áû ûW@/ŽÏj”ýWxŠá&Ø Gà4¼ƒºó`,„StH{&ÁCpŽü†e´j*€iÐ;a¯vò¡5m‡»‰BÖkc°ß.´ëçðOðíMô‹‡ÃÆ2”œ3!2øH?FÕ "Ú3q¦E8b˜˜i­Öƒ£¡|P³¡íÞ ÷Â~´ì$œ'ËèfH«ÑŽk¿×׎ÏA+J0;×ClÀöÁQïÉ"jÕ²´Ç´íeí+#O8AÂ1åPz—Â*Ø‹zCèñ»pßQø„Ä‘¤Š4’~òy™¼EýL>³‹ ²"'ißAFÆÞä¢ÕÅ0í^7Cμþ†ÐÆÏà[â Y¤ˆÔǨ“^GWÒuôýŠeØAvTṵ̂„b&xŒäT´¼æâ»ã¶Т܇¹{-{NÀÌ̇0ßÃ%ž˜‰‡¢ö9hß»äj¥)T¡3里—©`Ö±o°£œ?¼7üÖ¬µh·iÇÐûp.Ýs=N7Á2´xúÞ‹ÙîÃÜéï|wãð<…+ì0¼€3¿‚s¿oÂû8ÿçðÚ0à;¸ãhEñM&øf“|ŒZfµ‘Ì'½¤l';ÈN²m<@†É1ò*F²–6Ó¥tÝMŸ§oзè{ôSúý+caœŒ c|š­e³‡8+w3·•ÛÎ6M¿.ß^î ŸÕxͪåj½Ú6í ¬þň¤âÁ fÄ‹Y‹_ê<\Oó1»Ë¡VÂ-˜›MÍ}χÑçàæé7¸–^EïÞÀ¬¿Ÿ g…`ÂøÑ³çT\Ϲd2zT‹5‘…¤™,!ËÈÍd%é$·‘-d+ú8ˆï^òsôò1r˜!'ÉgäùÓËÑ8j£2ÍÃÌÔÒ…ø¶á:è¢[é.ú úÝO¥OС*¦g0_Ò0ËX™l¦_?3—™Ç´1·1{™_3O0Ï0¯1ç˜1æ3ÎŒ³El {=»•½Ÿ}‰=ï_8WÈMçr+¸[¸[¹înˆ rïs?˜¦™T^áðwñ»ù}ü„ßÁ/ñK»ú9ÉÿçÝëax–ž¥~ø>Çì ÓñÛ™Dž…Fv1œÂÝ'ƒþ>H^Å•Uíä0¤à^G¹zpbq0ûð»íOXư|ž‰û òÂǵw˜ ¨}ö·s8€_|~gáSÖBæáþq3S„ëwî,|“'M,,ÈÏóæ^çqçdg)™.YšàÌHOKuØS’“lb¼Uˆ‹±˜yÇ2”@ž_™Õ*«9­*›£Ìž¯ÓJv´]ÕÑªÊØ5ëZUn5Ääk%}(¹òï$}IßI"ÊeP–Ÿ'ûY=[£È!²x~3¶÷Ô(-²:f´Œ6›c.ŽýŽÎY%­²_ÕÛ9ào­A}#åC_~“Ÿ#¶”ò¡X]³ ÕmÛ:º„_MSjüjªRcð˜lÛ µq~³¿&ÝåjÉÏSIu»²\e¦ï74«|µjªFÕòjÝ”ä¸7$ÂòVoÜ eEÛ’f•ikѧ°yU»R£Ú·Œ:~$/·ü÷F™#S¥Ù³Ú:fahgGÈVj»©údÔIû[šUÒŠeÝ\ÝôˆŠ_ïi]#«e¦Ò9°¦cž6 Â‚Í®`ZšoDÃ?6¿<ÐÔ¬¸ÔÊt¥¥­&ãH ,Øü\ªON½–“Ÿ7âè›áÂäWåWé8Ãåè‹àŸwDúß<kÈú±~Á•¨Ýez¡Êí2Ь +Óõªc: ´OG1|Zaµj©nKõ˜rÙ¢"\L£2öŵ=mÑS¶xô¦žì+ ù—۪׫ææbÎ1?˜&4­Â蘚Ÿ×«¦+Ý¢¬¦c¨ ãØÖRZˆqw¹ô” †|° uûüæ-Ãòô ø ½-*mÕ9'.s’êœí—9W†·*¸‡ƒO²jιò‹Sý¥*Iù_بþ½›<óèÿz3}–÷gòS¢¹¾D†ï'j¦ŒŸc[,á²^ñBÙxÙ<¬ÆË ²LG«I›ËæÆ’hšú¡”›þ·WBÌ+—¦ë;ѾÖÎ3c8W6ìôyÌVsŠ?ù©6%ÍîLI¶&9“Kzš•IöS¶%-=]Nkvˆ¼éK“R’©Å#Y¸rÚ—™*äx¬¢ äĬýÄáõŠe¤Ð[æOyÆG¡r Ûe-ðnO-¡¤Äk³—ØJ ŽñD¤ž4‘,†;’)9Éž2erñ´bü—œZ”ãžêJ¶ž1ñ&%3gjÑ´)}Shr²41UL"\\ÜŒåÔ¼ <í­¢«‡vûôëÆ§äš%«71Ñã¨e󖤻ó—+¶pé¸e¤ùàí¾¢RÌÀ:ÜMyô;úÒùŒYöE±‹ì»-÷Û·ÿ.ÃìwÝ7GãBtõpll]B 6|E>óã.‹…‹ÌK" \BbWËr1ÒœéæÄ„9K”XŽuz8‘e1œ…¯] Ç9žóŠÞ‚¨/«4›ËôH”ž:uŠˆç ÓÊÇÒÄÞs…Ž KÓÊÇÓzD0 ˆLïNt1îâ¢/!‰ä¤{²këMÙ©äº/êP²Õ‹³¸…}=áÑÎR·v\uñ‰®%lIí0Of„ƒ\í²¥—8WšÛ^†'ãÄž¡}ÊÆÿœBRë{#)+KÌÊ(‹2¸ÄŒzûRû–Ì-Y÷dÞ“uÀ¹ßµ?sÖ!ç!סÌCYÇœÇ\Ç2e½žrÚ~ÚqÆyÆu&óLÖéì·sßö~œû±÷{E¶($#ÙŸï-pD± ]mXZ£X¯d9ÒSG¼]²S»-E±›»I§‡WÌõ‰%KÊ/Ȱ‰ùDÉšoÅ b|A:~>R*(H·‰¬]‡ÝTè©ØktMš/âŸÞksbK°—èËÏ«•¸èvq^+®Â]æ‡Ñ zð§/Ë\“¸4‘•yqÌ{‰\Œ¬Í¥OïÍÛN™q´^‰æËMÌÔmxœŸY±üÔ R\A¦Ø™«0—YÔv+Áeì. nžÉ >ÊLi*Yã´l2ÑþóWÞZ²±®/|iw2Á•räk¯Ê­)±—»–.a[l–¼êâã9šsiQpo–#ŽÉÌd›? Ÿ¼37½6ùöµU î½±&|Ÿ‘_ã™7üñÍñe 1ô‰‘6_FmL;; ž:Àr嶦ß2!Œ 3„>dN3¥Úž«Î5,û'mŒÙ£}Í®‡uÌÐo^Ó HŠhVt^o&Xƒ…â­E„ÉxKü”<„41$¢³™ô3άš¦êº™Þ¦Õ]ëóçlh[»º=zSÔ¾ÆÒÿðtÅbÉÇ{Þ6Ÿ§8¼4Iô`c‰¢÷û¼ˆS€§æ Í¡C=Cƒô@ÏA:$ •ÒÒR:$5ÒòF¢çJ‹¤ä ÖJI!:€¢÷ $„èn[ˆîBCôn„øíG°†èN!Dw àVqBlˆÞ‰€ûÅvKˆþ Á¢}|ˆnC0…è\ˆnE`Ct ¢›ИM¸×oD€íõÅ#BÀBô¼ÙW•DËÉ­Ð Þàõú&£¾Á¨“ŒZ4jv¸[X×-TÅßã½P /u»Q'ú¬ÂWÂh§ðr§ðï ¤/Åq5çKjÎ6jƒ0Ð ”5“„Ü]Õ7xyȨQ»Œz‚Ï^'|['¼]'¼Q' Õ íuBQ]'„È}¶~áý~á©~!§_Púg?ö>;_–cx®Gç‚yÒóä$Èè¥D~”IU©ä”²:ýBG@2ð(T“lÄÃÐdà3à6ëý­ÁÆ©Rˆ, 6–#, 6.FXl\†Ðl\ŽSÜƦ <*UÙÈ •ó¢S4À Õq.â3ˆ³ƒÒ*]¬^.UYHTb8ó"Ä Ýð*$GÕØ¢Z±è|aX:+•†È¢ ôêÉJ7…X”>t‡è3¾Xé÷¨ôZã}Ò™ÆÅî—š°;(½èÆ!G¥g¥ƒÒ“n£çq·¡ä@Dì9dFx0"ý€ÇPy¿'Dö•~á>+õéS¢öm¨`‹ç¬tkµ1wWVyp4rWzF¥åÒÒ·1þzÙàÎm2æžSzVªõúg¡ ä¨ä—ÏJ3=ÆÄ>É`TF¨âˆÚijŠdh›4htF<ÉGóš Û½hf¶/^Ê’z$Wõ*i¡d‘,cdv¤ÏWÂåÛùÀz>p XÃñÙ|`:(à™|`ŸdN0‹xV‰3ǘÍf“™5Sü.’BÚG¾\}wI2‰:˜X½f¶HõšF¶'JÌêªtÌt7–»±ìÄr–íXú°Üe –MXz± h=§¡ôŽa1Ò¼ƒn‰vn¡wG[wÓMÑÖ&Úk´ð#~NŸ1X"Z¿Jö¨¦ÝxUÉÞt¸{[))½•ŽÊ„ [ɬšPµFkïã'ð^ýúÆÍ/â2ýC/‘úÈQ^z—ñ†Dý (0†@@¼Î¢§ú`ý ÍêÓÎu²ÞМ-õj~W¡•´Ü_3B+thih¥ÞÔ´ ØbC wíJƒRPŒ< ’.†Æú`à¿w”£‘ endstream endobj 388 0 obj 4102 endobj 389 0 obj << /Type /FontDescriptor /Ascent 750 /CapHeight 0 /Descent -250 /Flags 96 /FontBBox [ -10 -19 768 682 ] /FontName /FDTCJB+Times-Italic /ItalicAngle -15 /StemV 0 /MaxWidth 1000 /FontFile2 387 0 R >> endobj 390 0 obj [ 444 611 611 611 611 611 611 611 611 611 556 611 611 611 611 611 611 611 611 611 611 611 611 611 611 611 611 611 611 611 611 611 611 444 ] endobj 129 0 obj << /Type /Font /Subtype /TrueType /BaseFont /FDTCJB+Times-Italic /FontDescriptor 389 0 R /Widths 390 0 R /FirstChar 74 /LastChar 107 /Encoding /MacRomanEncoding >> endobj 391 0 obj << /Length 392 0 R /Length1 5096 /Filter /FlateDecode >> stream xÚÝ7kte–÷~UÕUyTÒ ytbBu§I“GwhˆÄ¤’tGHx„ ‘Ò €†Á,(ï0TtgÔqÁ*Màt…QœÏpÆÃè2ŠÌòУ“³3#à"¤koU"ÊÎÙý±¿ö»§¾ûüî½ßý¾ª¾ Ѱ8P[Ú(ÙHrã[ºVØ_(+‹%úŸº°sQû†¯Ÿïn°“‹^µpÚÌ Né×ÙÖXpå–ê&‡òQÔF‚è6¾ø6âGµµ¯X™´Œ¿ø´‡;Zl÷Sâ_'ÞÚXÙ)ÝË~I|ˆxûÒ@{댛Ïÿ±±¾³cù }Î'žâƒ§ó‘Öε¿wms,GI†`ìÇØ þÇ? •€àÿÁøáÆ…À„H§ÇÆ= #ô‹ô Ðóe¸‚ô¤ ¿©ÿ™IÆ}ÆÃÂe%à‚4XÏQIÖÀy(„dÈ‚‹XJ|œÏ` <'¡öãýÐÓ Úñ>…‚"ðÃKð­Xd[?­:¢¿M²"Ø!¸÷AyÙ?×OÂ^ø®é/ë_‚6‘ÅYýßÁM·rK*d’Ï%Љyl…þ”R¼çàœÇ$½a”€A´ÃRø éÞ„³ð¦ÑnòÀCqª`l…§àYÐàw¨àãø"¡·éK`6e°„Öí¤ÝœÏá‡Çñ”ž¦÷é:Åv¨0õ»áEx~aìN\‚œ‰s8'7N—õ±úM²¥ª©P?¢í°švò¼ ï|FQ³°ga'®Ç<Å*¸¼(LÓ7R–Õû>‚é”ÿrÊtâ>ãnð©ü þqþ·üiþ‰ÿ']° a–0Ûb³[º,¯XЉ¿ÏAjü8zǫޫØ.ö-¬e÷Ó{ö}ÅþÀ&ÑI¬Áƒø UêUº·ã>!P " 6R AíÊåÌpØ•‘éi÷¤¦Ø’“FÄÇYccäè¨ÈI´<ÇrýΪ&»æjÒx—sÒ¤<ƒwHø I³“¨êNÍÞdšÙï´TÉrá³T‡,ÕÛ–hµ—@I^®Ýï´køœö>0£èí>g£]0é©&½Ã¤e¢Z`÷ÛÚ|v ›ì~­ª«­Çßä#wý*,2/—.U"Êp¬Ae`M›aá×R>¿–âô™:.ÓX ÕÎhðûîq8ór5¬lq6kà¬Ðbs†—ëìdZ×@±órùÃÖèÎ[C*47TàG hÔX“#.GKvú´äÇ.Û¾g¿£üÛ~ ÔXfU µ§ŠJ³uÒÛdpmÄÕÌ´“[¶©±AÃMCI˜¹í¢Õé7$MKìZ„³ÂÙÖ³¤‰ju ÁT5Õï ø5¨m¦¨)&“—Ûo[;ÑAEéÏ+Ï+7ðD‡míþüÇCò?ˆ2íN^ \Sw».hDrN¦45{‹ÄI¹N0¦Ö ÐÓ2Ìh4"ír±QÙÔc½—ViB¦Õiï¹tPοÝ) K,™Ök`ÆqÞ¾¤¦éå _±géwŒ£ïCeÃÉ‚%„³Õ4àÅÉD üdŽc©q2BŠñ•£ªÎ–“3íjÉÔÁ’iÖë%S­ƒ%PV2Xb½JSÇçˆMCè ÝüV¨ùöPˆûË­L³]ø(ü ^§/ʨV]ïñÈ1‰cœEfœdÝ%F%&'§î± %gÄI9%!ñ¤cål3ÔÔÁÕئù[}W lê@±×‹qñÉÅ`ý}ä-âèR,çrŠ®ÂqEÞ±I‰x}gýˆ¦Éñ‘•cªî­([PûWVÑÚ11’8~\Ö”–Êåý }uÀz}ÊÊ(^å*u¤G»l™ .)3ÍeÍä]rrd!@"+D1(!–¨¨”˜BÀ4EÜc)D.ަæ4<6à²áÁQñqãF3ggILHNòÆ,‘92F»â¬ã‹¼lÍRGé¾}eŽ U»¸®µôÑð…w×uÏ}\ϤÏ|Á×?Øð—OÿóbwX˜øwOiáCã$dG³¥¾ˆËæAt¨)] ›˜+¡(E6K2¸ÍâgÂ9„Kƒ#šB¸V“£9ÆK‰‚$FÛ¨öŒ ¡çPt´œ’l;†+Á¯âƒ0|×è’ EIýÔk·ðZNNhcI‰q IɉŽBºqt2,ba¦—5c]çàéUÕ¶¬Ô™£°#Zh"nN™:†Oi)z€{É36ÝšF?L?Ïícó„jýD(WmôÝf(Pk€§xŽd¢Aù‰”Ÿ|ˆÞª9¶œiVºÅfJnºçKJJŠÍ[YàáЋÎÑbrÂz„ûoܸÁÇà¬ðþ?\ð]Ë,º\0?¶ä¢dò'úo®úëçßÐÙBlÄí¾4l6;á}á7Ä£w4߯…Sà`æ5„ô<ÁÄÓs‘í£Î‘þO¬†×pnĹZ„ùät%aV‚Ñ$úûI†fÄøá¢À7gFeuENýâöÖåyuí¥F cè­Ðz×FZ¤‡£®.ŽÞ÷øXøc=ÆÖcÙ™lÜSj¹Œ7)„Çœíæl5gÀ›j”!Ú!â þ½|:ãIüŒ£ù3þ¥h¨ƒFÔq&QŒD ŠÁf<µŽÒ[Ç ,Á“D?Iôz&–(³’t¤ƒ$$áa>qµa¾éq:qFÔé&ç!®Œ8ɹ)š›8·É)L ¢¤ÁË8ëÅ*o/‹QŽQC4šAÁ‚àæéÊ[øØAÆ'Íy£c—ÏÛåsvùI»¼Î.¿…[¡–›3ª1µòǵre­\V+ß[+ʼnԷÉÈ© Yò›Yr(KþU–¼:KîÊ’ó²hu/ý•ñWæü´j¯–¿©–ß«–Ÿ«–7UËUË «eGµÜœ&J“ïI£wpíáØ±;b!‚ȾòÎ$»v°À­”‡ðëC^%'·H á–`}.¡ë÷+剸²y¤­‡lfàÕà3ñ*ô˜x%zLý¿ÝÙ´ly°ô%BË‚¥—¨A¾©\ô^"é„`ý<¥<½Ã>Ç‚O2p^°ô)R æ~ ”ÇáhÈÇL¯©v‚×4ÏÆ–`½‹Ì…>JTÏ!•pwˆáa妻N¹žâIr-?$úkvˆí*Ÿº ©ÉÊ_Üó”+­VN’‡wê/)ÇÝ+GrÍÿê;fx‡×©Ë}^R^u?¥¼âÞ¢ü¢ÔTïõšþvÕ›è™lV¶›åùôÃTñ¢”‡Èã’Ü¥…ÄÏ«±J~îxe¦û¨2Ãýˆ2}(ÒdŸ‰&¹˜ÛùZ•ËÓ•rwºr_éÊDí$¨˃ʸ¡àcóÍí”NQrh{üaeL}’A!QÍSf-狳Äñb¡è]b¦8RL¤xÉ*ÅHÑR¤$I‰—èÞJ !ý‚šc¼æ «,¼1ó&meÆÌ†¾; %FW+„ú& ·'u•ÙÊâK㊫|w™š†çœ»tmWÍÌm_z£6Ö ôôÆ­ÐhÄúñs¼ì÷õã5ïÀÏýu¦Üákl´ÕhSjBxÅ¿8DŠÅÔçÊ+$ ~Ž j´Ù¦È&‘¯ê D~Xd~èÊ™f[†ÌÜä…Ì|2Ì.Û4s³K¦Ù†Yow¶ß×›mšùÐmšt ù† |(s-õõºÝ¦U¤†3oO¤f:J7y½dRê5LzÇzÉ ×;ÖT»¿Wç©ë†Ôu¦zî÷êü!õÞ!õ^RçüÖŠÿÝÁ¹/lØmtÆMN+=MÚÖ.jþ×7Ûí½^n™]MÍ-m´j/8[}Ú§ÏÞ;w÷]Ô» õ\§¯vûëzw«­¾à\u®ÙPܼ}™ÿŽX[nÇZ¶ý.ζΖ±6ûï¢öêÍF,¿ËoÄÚ¬n6c{ó/žY±ü.cÅ£Î[¾|üu×' endstream endobj 392 0 obj 3501 endobj 393 0 obj << /Type /FontDescriptor /Ascent 750 /CapHeight 0 /Descent -250 /Flags 32 /FontBBox [ -17 -143 699 674 ] /FontName /DWQCJB+Times-Roman /ItalicAngle 0 /StemV 0 /MaxWidth 1000 /FontFile2 391 0 R >> endobj 394 0 obj [ 250 722 722 722 722 722 722 722 722 722 722 722 250 722 250 722 500 500 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 333 ] endobj 127 0 obj << /Type /Font /Subtype /TrueType /BaseFont /DWQCJB+Times-Roman /FontDescriptor 393 0 R /Widths 394 0 R /FirstChar 32 /LastChar 246 /Encoding /MacRomanEncoding >> endobj 395 0 obj << /Length 396 0 R /Length1 4800 /Filter /FlateDecode >> stream xÚ­7kxU–çܪîê<ŠtçÙ‰ ÕM“wwèˆÄ¤’t‡<„!‘!¤Œ ‚Y@ˆA!ÈPÄQÇQ*Màë*£ìª#~ÃŽÃÊ2>˜5Šß8ìή€3bºöTu@ÙûcêäÞsÏãž×½Õu‘ÐÈm¾n°Â✥‘ÙÖ³Ú¶¿¤$ŠÖà“–t/íÜøÍ¾aC,;³ôþµK’ò÷\.pùí¾Å—KJ¾ˆˆ¤=Ĉìàí!zbGçê51w±CDwm½¿«ÍÇe²b¢ûˆ×é[Óm*d¿ z€hÛ¾Îöú½­hû»»V­V÷ãDÿèÜîÛ»{ßKÛH ðÆ“ÄCÐòÑ22ÂxÂéN¦ó8¼¾2Ðßj`†H¡aåö@ €ú9+4þ,#9É‚¯«ÿÆiV†´Á‚%Eɰö’­ ð)Lòð9=çà3˜ ÷Á¨†WqôÃ,(„N¼&âð,¼A;ÖBéVÀÏÀN»N¨o¯^…\‡0H{ ‘¬< O«gà9ø ®©‡Ô?ƒ6‘Æyõ?ÀI§õ$唩ds9tc[­>Åäo/œ€O1^-†8ȇ"ðÀRè€Nx'Ùëp>ÂdÊ&\ä§æÃ6Ø{@A Ægø0µC]ó(‚å´o'es.ãßÄwÔduHUÉ·¦A™.?ÏÀ!x^ËÞ!+8çs._ÕÉê Ò¢ªÉP?¡°ž2Ù ÿ ï|F^Ó±ïÅnìÃ~|‡•q1¼`˜¥Ò)ƒ‰ê}ÁlŠE:OQ _†_¼ RåÃÐÁJY»ÊY8™ŸcèQQ¨o¨¿£1À8ª ÁLX k` l¥xwÂqx .ÐYýFQ@3&P Cø ~Í€YXYû-×ÅõsGxà🊠O_ ލKÕ§Ô÷Õ¿Qö ª}:L%˜F>J`Ì…&XLµ^¡ß§á Â0Õî<\„O`‚8žòœŠex®Ã_à<‹ß2ÆÌL"Ÿì và4;ËÎsI\ —ÎåqÍÜnî ÷2¿Ë°Ø°ÒðsàñkaK°-¸8Ø\<¥Ö¨{Ô×ÔÓ¢Ñδª(Û9Ð@'¸Öéµî×îÅsާ¨NÂ)zÃÏÁŸà*ݹï©az¬T bSœåèÁ*¬ÁÙØ@ç3чËqöâãx€àµ±¶Œu²í/±#lˆ8àŠ¹ ÎG p§¹óÜGÜgÜßù$~5ÿ0ÿþ,‘áÿ‡¿n0\†{ óŒVc¡±Çø‚ñ¨°BøµpüTãÃp~ü´ÁZ¶›}½l½gïÒ¯ÕoY%Ä<Š/P¥^¤{›Oð1LGNð(ÕäIi©ì6i|Jò]I‰Ö„ø¸Ø˜h‹9jœfŒžcÙ^GE‹MIkQø4GeeŽF;|ÄðýˆÑ¢ØˆUq»ŽbkÑÕl·kʤ¹äÿhÊ!Mù–&šmEP”“mó:lʇ-€÷Íi¤õv£É¦\Ñ×µúz@_‹´¶ÛiƒÍkíðØl±y•ŠžŽ~o‹‡Ì ËT°ðœlºT‰Ͱå¾ VBš†WIrx¼J¢Ã£Ë¸T¯o±R7§Ñë¹ËnoÊÉV°¼ÍѪ€£L‰ÊÛ®í³‘j}#ùÎÉ^¦ÅÛ";o ÈÐÚ¢­|?iT8_“ÂZ4–,%ÁáQÖ}aý¼¹ò>ù#¡ÂR+|íýTšm•!²E£|OU3×FfÙ¦¦F75…‚ÐceÑîðjœ–å6%ÌQæèè_ÞB5‡úF’œäuø ~Œ×é×7†bK{—GŽ™8ÆEƙ̻…ˆ8Šì Y1gÄÄØ¸3ö5c‘®¿ò u,¸Ú+…n÷Íèò\¸§¸ŠqJ~šC˜6%¿À=9>¯ïlˆi©Š/Ϭ¸»¬dqÝá´ô‚ÞÌq&aj~ú̶FŠåcõ+|“¾Ã&Ç2#"DònÊd‰‘âÛö5?s|Ëiž‹¿i<ÖèÀñeåNgY©Ëª¡2§³\¯=õQ\ª¡â¡KNì‰ÝËÒb bYäh«éÒîï­Â%Gì%1€øcZcØ+[ÄHŽñ¦8ƒIˆ´’ÆÐu,2RLL°žÂ5`Çq!ŒÝMº”cá•Púµ×®|ײ²è|V.„ø8Kl|Bœ} •ÂBµ˜`¦¤ºY+Öwž][mMOš;»" M†°3k3ùäñÆ‚û¸g]“SÌÉ'a¬w„M '¬\Ut Ѥӧ‡o¬½…íÁ]ôViýkØM} !¨7,ÁW‚¯ 'oIn>FÃ;`g¯@3jG¥ñ5£Ÿk}2ôÂYŒ¦¯î¾-2¶ˆÆzo˜ &Q‡ýuè1ûFZÁ¼ºúò견†eí«rê»:}Œõ» ¶C;Üé1Òˆ 9ŠÞWêä娰ß5`T–œËÀƒ (—Šxƒ\¸ôÙ¦Ïf}¼!Gh¬Œø×ÒÙŒ'ö1ŽæÓLë¾TA¡Õ›ÌD¿_`-Ö‹’ÞZ9N:E M-´‚„yþͳ¥7ð%°ˆ;ôùQyœMüÔ&^´‰;lâ#6ñ Üu$¸_ŸQW'^¨ËëÄ’:ñî:ñ$N§¾KDNŽM_Oéâ/ÓÅõébOº˜“N»é_©Ï?—mÕâ·Õâ»ÕâÞjqSµ¸®Z\R-Ú«ÅÖdqb²xW2½½Ç£vF DA-‡ÄÄ»v4Ï)•ð›cn)+»@ àVC6¡Çü ¯J¥q¸2x¤Œú ƒix=xt¼]:^ƒ.]þO~gm[å/~–ÐJñ•cäêÂå~÷q§ùš¥Ò0tÙœ “†süÅ»HœéÏþ@*µà$ÈÅTbO·.v€[WŸ0†þ†4R7 Q jFÑ/·—n8ë¥ë¹ž8×r&BʰWýÒ'NBr‚ôGg³ôïÅÕÒ²ðvÈô¦ó~éD¶¾áWžSšux™ºÔ}r„ô¢s—ô‚s«ô|±.~έÛÛÝ £§2ˆy\ÚJfVåÒ‡Ï/=èÖ> endobj 398 0 obj [ 333 333 722 722 250 722 250 722 722 500 ] endobj 138 0 obj << /Type /Font /Subtype /TrueType /BaseFont /VPRCJB+Times-Roman /FontDescriptor 397 0 R /Widths 398 0 R /FirstChar 40 /LastChar 49 /Encoding /MacRomanEncoding >> endobj 399 0 obj << /Length 400 0 R /Length1 3700 /Filter /FlateDecode >> stream xÚÕ–mt”GÇÿ3³Ï³K a“PB )ÙB€)„ˆ”ʆ"TÆbJ „%dK€’bå%â[ bĈm­H"§])RJ+’ƒ ”`‘ ¨¶X( 1Öšb”°ñÎ?[> Ïñƒçøì™ßÜ{gæÎ÷…‡µ0.¬( a6ö‹¥YÒS W.O[:»Æ¨ù€îWZ\Q’òf¹”×.^R]¶¿êLÀcë„Ê•”¾398plùGËÅ÷šú…è{ER^±|U¿«êˆè§E°¤ra‰š¡¤­sEôøŠ’U!_µQôNÑÓ––T,zëÎñ€;@ôA¡ÊªåÝÉxCô{D¿;´lQ¨¸aÌÑË_œØìxìˆ\l´>p_Ìrë§ñŸ?ƒÿþ“QÁ‘ÔŽS˜€Mz3&¡M(Vmا¶!¬2±YJ'àyìÃ1Iã‰ùf·ÔéB ¢EÏÃIÑÊ¥ï|æH­z­u*V Ií@“Ž×“Ô^ìÒõj žFy†IÍšý¨@¶ÞƒbÏgõ/P¥ŸÅ åGŠõd=«—FçÆ9Ó0¯"‚ݦB_öcŠêïåø .`¬‡¨Õ $ÒêEPçÕÛ:¯«£ªKr¦óW&£LF»Ó„:à€è)˜d<±òéví!ñÛT¦¶9'Õ.žŒ¾Y؉­bß)õ"È2uÈ49®b†ü2LX²‘â ä;-(RõXá>.s%eæ€Ú‡lSçÔ¨cÔ뤷DuÉMÅxO@s‹± Wˆž¨ÏãQÔèkRs?Þtjõn™D§^ר=s‚YN>ÂN-úÉÌ$Ÿ'+2Èé@¾:¤3á7»UãsãœÐ—uœ; ¥N›jWî(7]ís:e[Õ¨&w,&ª.7[vÇ»ñÒ¢Fæñðê kº±£ƒ^×ñ­02ÍÑé/?Y˜v|n sä-jšß›A^¤OuÚÁîî¼BOŠ37â Œ˜t_Ä“>øÂ¿+¼9rf^aÚAå:%ævêü)bœ](¢ÕÄ,ö©S2{ÎBYt‡§ÌyNv¼ÉÁ^¸ÊçhF5·6gÁ¶ùló褄@Bz !PæAW•IéºÝáï|o™›ž¼"Ùôqæz#=˜t[؇-®{Toƒ8oï^Nœ¿5§­+§- £ºr$­·'ƲuµÚ­G—¨íaŽ.P»Â²I[¡JöÄëcìãnñ`‹ûŸd鲓 ¾Â:µ,ÝB†¹¦_fÍä—0ܲû]‰m-É ±½³AΗ¡lä•YÏñÔ°F ×m=dzNæ¯UJÖ±dŽHÉZ¬‘^–¡á5ørÄfKŒÐΈµØÓj[~ž\-÷†­µºGc?±V5-«ÈGÉ•õŠÜžs]…e˜*-«z4¶´#ÿB\ýGXB%W?ÄÕ1¶J,ÅP±Urõ+›µ|ŽmÊÉÅä"r!ù0YL~†œG>$/–=ëQ+bœs)’Ÿ& ÈO‘sÈÙ\©|Êyäƒä,òääLrz÷[éÇè-Sx¢ï§<™Ì%ƒÍ$Ê÷‘Éry/9^ZÙsVG~„Ì&ÇYb3Myy7™IŽÄtáÊ&3Èá&}8’[mwèPÊéäô–WÃÈ{²C =MæÈÈÿ<[ÿNZR)$Sr{öÁ‡È;Ø÷ÖJ&û“·Çè—Ùé‡éÑ‘ÜÚ’ä-š)Z{LŒ•%ò4ZÙH›(iÛöå銧¥Gö&o#{‘>Ò‹±BWnW¾QàÅwÈÈK—JZÏŠñÏ—ÑÏëZñþ¤¤§%E$‘ä…Rl¨UU#þ'Füß}©ÿù5 endstream endobj 400 0 obj 2004 endobj 401 0 obj << /Type /FontDescriptor /Ascent 701 /CapHeight 0 /Descent -299 /Flags 32 /FontBBox [ 41 -202 550 729 ] /FontName /VPRCJB+Symbol /ItalicAngle 0 /StemV 0 /MaxWidth 1042 /FontFile2 399 0 R >> endobj 402 0 obj [ 250 600 600 600 600 600 600 600 600 600 600 549 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 549 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 333 600 333 ] endobj 137 0 obj << /Type /Font /Subtype /TrueType /BaseFont /VPRCJB+Symbol /FontDescriptor 401 0 R /Widths 402 0 R /FirstChar 32 /LastChar 93 /Encoding /MacRomanEncoding >> endobj 403 0 obj << /Length 404 0 R /Length1 5520 /Filter /FlateDecode >> stream xÚÍW}XSWšßss“$!Dð&„&„(*Û€ QëGµ„¢‚ˆ¢ˆ€2(®Zµõ ZÔqZ]§£<ŽíÚe­áÊhÛ©íØuÛÚm­3µ;n}F;ÕNmg\ûiåî{o¨û¸ì{ßœó;ï9ï9ï×¹çž@ ¬¼uMµ- …Ôs†Š¹®½ÍúÊÏþñj_àS¶,jÚð_{ÔÔÅN-ZÚ±ðÚ•åÚSÄg5Ô×.øìxñxÝ$0¦:bö©žˆN'>½¡©mU @)ñ4´K›ëj1ò‰ŸF¼º©vU‹6Ÿ!¾’xë²Ú¦úâíÏÍ!~ñö–æmÒGÐEü Äg´,¯o¼aþ+ñ¤?êmêCý‘=RSX)÷ð BE b掀@:Oå²\«¤Û|Øß•.p£iw¤Ð“Kài PlÎ/‚%è§þS6™ ó°üX zZµþ†ÃB8 _AÓAxIÚ y´^ Ì‚Ó`ƒÅÒ  :¡ÑØtè–>.‘¶Ñ¤­6ÃvAíÃ0q©t(eÐ çñaéœÒ4Qå"+ƃ&ÁZ¹ æÁZñüÎb‡´Y:MjHß(( »^‚cäÁ-Ìî„ÛK#%DÂ1K¤™ÒQémÒ“…´Vž!Ú{à ‡ë0ˆœŽ‡¥Fi¹t¤«6ÀVØ ¿‚ßÃ÷èB7ËeÍrÖÈK‘¼öl²æ²ç\@Æàl\†Øß² wLj‘ö£µrIc/¼oÂÛp®‘¤S°›ð4;ÌÅs»¸}|;ÿŠd—®’}a¬ mƒ#$ÿ1\„Ëð-|G>˜Ñ‚ŽÂ|,À ¬"z 0Žmb/±Ãì:§å~ޥм,ý§ô E%\ãZÑ~˜L>Ë\N´›bõ¼A¹z›"öGøѧð%ª0IÓpÒcÃt‰eDäW%.ÇDŸà5FN1Æú¹·SªM|>ß!¥IùÒX¢'8Š|E©&ÀÃJæª)š ÐHšŸ‚M°…âÚ û)‹ýðYðünÀM¸?"‡4“mtŽl‡]D»‰öS,ÿ‰vò1ÚG')ǧ‰Þ%:ÿAQý„²w…说Ǯ“ß‘:Šq„äŒZ”ŒâÃè#ïfUâBÚ-¸×uã^ÜO‘?ˆ‡hgõ“÷Òûx‰è/x•¼¾‰·Èïæ!š¬øü{’­'ÚÄž§r˜½Eô-7ŒËåfqOpÜî÷2÷.÷9åq¡ªSµOõ;ÕYx/çëø~ ÿKþ†?Ç_S§«k¶kvi®QVfSn áþ'žvX¼ ¬õÓ‰0Tô®Á6øiÉ«•O¹î èyè­ŸƒëÀÀF±_`6åè×|·›öÄstVŒ¥7ö"½[:¡sá<”â)6®B*dñÒu0KŸóm|%·R©˜ifüÐ9wÊçƒ%tŠÓØàkÒGܲl#Œòff8Òíi6«0"5e¸%Ùœ”8,!Þd4ÄÅêc¢uQZšWq !Ûo/­±†2jBª {y¹[æíµÔQ{OGMÈJ]¥÷Ë„¬5Š˜õ~I/I.ü’Þˆ¤÷Ž$¬EPäζúíÖÐ{>»5ŒUÓ+©ý¬Ï´†®+í)J{‡ÒÖSÛf£ V¿¹Ág aÕ*moèô×øh¹/¹­sgS Á ÑòÂ!˜X»¶ÁL KøC»ÏJ¶û”1Îá¯]š6½Òïn³ÝÙ!œXgŸ{I(Î54]žg%Ñ•¤Û½X¶ºbØt…½0¿FnÕVW†¸Ú`ˆÕÈ:Œ®P’ÝJZý©ù.ûSËÿÌ=ƒ!æ(­­ï,¥Ðt•GØ™«}†¸Š™VZ–m V†pS0b„b{Ä‹z»_î©Yb EÙKì Kj(æ0£R´x-~{­/‚i•b²7YaÜÙæuãm”w±»XÆñ6óº~öT¤ÿÓъܩK„3îÄeMö™²Ö)Jìdë8¹ªuãHŒž ’—‹CQk: Ѭï0Ø­_%Ê~ý‹û{j‡zÔÃ× 7åtÞÙ4>ÔV¾% Ž¥ï»|Â{Sxµ@[V¥8Ðñ*ã˜%J­’µQa–sÔ¶hšÙåšz³hÊí¢©†oЦnÁ#E·‹ä2zTžÑf̤â௾õ"ßðÞÓÜ…3è.a“.ó{鑇ÉÞhÂxÞ¢K‹µ›L¦øaÉ–4‹=idrN†3ÓS¨5ÎRª-µ<¦Uå^”Ü‘³5y‹skÎóÃ_Ö¾l9f:oMQe$³(®Ìävg»²³Ý:çð””2SÖÈ,KrùÁdLvšü.ΩՔ÷jPCœ'ÇãÑh£t®ìdË𔬘4ħ9øÜF;ËS»G:¹œh¯ÛSžS–“§3:mYé#½P2²¼Å¸ÞxÎÈËŒyéyùžýÃ)caûÏs{¡å‹ÇT8ÁrÑXh*4·{Ú '\´˜á‘¤"úÝN*2%jxC»kN»¡Hc(ú©1Áe6i EV¤™` †§Ðaë‹Ã“âóâó32s0³Àv·ça, N¥GƒvŽe ¼jÏVGí‰Þd6¤ºñ“ì®!f§Ê‰Wâà›ž÷£¾Ï<›‘îäŽärIö˜Ä¤Áfœ®i–Ëçæ2“%.Ó6¸·èLZ—E•›«q<ôãÖt{œW Íåv¨<7Šió⊾FÔ*üÉ[w2¬ì$„¨ŸäeTà|e…Á®ùæÎÈOS‚ƒ—oxto¤;mD£[…šî,jjˆ24WñâQ‘0 ­£#À´`ñÄI%®Ç7Õ¯p—4/] ÏWi•|ç}À#Wüf‡z‡† ³.±LH³N‚ø0ÛF` ³­Æ0ÛB`³Íqa¶‰ 6Ìž&ЇÙS1a¶‘ :Ì6èÂl=½,OhÃl&ÌÖ¨Ãl fÿ@  ³Õ\˜u°0[E€ˆó+> àû´:Ñ:wqG:n/ö°òÞ@µÍ'Oö³:â%¶€ê¯”úEâ}VOõ묖ê#J‘Ü®ÔÍl!ÕRûQ¶ˆVi-Që-ŽfùxZA§”ºW©5Þ„Vý™Výo[õ/µê×·êÇ·êÇ´ê‹ux–¾±zìSêz¥ÎðFÕ«o«·•E>£Ë¢')uŠR'y‚ú+AýAýþ ¾&¨ŸÔ§õʼnØIWj=>¥Ô•zµR7(õ ¥v*µÑkÌÒœ¥ß—¥ÿe–~~–~\–þÆÑ5P:ol¿þr¿>³_?¢_ß?\ÿ[ÚAq+ÆAÔ¾ƒ4:bø2!Œß‹Õf‚›¸!V§|%V;¾«3„âdü Tk)>ø)TãlÂ?CJæ/b#“ñOبðÀ‰ÂEç š~>EࢳŠàÑ™EðžèL#x7ÿ&:G¼%¬oˆ ‚“b ‡àu1à!8!æ„ÅÀ‚ã8*º—ˆ¢{ƒð*†ÀÍzIýz±:™zŸ«SÖŠÕcÖˆÕã„b7®„ÅÆ¶!V¿—°•Pö­º•ñfèVÆ—a£Â7ÊãK°Q‰ÅbúŸ&Ï[D>ËX':'‘š¹¢3› (FTŠB±gA@Yì1(΄€2išèî%±GE÷²Êý“E÷{BqV€åYp(Òå¢cIÊŠg(î!\d¹Œ#Á«d%œŠRY(ËÙ#yH»l¢³ŒÀ*:G¤F`ŽD>Q ȾÄËÑ} àVæG{HÿÕ‚ð}uºð]Ïá[*7äM w†ÑáMþæ¼"|éÌ®;G _8u§n»p¾û„l œ# ë0áœÓ(|0 ï9®§h¿ý¾zŸpÒ9_x6ÈoX…Þ8á°3_ø—@ŒÐX*¼ûâ…hÎÞÀ.á4ïYçR¡Óéßèµh“¬¤u–»S„w÷šÝB“‡š¢Ðè ㎠K»„GXKæÖu‡z£…'È–ª@¶0+ ó:A£v sÊçÔŠÈÁ¶% µ &›Y'hÙV*›©k_×Á ”‡»ì¾>8謲Þ'vy»”9G§˜¼ó>]Ûîèš|à‹›,뚺óÃ;åᩲ®²®²®©Þ©Š.ÿâ™%+îy~ÖÖi<8 +è]ÿo^Œzµ endstream endobj 404 0 obj 3786 endobj 405 0 obj << /Type /FontDescriptor /Ascent 750 /CapHeight 0 /Descent -250 /Flags 32 /FontBBox [ 16 -15 757 676 ] /FontName /PYACJB+Times-Bold /ItalicAngle 0 /StemV 0 /MaxWidth 1000 /FontFile2 403 0 R >> endobj 406 0 obj [ 722 ] endobj 58 0 obj << /Type /Font /Subtype /TrueType /BaseFont /PYACJB+Times-Bold /FontDescriptor 405 0 R /Widths 406 0 R /FirstChar 119 /LastChar 119 /Encoding /MacRomanEncoding >> endobj 407 0 obj << /Length 408 0 R /Length1 6224 /Filter /FlateDecode >> stream xÚ½8y|SÕšß9÷&÷6Ém–.ICÒ›4mš®i›.Ú&m“B[–R*´`± ŲԖÅ>ÊRYä‚ OQÁíùÄ'iA~© 2ÊŒþÄ÷`ôéCñ‰Ë<­ïÍ8ŠMæ»·e†?æùÍ=¹ç;ßrηœïœ{N€€Ö¾ö®ÖX W‘rß“í½+lz½Zr?k^Ðsg׆ïP<@Oß¹¤oAÙºïðKðÕtv´ÎÿÊëèVbÿÂN$h:ÙâAÄ“;»V¬´}ƈˆŸC^êßÓ½|d‘…ˆßŽøøže=ýo97 þ €ò8ÒHþH)aPÆ(¿<}•öEÿ?8òruO…f¬ª¨+¾&æ!ˆˆ|Žï0¾ W yáW"ÿÊ$¢üQé¥ao 8Ákáaôj-|`|NÊ? gáS˜sà4ÔÀ!2 ¶Á4(†.R ÉäPxNb>èFÙ*xìØëåÈkH+„CÂlˆ+”B#Žr?ü6rÀ×p%r0ò7ðÀ&”8ù+¸1ƒîÇÈš!Ç\=$‹®ˆÜe¨ïax>!ñ‘2ˆƒ|(?Ü ÐwÁ½È{ÎÃÄ‚ÞdAê©‚Ù°öÀC„!"YMc£"‘E0 -X„ýv£7gá+øw¢'¯’7"–ÈÑHu;`Š8h9]O/3zÆÇÎPôFÖEGNFÞÃQ@4Æ¿ËX+a lE{wÃ1x >ĹúŒŽèˆm8J.o(P=MÃÑÞfº™mÌaØýìE™â¾ð³áK‘;#{#ïDþ½§˜[)8óEXÆ£/Ì€™Ðó1Ö‹åüø-†Â؇àŒ@˜$¢ŸE¤‚Ì!«ÈSä49C~ ”ꨈ:Óè}ô ,§èzž13VÆÅä2ó˜}ÌÌsìÅ|ÅRŃŠå7Ü–p{x~¸7¼&|"Ry(òBäZcGk¤9 Õèí \‰³`¬’c½MÊ%´ç¼„åZuNà®s>ƒË˜s?c¢ä8˜09¤˜”2´³’øI5©%ÓIÎÏlÒHZÉ"²–ô“{É~,‘ƒèÇQ,Cä8y‡œ%`¹D¾ÅòUPŽš¨ƒ:©Öb™¥•¶ÓNºvÑXž¥‡éQb€)cª˜V,Aæsžù€ù”ù‘5³+ØÕì?±gØØKì°W:EŽâ6Å,¥IY¬ìU>­<Â-æþÀ}„{ÏyxŽß´ÂÛ¡î£?A?„ëìM܈ަ“q&Ö’#äiŒÔ3˜·ùXþ‚Ň%‹ ËFŒ!øR)ÉŽ$»ML´ZÆ™LÆø¸Øƒ^§4jUÏ),C dU-¶ ³%È:“'gI¸£ ­¿"´mHªºY&hk‘Ål7KúPrÁ“ôJúnH­J²2m‡-ø®ßa ‘93±½Ãïh²‡åöT¹½Kn ض۱ƒ-`êôÛ‚¤ÅVõvn ´øq¸!Ÿ´%febb`$ÔÒÀA¨l]ÛiB I‚f‡?Lpøe“h¬›Ñð³Û›²2ƒ¤²ÝÑGEP›1Ö]êgCÑúFÔ•¹P²¶kæ;æoù ­EjµÞÞdZ›‚´EÒ¡Ïþ qÕ¦_Ðë­Àý¿biJUkǶ* ÍöÉ£h‹„µÞXíLK755ɦ¦Q#dÛG½èp$JË"[0ÊQáèܶ¨cõƒfŸ9àhõ7¡®q0Á— #Y™C¦þ‰v ÊPVyV¹'ÚMý£ð«{Fé<¥–åN_DX[#.DÒä¨F3ƒ¶vY‰m/Uãa[ûx牠— ƒQ•-Ût°WP‘¢sض]œ(Çð·7SZÇ(ÊÝšÒtÞÈäµq²ãWì!üŽ1¸?T¥¤Z¡ ‘Y> °\5*[Í0Ô¥äª $ðQߨ«êMÓ.—L)™¦»Z2U7RÞ’‘Ýe¬rs_»¢7tí'EíO/…˜N‘OóÂ{h·¢ŸE#°ŒÀkbXV#0z!&Æh4³/ò“õ †˜Q±ß3ªhêÈåiÿ—àõŠ‹‰ÞPŒÞÒ½•›cˆ),2*9¥^g49g*ÕÏ;»þŘƒ¾ìÍ«w3ów°Í¾¾ïOáƒáŸþp}â ÄJƒlO!Ú3 퉅Ÿ-Š­ŽSâQk9­R§WÆÄ£M±“Õ/jââe›¦ÎµéòÈÍ6‹A'›Í@94‰K-,*ÔëRijQ¼Ñ §“¦ÕN¿wöĘG&õO˜qÎüø–÷I{øjo×d«ýîU’v"#d½q0ü]ø´íƒð_ÈUÜ}cÐ6ç›,a(ÏPF)P†×íãÔqhÙJ¢Ìˆ9-$ÄÆ¶¯³ldÍð2Ó˜qS‡‹=žëÖåæfí*#ùN—ä,È/ôäÅÇ‘«»bZª ªÊôª Þùu/:]…ýéÑb'¨-š]=˰˜/ÆxUúrTop3¬ä…Iöâæ%9f~ѯM.,Ê»npzs…:¶4ÚžpßIŽ)™¶X¢Šg2ïW$¤+•öäMìµ³=œEŠugd˜¾Å ài*0>{ Äxš& š…BŸºO³E£Jãs,¹ïûˆ?P!òÀlg…ˆÝ§MJ7YÞ÷³ØÍ¢™˜%¢q/Ãn@Å'9‚ŠUˆž<§ð¤«ó´fòwsÄLÍU|y䤒Ôü¤ùÞ§ƒÔíí)-£­‚|’ïqŸiî=gj¾4¬;‡«v¸÷tóR“´r¥…kûö€®Ôü­É|ù‹f‚­al Ë$³éòDg.ÆÆ°¼¢-®4›?#œ2O$6}R"p.E"Øub"i ãÚ•VoŒ'ÞK7f)±G7fi){bN9Òq±"Ë)î²ÈnL­º¯vvž·gõŠ}ëxƒNiâÄØ¤²»«ê¶Ý{~`gÉÃуÂLRÈÄe¥=3+Ò§¥ø*6ÏíÙåR©ÃÿÖZ8Ö„Û'OZñHï>—^à ]¿•+òrÊïЖ\!dôR|jèZß hïÁÓÂù®|ýO¤ktX¾ˆ…Ÿ¿Àÿ÷{µâ °Si™=óð-ÄöF¼ìÎìâ.Z,¿)ŒïF€÷ÜBè‡3Ä@zðæs/ýŽ™À*åQÕp*[‰g :,©Ü×dF¹ cº•Ø‚†©s&ª3vu,Ϫïîj½ è¨A‘è¸åÿj¾jÐàm4vìž4fù´Qï5mñžM#O4_¹@®¡ª¹¶ÉµN®\ó©%Ò.ŽìR’”O§,’ÿN¬OQéß ®¯ ¶^¥<ê:Œ­ÃØ¢ð•^©µÍ\G%ÈÃNlïÄözª@È£çÝHéFJ7Rº‘ˆա†;ä§#&i.c9ˆyË‘17js#æ–1‘òƒ„÷½L¾ SIýKZñµ¥Ñâ ¼ÌM…6IîàæéâIò,Ø@ ;åz£/Ú&|b>² ;mÂ:›p’l‡:d,‘kâ‹®>¬*ëo0¡N8N&âÎ*à*u ¯¸„KøKXãz]B– {@ ²'×úl5Â5›5ÂÃ5¦aU° F°×m!Ù"Œ³à£ÿ˜v·v—¢°yt—°{Ò®Éu‹å¸¢_òˆ™…bˆllÈDpÏ`Ã!±<Žl€4– Gë!Jp øeØGrd¸’äÈüß ºÓ°ÛòÁ²Ç,,»„áX Ù2sÑ çRÇ6ÌË£ˆglÌ<ðóÌ,ÛƒìôÁÌwÅr=I…l’‚ädðÈlxdñ¤1¨lp¢¸â(I 2(†·à±á˜xÍ]/^ͱH¹’â|–¢‡Å n>£ø±{žøç²ñ4ŽðzÃ%ñU÷ñåL¹Ãïý'¤Ñá9¼¡?âS‹Ï¸÷ˆO»·ŠO–Éìy¼} 2Ø›†ÄcâVfy6úÅeIƒZ\Œ#.ʬÛ‘üˆO+fg‰3ÝÇÅîeâôQMÕ~Lv¿,»ó½O(·Šån«XZö®8Ñž ŠÅR÷A1Ty^¶ì^nÙ1Ýc‰é ¹bª$¾,ñ¶;¹;¸Û¸"®€Ëáœ\ —ÈY¹XÞÀëøh^ëxžWò,yËdž"}ÒrUê$ d¥š•Û:*Õtt_¢„§˜Z!Ù$;â{½&¯¡L_\å¿EÕ2VgÜê±÷ÕÎl >om æIˆµ©6X ]"‡ÈWä‹€ˆ|)&Äíä«@½L·û›šLµÁ)u!òe`a ñŽ.1¿DÞEQ 68KÒä‚ à8´Ò¤q0e e±­£bnÅüÄ.[sÓK²Ø»’ØÀ–´€ -MQdÃYd‹"[Á€Zžƒ]ýn·,¥ ’ÙîUPÈ*äñ H™GÈó À€'Of»ag޲ëGÙõ2{î/ììQöQödgü=ÿ;¹#sݰ_ºÕ·8ø¶·÷vš‚ëÛl¶ Ž]÷-mílí>êèð78ü¶¹ûoÁÞ/±ç:ü°?ÐÐ8°ß×áœë›+ÿpdóŽ¥›tm½¡kéŽ[ ¶Cl©¤ksàì€ÄÞ,é Hº’®Í¾Í².É·À™Ëoñ¬¸ûîy˗σÿônçd endstream endobj 408 0 obj 4509 endobj 409 0 obj << /Type /FontDescriptor /Ascent 750 /CapHeight 0 /Descent -250 /Flags 32 /FontBBox [ 16 -179 699 686 ] /FontName /TMZGEI+Times-Roman /ItalicAngle 0 /StemV 0 /MaxWidth 1000 /FontFile2 407 0 R >> endobj 410 0 obj [ 250 722 722 722 722 722 722 722 333 333 722 722 250 722 722 722 722 500 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 444 333 722 722 278 722 722 278 722 722 722 722 722 722 389 ] endobj 84 0 obj << /Type /Font /Subtype /TrueType /BaseFont /TMZGEI+Times-Roman /FontDescriptor 409 0 R /Widths 410 0 R /FirstChar 32 /LastChar 115 /Encoding /MacRomanEncoding >> endobj 411 0 obj << /Length 412 0 R /Length1 3600 /Filter /FlateDecode >> stream xÚÕ–xÕUÇßçœï÷{/5Æe ÓÆd,¶ØXDÈ "@œ°hLš Æ…§»2@k nS‘¢E‹”Œ¶å£7$œ(Ä*PFšã-ŠH©5&­w}Î{Wþ°úÇ?zž¾÷9¯ïçÇ9ŸóùžŸ @6 ¸¸¬$ŒÙØ/–V)/^³*eÅÜJP =0^ZV’f•øk—._ ßqè-À±unZ¶¤¤ôÉÁ¡€;HüŸ[&†¸WÔ)Ñ Dº¬lÕÚ@• ‰¾VôËË—àa\½ÆfQV²6ìS[D¯=eEIÙ’³·< ºÍ¢—W¬Švâ=Ñß=#¼rI¸¸qtàIÿþ8±)Øï±_äa‹Ûc–óh|üÇH‘¬Ð“­z&aZP¬Ú±Oí@µÊÄ6ñŽÇ3؇cRÆ" Í^©Ó64£M/À ÑBÈÖ7Ë{6 ¤V½Ö:«Ñ¢v¢EÇëIêiìÖõjž@;Ã¥f' Í~”!G7 Øùª®òzV«*P¬'ëÙ}4êœ+ëNü„öš2}ÑWŒ<Õ%Ñ—áw8‡1z,¡V/’L«6u@Voë9xUUÝê¤;?™O$¢ÃmÁ„{q@ô$L2NÌ?ÝÎÒ%[Bj‡{Bí–ïÏ—¯ï@6va»ØwI½²M2dŽK˜!¿tS'–·Rä£xsÜ6©z¬ö”±Ÿ9 ö!ÇÔ¹•êu»rÔ/ãœT=Ü+ÆV\r#z¢>ûP©¯HÍý8ëÖê½2 n½®T‹zdzÝ9¨vk1PF&UÞ dF»˜£êLÌ^ÕôáØ¸/ë‹:Λ†R·]u¨.o”—¦ö¹]²d*U‹7U·—£{ã¼xiQ)ãxx}Õ†lFVÐç¹ŽÑ )ˆNûbi$xWaÊñù©™QS¾”ò#}×¥4÷ôä:Iîüˆ;(bÒü'mȹÿæ<—™13¿0¥Yù¦æÅÂN]˜'ƹ…"ZMÌbŸš—Ù»ÎCÑNÈ}JV­‰Á><åwµƒQ­gZ³8Õzª5k@ÿÔþi©ýSCº+LR÷…èN_|×å•^zoŒB•èÄëc öõjÔèj¿Wù§&´Ž–@ÝígÚ³Têþœøîæ€-*±º²ÚîÞ‚h©ž'sìíÁÓèªF4¸M#]ð†ùíçm˜óíŽ,uƒd#EÏ‹îR¡kQ·­èS‹|åƒFO7: ^“_pÓ lœ í×ã 0c¤¨Pt—Ö×¢ÑÃÞ‹E]ÛyrHi8ÔgÏ=ý&| ”Ÿ[ûÈ W×]KO2rm¢z×O{bÕ_«—3i^´éêÿ¦;ƒ\ç$BöxqJQ¨›P`‹¨·Ê/OÖK [¸¸_Î$[‚ò5ð½+ç…Še–‹ë¡/0kÊ]SfL9w]Ù¢òå×Ï®èÓ²kþÓãòŒ²çc0·GoT.¢0Ê! jÊŠ„%zÈ(yì&¯’ÿ$»È¿“WÈÈNòoäeò¯äûä{dù²ü3³üåKx¥’÷%jV6¸Hùòyž|›ü#yŽF’ aZzkÈjÎéì³|#,{ޗܶҲ…¬Š­*Ù]†²‘`3¿§’5*9o›ù=›düΈg=›pD<±Azué1B;ÂðuL›õ¡k±»Õ¶|€\/g†­µ¾Wc?÷³Ö:ZÖ’÷‘køÕ«s{÷uVbª´¬èÕØÒZŒÜéaÎþ½ô„QÎÙsöÃÌ­+0Llåœýræf-_c›eäRr ¹˜¼‡,&¿B. ï–ÿ2v¯ßM­ˆyΧ\H~™œG~‰, çr¦æPÎ'ï$g“w³È™äôž?H¦_`üi´äqGO¡<™Ì%ƒüšI”o''’Èñämä8imdÍYy,ùY2‡Mf‹Í ‹ò(ò3d&™é‘”?M¦“#0\úpåmµá\¡Ã(§‘CÑO8Dn #÷ÈNa*í)2FFþƒÙú·Ð’Ly™”Û»>EÞ̾ob­DòFò†2:Ñ_ztåmmäš)Úö˜ó%p7ZÙH›(iÛöã¥/G~’üÙ‡ô“>ŒzrºðŽï(ÞCFn¹dÒFVÌ¡|ýB±n”èIyBJDÊ)>(5«ªVUŒüŸ<ù÷$ÿ õ®î: endstream endobj 412 0 obj 1919 endobj 413 0 obj << /Type /FontDescriptor /Ascent 701 /CapHeight 0 /Descent -299 /Flags 32 /FontBBox [ 41 -202 550 729 ] /FontName /LCQCJB+Symbol /ItalicAngle 0 /StemV 0 /MaxWidth 1042 /FontFile2 411 0 R >> endobj 414 0 obj [ 250 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 549 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 333 600 333 ] endobj 114 0 obj << /Type /Font /Subtype /TrueType /BaseFont /LCQCJB+Symbol /FontDescriptor 413 0 R /Widths 414 0 R /FirstChar 32 /LastChar 93 /Encoding /MacRomanEncoding >> endobj 415 0 obj << /Length 416 0 R /Length1 8868 /Filter /FlateDecode >> stream xÚµ9{|TÕ™ß9÷Þ¹óÌ<2™W&¹óÈÌd2ÉÌd&¯I&ÉM2áMx $@0€LÁ*ÖJµ¢¢UèZ룕! •µlÕšþ[i»®¶¶EíV³înn ™ÙïÞ‰vÝßoÿؽgî9ßùÎwÏù^ç;ß ´°WmØGH1ãxÿxÕÈV×£­­zòmÖ±fÓõvýéàI.@Ï^ö5k¡Ê­&çÐàÀê­Ï8öãóuCˆÐ±¯`ÿuì— mØzsK=ëÅþ'Øïºaãªßv7‚Å5Xù7 ܼI™¦ƒýë°ïºq`Ãà¼o@Úâ[¥ç7mܲ•ì !ìÂ~ç¦Íƒ›v¼áß…ý?(N!Ž€$$‘^”æ€%S˜/.в~v±rÍ!õÿçÅ V‚ Ô2¤‘ùÐɽЃ[#²³(× %xÛ˜‡  ÷{¼'ðþc¶Çq,ûRîL)Ò—nšmM‚œp<ŒÒÝ¿†Z°B9üž´`ÿ8œƒßÀLX ga˜ Ø@š¡Œü ê ÃËøÄ6؈´ð-pãS/æ^E\<cpù.fÔçRø<’; ‡àp)w8÷GˆÃ]Hq>÷;ˆ '}5ìι6‘*º5w7´àz£E~M,¹(‚HB ®‡!Ø7Â8öœ‡_'JSQ\§Ã=ð<ø1È-ä;¬*7”[‹ƒuøÜý(Í9øþÉ+䵜3w<—õ½Ðíòøcð8 ß•$×°\€ ²€,f¼LMN—‹å® ½µ&B7\‡Ol€[Q’‡áïáM,¿ÁUËIYH6‘dy¶3…,ÏÍÎÝ!ÛÑ\6Ãä rºD> ?Äò#ø9j^E¼´î¤##²ó¸‘Üí¹#¹—sÿ€áÐÞ \µ­²n†=°ù½NÀ«ð+´Õ¿Â$á‰X‘‡ãä=ò1j¤Aœí'ÌFfs„ö1ö=®…»;ûTöBîú܃¹7sÿÒSô6Z¾K®Ñ ó`ôÂjÔõzÙ?#pN¢îÎÃ;ðLB–”¢œõ¤,%ÛÉß³dœü™Rj ®¤wÓ'°œ¡ãô<ã`J˜r¦šYÎ`ž`žfàVsÃÜ·¹£Šù=ÙUÙÕÙ‘ì­ÙÓ¹îÜC¹äÎ 7näF²iLGiçAZp l—u½Oò%äç¼€åru Ncô9¿…‹èsWQ*Y6ÔD”$H’´ Ÿ$E¦“n2‡ô }“%d€¬#·‘äNò–ïÃ(Çq,'É)ò&9G~‰åùËŸ)Gyj£^ê§"íÆ²Ë]E‡èZºÞ‹å)z„§c 0-L'3€%ÜaÎ3¿d~Ãü…u°[Ù[Ø¿cÇÙwØ ì¿³—9år‹6EB1¢xRqŒ_ÏÿFQÇÏék¢Á*ØFпÂ: ÷FFúÚ…–¸#O¢¦¾‡~[ƒå],"–j,j,w A ø}e^Û%”–8‹v›ÕRd.4 úV£V)yÇ2”@eÚÛÙïÊøû3¬ßÛÕU%õ½ˆø¢?ãBTçµ4W¿L準RDÊ5ÿ…RÌSŠŸSƒ+ ɪJWÚëÊü4åu‘¥ó– |oÊÛëÊLÈð,Þ/Ã:„Ýn|À•¶ ¥\ÒïJg:G†ö¥ûS8ÝI¦®ªDÇ@Mh¤‰3Ð1pÛ ‰"qxSéŒÝ›’Ç_z`ufî¼%éT±ÛÝ[U™!«¼+3àmÏèCSKϹtþ\»ªr­Ä?Ü£]í]}Ϙ+û%hàº%f 7Cû¥5Œ¡ŒÕ›ÊX·`û¢û”þÆ—3Ô×90¸¯UsOW¾Û/õ¾½î.œ–ÞÕ»$CîêÍ3!óž—bЛ–0ýë\•·Ý;´o]?êæ/uˆŽ´w Õ›¹KFí¢]îTUž´íhr£RNVµUµIm“Û¶#ß~ôõ<þgg42ÝÙ÷±ížÿ¹^ˆ´’w:²™q­’ñ"¯ R5ØûV5 ^½¥\›Quôï34âSÎgðºö]4”wâ“k1S…Ïp $P2ççãS0Æ(<ô¹‡ðc0>t§d:§#‹D'°ütÔ;a¨C¥à§°+U»;çÛB¡Ù“³&“³ —“³ “IhMN& ±ªŽÆnco772vå¯\÷__cþéªOΖg ¹!˜òt„)v’­¨Y—&®’K¡êd¸,EF³ÅZä®m!µÆ¿×£àk}qº’Ìß49¾m†­Ü± ŒlÔr½œêÊÌY¬³TQ·”y<+18OI¼7#ïor«¡ÆÄ™>¹n$k ™Õô€þ²þ²™åô s‘ÞgfCJ3ú4±ÙÕ¢Q3 8›Ýh·iÔ„S˜ë ¸"ó“ÜÅZfñ´ýUb:…V;Z⌌_0\¾8­Žæq›ý¹uB²mÞé$H22Ï_íØ&:YƒÒÇëÔµ Rk5œž©%*­¢–°¬ "!CÒ …vÔ@ßp½’ÔJ¢KÞÑBdSQ⎡3îfr#QÚ¸wa$Š}º÷™·~—ÝMÞìŸ]íØxõ·Vr+YýÌ·]]¿Yõá±óŸÌžËÞîÕfÿYòcºsÿÆìeŽ£¯ˆÐF´âš?ú¯ø)èTP­÷ ú`âõ3š§u§U?Q½y3ú®êÝè;ÕŸ¨&¢úÅÊÊê «S0 ×ë‰~z,\—¨®Ô«AaVšã>>ÜR§Q¶4kÚø¶DÀ ‰´UˆÕÛ‚‘Š#´bŒ‚¨î°ŠSžv6%ŽQr´£=2~qââ$ª±/ù!ªm2y!‚»dB*’5é³MŒ§6³¬È¦–Vo¹ÖJxêÓù~“Ÿ°~à[ØR(*³–‚ÅZè7”’@9£?!P çZ•¥` ˜K%=ËZ&xKÊ–¯]xAªà^,2[-ñX]mY}¯¶& [ ÈŒÚç^O~×X%ÿ”©ê‹2:oj íÞÒ½?ˆ¶oË·®#…fÏúx8¬ö•TEøýWÓ>¥.h-õ¹| ©fffݲù‹vÛh…?Ü;¼,䜑X?¼~ášòGqD›P6XtMeìHß™ÝØh ×ìþ%Íí®ºm}t"ÿ&T—mg^eŽàûFfh‹áœ80½½«ãžö½Ïs\9W¯êpt$:Ö174qüÉ3ñîvmØZž¾äK ¯ôŽ,Wfÿ$néé°è(Áì­€këhà`ÿM?K3ó*„ƚͯ¨V .½º$òèã§ïš^–N5iMF¡Ü×»Ú\ýÚŠé«îÚþ*íÆ˜eÂÍù¾CFá„hI[È_¬DeuX©CiˆQêmu cäŠØäaZÁu•9Z¥.o¨Õqy5ï°sÕNÍþ 7 zFFˆ²†"=ZŠøhD(U—y#všíDÌEXF²N¬÷_RÚ~IùXNb“Ž¨Ï¢LeŒM} o=ƒÏo±ù-e¥ÄjóY¥DÞH¸{pï ×)Z·Vb5¢Æ§v˵Ñ| aš/iÐé*wÙûikõ’5ßmrUÏÌÎYk[:ûþš…ÙiNMÓÌ™†Z†–é|ÊR~ò`—'¹§ë¦ìÐ:Qítjo$ܼɘ-ÜÔ uæÿ%(Ǫõ¨Á÷©>ÑïÕê[µNŸ«ÌërÙ\†¹V§í~§K0èY§Où 'ï+SäèäÒ<È×{ýI’DÊQÐoå3 OM9¤Ë*1\ÂàÅg'(ú# ÈK/¹Zü3±ŸNV†š›C•ÉëTú¨¦(:’v*iý@ÖÁÕµ4Ë£WŒêÚ›È{mö [ $J´¼r2¶¹QéÌç>Y¦[ñ­s"`:Àiu•Y\&í;l£Æ©Ýo2² k- V‹Ú޲7š" +Ia“¥¸ö˜b¿þË,×ÕÇ>c¸¢¯]cn.pÛï~™g’˳N§*±€y«Ý^¡P¸Ë’Zó•y‹ã¼òù ó{æyˆã{Ïߊ½vÇ,=PðT:­à6Ä„xÄÝêæ|­N·Ë#1w•9.—7Ü茹¼ZWž{}¸Êç,d>nÒ[¬=¹]ê¾Æï‹Ô°ÅNéoëLp„aXÉsëj%Ï5È®+Ò©!¹ïÅ cÂø™•$ÇåúؼãÊmŽr›¿”Ø{ð Çí¾V ­$f)!ÿƒãâYœÇß´„¶°IUX|d9Ï\W3»'ÕpCc*»pz£¸¨©ÙS'¦³Ýä]§ªö:ܳ?¥^mLP«XäªÌüQ¶ªK$N§ºy ynÑp¹µvò\W5u¢&)¨äx~´¨Õ³boªÎ}ÀþˆïYß÷—Jµ Ìð1O•‘tñ( :gü²p‡3ök¯Íe”¼ß).lãU‚Q«æhi±²ÅËótUPp)ŒáTT×–¢Rg Ä ©µ¶ÕÚ'G„ Éc&ð,–jü"qýF¾u áª1âõž ›Óþ–Xìt;qHcØ-’ÆBn“ÔJß«S³œ™x.^¡‰éäSGÎAʶD$Pã# ؤ?¤?£gôPCjâ‘ñ¾‘·m}& o÷™#gû†mòI™œ0~–V‚¡Ùñ‰Íqñƒ>‚ÐB2Êa»ø18š'˜È§›åA—_KxEPYJ\FO)ðå\)¸ Bi>ÝœÊ{ ãë”…"$L>?Wëã…^¿¼-ŠÌ™Šs’ݼdÛè¼»{q¬uÓ-[m«½]i2(l¼`ö´ÜÔ9wßçÞ—|¸@kâÄGš67oZÐ^1Û'¶ï^¶i¹Z“ýçºÕ‹¯ëš¶õàÈr£–9‰1ÎŽvibƒ‹*#)öP3M”z¢Æ­žÆ·è5¢Ú­)KÝà¡s±M4VšñX×ñºãÝæ³6ÃäÙq ¿À Z'GÞvØ^w´ŽO&åÄ‘`†Wäe¦ò6+_@$w«5ze‘1ȾHUãTgë,«õ8,5[ëF*¬8NeK7ë8æ`×ä™™´Çg)íl\›¤Ë§Ö˜Ófu—%ß2å&˜ó̳‚JxZœÝÍw Kù¥Â~ƒ°”TP :¡€–(ÕΗ×ßè ¹¼f<• æýv§Ý_bP«¸P(ì®Å­©äuD_Yé3è _‰øüÒ^ Wɇw# ”@a,”3g ƒRîtÍ65yÊ(ËøY)oõ¢ÈáOÚ¡˜_‘|2‹»7f Ö;°¾¨€`°óø›‰œÙJŠ’°Zi.ô­JµùüÉ¥¤£zN}M³c GS W,ž5Ûcé"Ÿ2OîLgVÙ+iÙ¬(çžSqƩכU•âð¼@²¥y?åçy§V:Û*rŸpßdC#QŠ»ý¼?š(J'Ü…ŠW(õJ³*jó=_3ßmVá+2`ëi=SÏ*bµŽh4aªŠ;‹µs²¬T&Lf R,0ÅŠk‘¢ªjÉãq{ª¢µ±b$0»E:›ÑWÞœÑÙ0(›&iVÒ"CÔ@@Ž…“¢nZ‘`ލ¼Ñ%Œ+A~§§Šºýnļ0Íå'þ¦È‡G®Ú¤èøžAÊg‡óðÈÕ¾<ô )”b²kMJ=|!ÄÓ—7œ=2œåVžå•ˆPJº©ôòG ¦¨Öb)XJ&‰Kæ@$îG&ßàFEKItV‰°¾FÎŽkÝÌX²Q§91ªu†+³vWIö «Phéﲡ<§¥ÙóÕ®Ù®Ú|›ÓÙ“Ã̼#PTUšõ‘Qç2«Ï¡()áüÓ®~¬R*X™ü9ÇcûÛm!^X{°d¸­/{Ü¡5oUyY!Ÿ£È×ÇWçÜ»BŸ¼DˆRîŸ9yeÛç-žlÜCœôMHõù×l•ÿ˜Ï>›ýê¿}÷1q¯›J¡ûYXŽwÂw³¿Ç»™¹º±­ÃÛDPŽ·a7Þ*¦†°ogósTHß¶°ì€q¸LzÈïèO˜çÙùìiNÉ*Vòa~¿²BU0%‹ V c7»Ú€%ÀÿœD‘)LS|*¤¼½ká¼¶E‹B=k7 n©š¿qÃÀ@óÌçað+¿-™äwq žòF0C¤`†üUaŽü¿¿ô'}±Q¯ú‡¢ï!­ç‚ä‰"¶éÈ\:*×.¹6È5`ž¡‘Pûy²_Aþµmeý)e°>C¥/lÌ3½B•¸ö„Ž Dá *Ýt;²};•Z%܇ð}虜JÔÄFÄlDÌFÄlD +°7WX!Ï8{Òªsä^{­Ø‹Ê½®Á^Dî T9ŠÛýEò™Eæ¿ ^.N“n2 V‚@ªGwÏ^&O tä>¹¾C,pé~íÒ½ãÒÝçÒÝîÒ½Lî¹8pƒ\±`®îWsusu­susu§H¾ èð„7—ë^*וë¾_®»µ\7R®«*ǧ¢ÂuäûrýmÑ5C÷çº×gèž¡»k†nû Ýš:÷ ÝJ§®Ì©+vêÆÈŽúûõûõ Bðø~ÝýûwéXuDhÃÓü…¸ª¬Ã´½£=•Ø|}´ç9¡­ˆì‚ KP¢¤R{+¤äv‰ÊíÍ$*m4ÄǶŒ¶<ŽÍðhËTÇz˃ëFãÛ0Ú³\hS‘øÔœ1H)¥¶j´å®­ü©Ðf$¢Ë .{!.“{¦ZÅhɹãÈh.8FȨÝ3FÉ áJd¾p9<Æ"æRxL‰Íoƒcô¹Qá½6¢Uø§Èrá[fgq†õ\^‰Ü ¼X)?ðLê´4;> endobj 418 0 obj [ 250 722 722 722 722 722 722 722 333 333 722 722 722 722 250 722 722 500 500 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 444 722 722 722 722 722 500 500 278 722 722 278 722 500 722 500 722 722 389 278 500 722 722 ] endobj 25 0 obj << /Type /Font /Subtype /TrueType /BaseFont /HUQAVV+Times-Roman /FontDescriptor 417 0 R /Widths 418 0 R /FirstChar 32 /LastChar 119 /Encoding /MacRomanEncoding >> endobj 419 0 obj << /Length 420 0 R /Length1 3376 /Filter /FlateDecode >> stream xÚÕ–}x•eÇ¿÷}?Ïs:Æä²18æ X0&or†c!Ð\Ãè€4Œ±«;2@&ƒãD š©ÙBòÒÓ\‰&»°@iÀ%½Ì ‘ZË i—Ì­ßý=GÿèåŸþðº<Ïužßïû»ß_žû@H@ ‚++JÂÈÄzQ:%­Ü¸>°vQÄTÐÃË«+JRÂI€¹Aâõ«×T—óú.ñ_ÿ¾òU%¥oæ3g¡øŸ-!á%uRü{ÄS^±~ÓÕÙhŸmuMåÊ\‡2ñ[Å÷W”l û¯R÷ŠHüÀÚ’ŠU]#·‰ét F…+«Ö÷·âiñûÄ^·*\üÄd©Ë#ÅDS°ã±#òoëÀȸòÿü´¤œÀ l×;0‹ÑbÕµu* ;$:O¡G%ME–›fÉÓ‡S8€SzŽ‹W†l}­¼ p«äjÒZ§a:T:t¢ž­žÄ^ݤ¶à,Å('Sr^BÈ´¢9zНêZP¥Ã•„*ë9º`F£sSÝ|,Ã!DÑl*ô_1òT¯Ô^Ž×pSôT¬@½^!=mW§T›:£ÞÐExYQ}ê„;Ì?RÐãv M§â´‰ŸŠÙƉÇçÙ¹Ç8é¿Mej·{\í•ñÊè{=x@ô=’/ŠlÓˆ,#=ÇEÌ—gœi%Lj}»PäžÂRÕ„ ÞÝ2W3mª9¦Ñ¨£ô¥µduÞKÃ4']gzÅØŽ‹nTÏÒgp'"ú²älÅY·^7Ë|$»M:¢VÄænêÜz —™I—÷2Y‘Qî%©ƒ: I¦Yíÿ`nÜõàå£ÔíV=ª×›èe¨·W–<¢:¼)˜¥ú¼ÕîMó¥DDæ±}sí–lä Ïs£&’¢:ãæÒhð‹¡À±%éYþÍ $ùQFW †œTwIÔ5þ¨“1úÜÿ žËš° 08 |sóâÕÎ]ž'⢘ÖYô¹yY±}ZÖßà”¹Ë)ö!%8ȧü®v0±³«3I§;OwN64}hFúÐô2}U&µï|ƒ/±÷uÞ¸X!•â$ê(ëìít°S×ù¸ÊŸtzfçd©¨¯»«{’JŸÂÇIì›oÚlR)u‘:ð¤Iz­ðù÷n2ó]¥üƃøœ°ÊwÉﰆ݌~›|€mÞÏè.ÙÉßbžzFw’u\Óo2Ïò>Œµx[ú¶Ê½dm|ïÔâFñ¬mä »ã‰0G„ë¶ãÙ*ó×%‘­ŒlÅa‰Ô`‹´ê2b„v†·à˜)š¡«ØÓjK~Ü,ß ›ksÌc;w1W5•MääFŽzCnì\WaæJɪ˜Ç’V1rg†¹úw0F%W?ÌÕ³o•X‹ëE«äêW²oV1øË”“«ÉUäJòv²˜ü ¹Œ¼Mþ+س~½¥ìçÚ!òËäbòKä­ä"®TíBò²€ü¹\@Îø£ôôó¬?ŸJOôM´ç¹d£™MûFr9“œAN'§Ii#{ÎÚSÉÈr2™-šÁ$ÚÉÏYäÌާýir9Vþ½N—YK/“;ôzÚä Ž–ÛÂÈýÑ L§92òÇæI%ö257¶>E^˶?É\)ä5ä'âL’ÙŽ¡Ò¢+o« “;hxÃØbr<–ÌÓhm#eúI[vOW"•Ády5y9ˆô“>Lzòu5àÞQ¼‡ŒÜpi¤­Y±ÿËeôËE­‘Úï—ôˆ¤¨¤Ã’|Pjam½ªÿ‘ü0þc÷KûB½` endstream endobj 420 0 obj 1797 endobj 421 0 obj << /Type /FontDescriptor /Ascent 701 /CapHeight 0 /Descent -299 /Flags 32 /FontBBox [ 42 -177 550 706 ] /FontName /RBNCJB+Symbol /ItalicAngle 0 /StemV 0 /MaxWidth 1042 /FontFile2 419 0 R >> endobj 422 0 obj [ 250 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 549 ] endobj 68 0 obj << /Type /Font /Subtype /TrueType /BaseFont /RBNCJB+Symbol /FontDescriptor 421 0 R /Widths 422 0 R /FirstChar 32 /LastChar 61 /Encoding /MacRomanEncoding >> endobj 5 0 obj << /Type /Pages /Count 2 /Kids [ 4 0 R 39 0 R ] >> endobj 423 0 obj << /Type /Catalog /Pages 5 0 R >> endobj 424 0 obj << /CreationDate (D:20060617203329+02'00') /Creator (Word) /ModDate (D:20060617203329+02'00') /Producer (Mac OS X 10.3.9 Quartz PDFContext) >> endobj 425 0 obj [ ] endobj xref 0 426 0000000000 65535 f 0000008594 00000 n 0000000022 00000 n 0000016906 00000 n 0000008614 00000 n 0000782766 00000 n 0000008720 00000 n 0000511713 00000 n 0000684071 00000 n 0000588537 00000 n 0000010337 00000 n 0000008917 00000 n 0000009602 00000 n 0000009429 00000 n 0000009449 00000 n 0000016040 00000 n 0000663887 00000 n 0000718229 00000 n 0000540888 00000 n 0000715455 00000 n 0000524941 00000 n 0000010160 00000 n 0000010180 00000 n 0000017771 00000 n 0000633963 00000 n 0000780155 00000 n 0000694102 00000 n 0000648062 00000 n 0000527345 00000 n 0000013612 00000 n 0000013633 00000 n 0000016020 00000 n 0000015211 00000 n 0000016886 00000 n 0000016077 00000 n 0000017751 00000 n 0000016942 00000 n 0000021229 00000 n 0000017808 00000 n 0000021250 00000 n 0000021359 00000 n 0000030425 00000 n 0000279127 00000 n 0000021669 00000 n 0000022435 00000 n 0000022963 00000 n 0000023734 00000 n 0000024742 00000 n 0000025615 00000 n 0000026495 00000 n 0000027430 00000 n 0000028121 00000 n 0000028962 00000 n 0000029652 00000 n 0000022257 00000 n 0000022277 00000 n 0000466113 00000 n 0000631480 00000 n 0000764648 00000 n 0000558280 00000 n 0000529828 00000 n 0000736081 00000 n 0000022799 00000 n 0000022819 00000 n 0000466983 00000 n 0000725247 00000 n 0000592856 00000 n 0000598060 00000 n 0000782593 00000 n 0000023556 00000 n 0000023576 00000 n 0000470465 00000 n 0000515936 00000 n 0000554066 00000 n 0000617550 00000 n 0000486491 00000 n 0000548627 00000 n 0000024564 00000 n 0000024584 00000 n 0000472206 00000 n 0000522486 00000 n 0000638120 00000 n 0000706088 00000 n 0000604575 00000 n 0000770019 00000 n 0000025436 00000 n 0000025456 00000 n 0000469595 00000 n 0000743915 00000 n 0000620814 00000 n 0000655798 00000 n 0000532314 00000 n 0000601901 00000 n 0000026315 00000 n 0000026335 00000 n 0000473947 00000 n 0000546137 00000 n 0000687958 00000 n 0000536752 00000 n 0000720743 00000 n 0000651302 00000 n 0000027243 00000 n 0000027264 00000 n 0000474817 00000 n 0000710404 00000 n 0000519159 00000 n 0000483800 00000 n 0000669514 00000 n 0000738697 00000 n 0000027949 00000 n 0000027970 00000 n 0000473076 00000 n 0000698870 00000 n 0000491373 00000 n 0000772707 00000 n 0000623494 00000 n 0000028775 00000 n 0000028796 00000 n 0000471335 00000 n 0000479206 00000 n 0000610611 00000 n 0000701528 00000 n 0000730497 00000 n 0000628797 00000 n 0000029480 00000 n 0000029501 00000 n 0000467853 00000 n 0000753573 00000 n 0000613392 00000 n 0000748683 00000 n 0000626149 00000 n 0000030238 00000 n 0000030259 00000 n 0000468724 00000 n 0000643616 00000 n 0000595345 00000 n 0000659894 00000 n 0000760339 00000 n 0000757566 00000 n 0000279103 00000 n 0000465257 00000 n 0000466092 00000 n 0000465281 00000 n 0000466962 00000 n 0000466151 00000 n 0000467832 00000 n 0000467021 00000 n 0000468703 00000 n 0000467892 00000 n 0000469574 00000 n 0000468763 00000 n 0000470444 00000 n 0000469633 00000 n 0000471314 00000 n 0000470503 00000 n 0000472185 00000 n 0000471374 00000 n 0000473055 00000 n 0000472244 00000 n 0000473926 00000 n 0000473115 00000 n 0000474796 00000 n 0000473985 00000 n 0000474856 00000 n 0000478937 00000 n 0000478959 00000 n 0000479169 00000 n 0000479386 00000 n 0000483526 00000 n 0000483548 00000 n 0000483763 00000 n 0000483982 00000 n 0000485993 00000 n 0000486015 00000 n 0000486222 00000 n 0000486664 00000 n 0000490257 00000 n 0000490279 00000 n 0000490492 00000 n 0000491553 00000 n 0000511066 00000 n 0000511089 00000 n 0000511328 00000 n 0000511902 00000 n 0000515642 00000 n 0000515664 00000 n 0000515875 00000 n 0000516114 00000 n 0000518877 00000 n 0000518899 00000 n 0000519106 00000 n 0000519305 00000 n 0000522204 00000 n 0000522226 00000 n 0000522433 00000 n 0000522631 00000 n 0000524683 00000 n 0000524705 00000 n 0000524912 00000 n 0000525086 00000 n 0000526975 00000 n 0000526997 00000 n 0000527204 00000 n 0000527518 00000 n 0000529570 00000 n 0000529592 00000 n 0000529799 00000 n 0000529973 00000 n 0000531944 00000 n 0000531966 00000 n 0000532173 00000 n 0000532487 00000 n 0000536471 00000 n 0000536493 00000 n 0000536703 00000 n 0000536930 00000 n 0000540631 00000 n 0000540653 00000 n 0000540863 00000 n 0000541065 00000 n 0000545723 00000 n 0000545745 00000 n 0000545960 00000 n 0000546317 00000 n 0000548369 00000 n 0000548391 00000 n 0000548598 00000 n 0000548772 00000 n 0000553660 00000 n 0000553682 00000 n 0000553897 00000 n 0000554246 00000 n 0000557986 00000 n 0000558008 00000 n 0000558219 00000 n 0000558458 00000 n 0000587895 00000 n 0000587918 00000 n 0000588152 00000 n 0000588721 00000 n 0000592599 00000 n 0000592621 00000 n 0000592831 00000 n 0000593035 00000 n 0000595087 00000 n 0000595109 00000 n 0000595316 00000 n 0000595491 00000 n 0000597798 00000 n 0000597820 00000 n 0000598027 00000 n 0000598205 00000 n 0000601606 00000 n 0000601628 00000 n 0000601840 00000 n 0000602079 00000 n 0000604201 00000 n 0000604223 00000 n 0000604430 00000 n 0000604748 00000 n 0000610164 00000 n 0000610186 00000 n 0000610402 00000 n 0000610792 00000 n 0000613130 00000 n 0000613152 00000 n 0000613359 00000 n 0000613538 00000 n 0000617295 00000 n 0000617317 00000 n 0000617525 00000 n 0000617729 00000 n 0000620540 00000 n 0000620562 00000 n 0000620769 00000 n 0000620959 00000 n 0000623232 00000 n 0000623254 00000 n 0000623461 00000 n 0000623640 00000 n 0000625651 00000 n 0000625673 00000 n 0000625880 00000 n 0000626323 00000 n 0000628427 00000 n 0000628449 00000 n 0000628656 00000 n 0000628971 00000 n 0000630982 00000 n 0000631004 00000 n 0000631211 00000 n 0000631653 00000 n 0000633705 00000 n 0000633727 00000 n 0000633934 00000 n 0000634108 00000 n 0000637865 00000 n 0000637887 00000 n 0000638095 00000 n 0000638299 00000 n 0000643162 00000 n 0000643184 00000 n 0000643399 00000 n 0000643797 00000 n 0000647781 00000 n 0000647803 00000 n 0000648013 00000 n 0000648240 00000 n 0000651028 00000 n 0000651050 00000 n 0000651257 00000 n 0000651448 00000 n 0000655529 00000 n 0000655551 00000 n 0000655761 00000 n 0000655977 00000 n 0000659639 00000 n 0000659661 00000 n 0000659869 00000 n 0000660074 00000 n 0000663592 00000 n 0000663614 00000 n 0000663826 00000 n 0000664065 00000 n 0000668924 00000 n 0000668946 00000 n 0000669157 00000 n 0000669694 00000 n 0000683416 00000 n 0000683439 00000 n 0000683686 00000 n 0000684262 00000 n 0000687663 00000 n 0000687685 00000 n 0000687897 00000 n 0000688136 00000 n 0000693652 00000 n 0000693674 00000 n 0000693889 00000 n 0000694282 00000 n 0000698476 00000 n 0000698498 00000 n 0000698713 00000 n 0000699051 00000 n 0000701266 00000 n 0000701288 00000 n 0000701495 00000 n 0000701674 00000 n 0000705814 00000 n 0000705836 00000 n 0000706051 00000 n 0000706269 00000 n 0000710147 00000 n 0000710169 00000 n 0000710379 00000 n 0000710584 00000 n 0000715049 00000 n 0000715071 00000 n 0000715286 00000 n 0000715635 00000 n 0000717731 00000 n 0000717753 00000 n 0000717960 00000 n 0000718402 00000 n 0000720373 00000 n 0000720395 00000 n 0000720602 00000 n 0000720916 00000 n 0000724893 00000 n 0000724915 00000 n 0000725130 00000 n 0000725427 00000 n 0000729892 00000 n 0000729914 00000 n 0000730124 00000 n 0000730677 00000 n 0000735639 00000 n 0000735661 00000 n 0000735876 00000 n 0000736261 00000 n 0000738323 00000 n 0000738345 00000 n 0000738552 00000 n 0000738871 00000 n 0000743504 00000 n 0000743526 00000 n 0000743742 00000 n 0000744095 00000 n 0000748289 00000 n 0000748311 00000 n 0000748526 00000 n 0000748864 00000 n 0000752457 00000 n 0000752479 00000 n 0000752692 00000 n 0000753753 00000 n 0000757271 00000 n 0000757293 00000 n 0000757505 00000 n 0000757745 00000 n 0000759841 00000 n 0000759863 00000 n 0000760070 00000 n 0000760513 00000 n 0000764391 00000 n 0000764413 00000 n 0000764623 00000 n 0000764827 00000 n 0000769428 00000 n 0000769450 00000 n 0000769662 00000 n 0000770198 00000 n 0000772209 00000 n 0000772231 00000 n 0000772438 00000 n 0000772881 00000 n 0000779549 00000 n 0000779571 00000 n 0000779782 00000 n 0000780334 00000 n 0000782223 00000 n 0000782245 00000 n 0000782452 00000 n 0000782832 00000 n 0000782883 00000 n 0000783043 00000 n trailer << /Size 426 /Root 423 0 R /Info 424 0 R /ID 425 0 R >> startxref 783134 %%EOF iem_utils-v0.0.20180206/iem_adaptfilt/AUTHORS.txt0000644000175000017500000000012112630366344021355 0ustar zmoelnigzmoelnigmarkus noisternig thomas musil iem_utils-v0.0.20180206/iem_adaptfilt/Makefile0000644000175000017500000000223213004407302021116 0ustar zmoelnigzmoelnig#!/usr/bin/make -f # Makefile to the 'iemguts' library for Pure Data. # Needs Makefile.pdlibbuilder as helper makefile for platform-dependent build # settings and rules (https://github.com/pure-data/pd-lib-builder). lib.name = iem_adaptfilt # special file that does not provide a class lib.setup.sources = src/iem_adaptfilt.c # all other C and C++ files in subdirs are source files per class # (alternatively, enumerate them by hand) class.sources = $(filter-out $(lib.setup.sources),$(wildcard src/*.c)) datafiles = \ $(wildcard help/*.pd) \ AUTHORS.txt \ GnuGPL.txt \ VERSION.txt datadirs = doc cflags = -DVERSION=$(shell cat VERSION.txt) ################################################################################ ### pdlibbuilder ############################################################### ################################################################################ # This Makefile is based on the Makefile from pd-lib-builder written by # Katja Vetter. You can get it from: # https://github.com/pure-data/pd-lib-builder PDLIBBUILDER_DIR=pd-lib-builder/ include $(firstword $(wildcard $(PDLIBBUILDER_DIR)/Makefile.pdlibbuilder Makefile.pdlibbuilder)) iem_utils-v0.0.20180206/iem_adaptfilt/GnuGPL.txt0000644000175000017500000004311012630366344021331 0ustar zmoelnigzmoelnig GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License. iem_utils-v0.0.20180206/iem_dp/0000755000175000017500000000000013236306220016116 5ustar zmoelnigzmoelnigiem_utils-v0.0.20180206/iem_dp/max~~-help.pd0000644000175000017500000000511112630366345020563 0ustar zmoelnigzmoelnig#N canvas 291 113 860 543 10; #X symbolatom 196 386 25 0 0 0 - - -; #X text 133 493 IEM KUG; #X text 117 481 musil; #X text 154 481 @; #X text 163 481 iem.at; #X text 116 503 Graz \, Austria; #X text 176 455 @; #X text 185 455 iem.at; #X text 117 455 zmoelnig; #X text 388 386 sum displayed via a symbol; #X obj 139 97 sig~; #X obj 99 97 sig~; #X obj 360 144 sig~; #X obj 320 144 sig~; #X msg 11 91 \; pd dsp \$1; #X obj 11 71 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 1 1 ; #N canvas 0 22 330 356 sunsig~~ 0; #X obj 22 195 snapshot~; #X obj 47 103 metro 300; #X obj 46 81 loadbang; #X obj 22 18 inlet~; #X obj 122 18 inlet~; #X obj 122 195 snapshot~; #X obj 47 136 t b b; #X obj 36 277 outlet; #X obj 35 248 dptosym; #X connect 0 0 8 0; #X connect 1 0 6 0; #X connect 2 0 1 0; #X connect 3 0 0 0; #X connect 4 0 5 0; #X connect 5 0 8 1; #X connect 6 0 0 0; #X connect 6 1 5 0; #X connect 8 0 7 0; #X restore 195 260 pd sunsig~~; #X text 452 106 = symbol selector of an anything; #X text 442 95 double precision number beginning with a "double quote" =; #X text 230 60 = symbol selector of an anything; #X text 220 49 double precision number beginning with a "double quote" =; #X text 14 12 max~~; #X text 70 13 double precision comparsion \, output the greater value ; #X obj 194 203 max~~ ######; #X msg 99 48 "1.111111112; #X msg 320 94 "1.111111113; #X text 132 401 should be "1.111111113; #X text 450 14 15 digits accurate; #X text 68 442 (c) IOhannes m zmoelnig 1999 - 2013; #X text 68 470 (c) Thomas Musil 2000 - 2013; #X obj 99 72 symtodp; #X obj 320 115 symtodp; #X obj 496 228 sig~; #N canvas 0 22 330 356 sunsig~~ 0; #X obj 22 195 snapshot~; #X obj 47 103 metro 300; #X obj 46 81 loadbang; #X obj 22 18 inlet~; #X obj 122 18 inlet~; #X obj 122 195 snapshot~; #X obj 47 136 t b b; #X obj 36 277 outlet; #X obj 35 248 dptosym; #X connect 0 0 8 0; #X connect 1 0 6 0; #X connect 2 0 1 0; #X connect 3 0 0 0; #X connect 4 0 5 0; #X connect 5 0 8 1; #X connect 6 0 0 0; #X connect 6 1 5 0; #X connect 8 0 7 0; #X restore 496 282 pd sunsig~~; #X symbolatom 496 307 25 0 0 0 - - -; #X obj 496 254 max~~ 10 0; #X floatatom 496 207 5 0 0 0 - - -; #X floatatom 557 207 5 0 0 0 - - -; #X connect 10 0 23 1; #X connect 11 0 23 0; #X connect 12 0 23 3; #X connect 13 0 23 2; #X connect 15 0 14 0; #X connect 16 0 0 0; #X connect 23 0 16 0; #X connect 23 1 16 1; #X connect 24 0 30 0; #X connect 25 0 31 0; #X connect 30 0 11 0; #X connect 30 1 10 0; #X connect 31 0 13 0; #X connect 31 1 12 0; #X connect 32 0 35 0; #X connect 33 0 34 0; #X connect 35 0 33 0; #X connect 35 1 33 1; #X connect 36 0 32 0; #X connect 37 0 35 2; iem_utils-v0.0.20180206/iem_dp/LICENSE.txt0000644000175000017500000000324012630366345017753 0ustar zmoelnigzmoelnigiem_dp - dynamic library for pd; calculates pd signals or pd float messages in double precision. The goal of this library is to allow more than 24 bit accurate access to arrays and delay-lines. That means: with 32-bit IEEE floatingpoint we have a 23 bit mantissa with a resolution of 1 to 8388608. If you want to access to an array ( size greater than 8388608 ) by tabread4, you get a staircase-shaped output. The objects of this library work internal with double or 32-bit integer instead 24-bit mantissa of 32-bit float. To connect this higher resolution, we need 2 signal or 2 message cords. One for the float casted number and one for the difference to the higher resolution number. Copyright (C) 2000-2013 Thomas MUSIL [musil_at_iem.at] IEM - Institute of Electronic Music and Acoustics, Graz Inffeldgasse 10/3, 8010 Graz, Austria http://iem.at This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details ( GnuGPL.txt ). (e.g. http://www.gnu.org/copyleft/gpl.html) You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Graz, 28 June 2013 Thomas Musiliem_utils-v0.0.20180206/iem_dp/sub__-help0000644000175000017500000000260712630366345020076 0ustar zmoelnigzmoelnig#N canvas 224 167 932 536 10; #X symbolatom 167 326 25 0 0 0 - - -; #X text 104 453 IEM KUG; #X text 88 441 musil; #X text 125 441 @; #X text 134 441 iem.at; #X text 87 463 Graz \, Austria; #X text 147 415 @; #X text 156 415 iem.at; #X text 88 415 zmoelnig; #X floatatom 251 245 11 0 0 0 - - -; #X floatatom 227 273 11 0 0 0 - - -; #X text 337 244 difference; #X text 311 272 float casted; #X text 14 12 -__; #X text 70 13 double precision subtraction; #X obj 165 209 -__ 0 0; #X text 359 326 difference displayed via a symbol; #X text 203 83 = symbol selector of an anything; #X msg 70 71 "9.9999999999999; #X msg 292 108 "8.7654321234567; #X text 90 341 should be "1.2345678765432; #X text 193 72 double precision number beginning with a "double quote" =; #X text 422 119 = symbol selector of an anything; #X text 412 108 double precision number beginning with a "double quote" =; #X obj 166 303 dptosym; #X text 14 32 sub__; #X text 14 57 -''; #X obj 239 209 sub__ 0 0; #X obj 316 209 -'' 0 0; #X text 294 13 15 digits accurate; #X text 39 402 (c) IOhannes m zmoelnig 1999 - 2013; #X text 39 430 (c) Thomas Musil 2000 - 2013; #X obj 71 97 symtodp; #X obj 292 130 symtodp; #X connect 15 0 10 0; #X connect 15 0 24 0; #X connect 15 1 9 0; #X connect 15 1 24 1; #X connect 18 0 32 0; #X connect 19 0 33 0; #X connect 24 0 0 0; #X connect 32 0 15 0; #X connect 32 1 15 1; #X connect 33 0 15 2; #X connect 33 1 15 3; iem_utils-v0.0.20180206/iem_dp/vd~~-help.pd0000644000175000017500000000166212630366345020416 0ustar zmoelnigzmoelnig#N canvas 248 216 633 323 10; #X obj 32 25 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 0 1 ; #X msg 33 48 \; pd dsp \$1; #X obj 175 65 sig~; #X floatatom 174 40 5 0 0 0 - - -; #X obj 178 197 delread~~ abc 1234 0; #X obj 178 224 unsig~; #X floatatom 178 248 5 0 0 0 - - -; #X obj 176 91 delwrite~~ abc 9876 0; #X msg 221 166 2345 0; #X msg 242 145 3456 0; #X floatatom 163 148 5 0 0 0 - - -; #X floatatom 310 144 5 0 0 0 - - -; #X obj 390 226 unsig~; #X floatatom 390 250 5 0 0 0 - - -; #X floatatom 382 122 5 0 0 0 - - -; #X floatatom 437 122 5 0 0 0 - - -; #X obj 390 199 vd~~ abc; #X obj 382 141 sig~; #X obj 436 144 sig~; #X connect 0 0 1 0; #X connect 2 0 7 0; #X connect 3 0 2 0; #X connect 4 0 5 0; #X connect 5 0 6 0; #X connect 8 0 4 0; #X connect 9 0 4 0; #X connect 10 0 4 0; #X connect 11 0 4 1; #X connect 12 0 13 0; #X connect 14 0 17 0; #X connect 15 0 18 0; #X connect 16 0 12 0; #X connect 17 0 16 0; #X connect 18 0 16 1; iem_utils-v0.0.20180206/iem_dp/src/0000755000175000017500000000000013236306220016705 5ustar zmoelnigzmoelnigiem_utils-v0.0.20180206/iem_dp/src/tabread_dp.c0000644000175000017500000000422712630366345021156 0ustar zmoelnigzmoelnig/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_dp written by IOhannes m zmoelnig, Thomas Musil, Copyright (c) IEM KUG Graz Austria 1999 - 2007 */ /* double precision library */ #include "m_pd.h" #include "iemlib.h" #include "iem_dp.h" /* -------------------------- tabread__ ------------------------------ */ /* based on miller's tabread which is part of pd */ static t_class *tabread_dp_class; typedef struct _tabread_dp { t_object x_obj; t_symbol *x_arrayname; t_float x_residual; } t_tabread_dp; static void *tabread_dp_new(t_symbol *s) { t_tabread_dp *x = (t_tabread_dp *)pd_new(tabread_dp_class); x->x_arrayname = s; floatinlet_new(&x->x_obj, &x->x_residual); outlet_new(&x->x_obj, &s_float); return (x); } static void tabread_dp_float(t_tabread_dp *x, t_floatarg f) { t_garray *a; iemarray_t *vec; int npoints; if (!(a = (t_garray *)pd_findbyclass(x->x_arrayname, garray_class))) { if (*x->x_arrayname->s_name) pd_error(x, "tabread__: %s: no such array", x->x_arrayname->s_name); vec = 0; } else if (!iemarray_getarray(a, &npoints, &vec)) { pd_error(x, "%s: bad template for tabread__", x->x_arrayname->s_name); vec = 0; } else { double findex = iem_dp_calc_sum(f, x->x_residual); int n = findex; if(n < 0) n = 0; else if(n >= npoints) n = npoints - 1; outlet_float(x->x_obj.ob_outlet, (npoints ? iemarray_getfloat(vec, n) : 0)); } } static void tabread_dp_set(t_tabread_dp *x, t_symbol *s) { x->x_arrayname = s; } static void tabread_dp_free(t_tabread_dp *x) { } void tabread_dp_setup(void) { tabread_dp_class = class_new(gensym("tabread__"), (t_newmethod)tabread_dp_new, (t_method)tabread_dp_free, sizeof(t_tabread_dp), 0, A_DEFSYM, 0); class_addcreator((t_newmethod)tabread_dp_new, gensym("tabread''"), A_DEFSYM, 0); class_addfloat(tabread_dp_class, (t_method)tabread_dp_float); class_addmethod(tabread_dp_class, (t_method)tabread_dp_set, gensym("set"), A_SYMBOL, 0); } iem_utils-v0.0.20180206/iem_dp/src/div__.c0000644000175000017500000000442512630366345020151 0ustar zmoelnigzmoelnig/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_dp written by IOhannes m zmoelnig, Thomas Musil, Copyright (c) IEM KUG Graz Austria 1999 - 2007 */ /* double precision library */ #include "m_pd.h" #include "iemlib.h" #include "iem_dp.h" /* ------------------------ div__ or /__ ---------------------------- */ /* based on miller's /, which is part of pd, only with double precision */ static t_class *div___class; typedef struct _div__ { t_object x_obj; t_float x_coarse_left; t_float x_fine_left; t_float x_coarse_right; t_float x_fine_right; t_outlet *x_out_coarse; t_outlet *x_out_fine; } t_div__; static void div___bang(t_div__ *x) { double ddiv, nom; t_float fdiv; nom = iem_dp_calc_sum(x->x_coarse_right, x->x_fine_right); ddiv = (nom ? iem_dp_calc_sum(x->x_coarse_left, x->x_fine_left) / nom : 0); fdiv = (t_float)ddiv; outlet_float(x->x_out_fine, iem_dp_calc_residual(ddiv, fdiv)); outlet_float(x->x_out_coarse, fdiv); } static void div___float(t_div__ *x, t_floatarg f) { x->x_coarse_left = f; div___bang(x); } static void *div___new(t_symbol *s, int ac, t_atom *av) { t_div__ *x = (t_div__ *)pd_new(div___class); floatinlet_new(&x->x_obj, &x->x_fine_left); floatinlet_new(&x->x_obj, &x->x_coarse_right); floatinlet_new(&x->x_obj, &x->x_fine_right); x->x_coarse_left = 0.0f; x->x_fine_left = 0.0f; if((ac > 0) && (IS_A_FLOAT(av, 0))) x->x_coarse_right = atom_getfloatarg(0, ac, av); else x->x_coarse_right = 0.0f; if((ac > 1) && (IS_A_FLOAT(av, 1))) x->x_fine_right = atom_getfloatarg(1, ac, av); else x->x_fine_right = 0.0f; x->x_out_coarse = outlet_new(&x->x_obj, &s_float); x->x_out_fine = outlet_new(&x->x_obj, &s_float); return (x); } static void div___free(t_div__ *x) { } void div___setup(void) { div___class = class_new(gensym("div__"), (t_newmethod)div___new, 0, sizeof(t_div__), 0, A_GIMME, 0); class_addcreator((t_newmethod)div___new, gensym("/__"), A_GIMME, 0); class_addcreator((t_newmethod)div___new, gensym("/''"), A_GIMME, 0); class_addbang(div___class, div___bang); class_addfloat(div___class, div___float); } iem_utils-v0.0.20180206/iem_dp/src/delay~~.c0000644000175000017500000002772312630366345020571 0ustar zmoelnigzmoelnig/* Copyright (c) 1997-1999 Miller Puckette. * For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. */ #include "m_pd.h" #include "iemlib.h" #include "iem_dp.h" #define DEFDELVS_TT 64 /* LATER get this from canvas at DSP time */ #define XTRASAMPS_TT 4 #define SAMPBLK_TT 4 /* ----------------------------- delwrite~~ ----------------------------- */ typedef struct delwrite_tilde_tilde_ctl { int c_n; t_sample *c_vec; int c_phase; } t_delwrite_tilde_tilde_ctl; typedef struct _delwrite_tilde_tilde { t_object x_obj; t_symbol *x_sym; double x_deltime; t_delwrite_tilde_tilde_ctl x_cspace; int x_sortno; /* DSP sort number at which this was last put on chain */ int x_rsortno; /* DSP sort # for first delread or write in chain */ int x_vecsize; /* vector size for delread~ to use */ t_float x_f; } t_delwrite_tilde_tilde; //extern static int delread_zero; static t_class *delwrite_tilde_tilde_class; static void delwrite_tilde_tilde_updatesr (t_delwrite_tilde_tilde *x, t_float sr) /* added by Mathieu Bouchard */ { int nsamps = (int)(x->x_deltime * (double)sr * (double)(0.001)); if (nsamps < 1) nsamps = 1; nsamps += ((- nsamps) & (SAMPBLK_TT - 1)); nsamps += DEFDELVS_TT; if(x->x_cspace.c_n != nsamps) { x->x_cspace.c_vec = (t_sample *)resizebytes(x->x_cspace.c_vec, (x->x_cspace.c_n + XTRASAMPS_TT) * sizeof(t_sample), (nsamps + XTRASAMPS_TT) * sizeof(t_sample)); x->x_cspace.c_n = nsamps; x->x_cspace.c_phase = XTRASAMPS_TT; } } /* routine to check that all delwrites/delreads/vds have same vecsize */ static void delwrite_tilde_tilde_checkvecsize(t_delwrite_tilde_tilde *x, int vecsize) { if (x->x_rsortno != ugen_getsortno()) { x->x_vecsize = vecsize; x->x_rsortno = ugen_getsortno(); } /* LATER this should really check sample rate and blocking, once that is supported. Probably we don't actually care about vecsize. For now just suppress this check. */ #if 0 else if (vecsize != x->x_vecsize) pd_error(x, "delread/delwrite/vd vector size mismatch"); #endif } static void *delwrite_tilde_tilde_new(t_symbol *s, t_floatarg coarse_msec, t_floatarg fine_msec) { t_delwrite_tilde_tilde *x = (t_delwrite_tilde_tilde *)pd_new(delwrite_tilde_tilde_class); if(!*s->s_name) s = gensym("delwrite~~"); pd_bind(&x->x_obj.ob_pd, s); x->x_sym = s; x->x_deltime = iem_dp_calc_sum(coarse_msec, fine_msec); x->x_cspace.c_n = 0; x->x_cspace.c_vec = (t_sample *)getbytes(XTRASAMPS_TT * sizeof(t_sample)); x->x_sortno = 0; x->x_vecsize = 0; x->x_f = 0; return (x); } static t_int *delwrite_tilde_tilde_perform(t_int *w) { t_float *in = (t_float *)(w[1]); t_delwrite_tilde_tilde_ctl *c = (t_delwrite_tilde_tilde_ctl *)(w[2]); int n = (int)(w[3]); int phase = c->c_phase, nsamps = c->c_n; t_sample *vp = c->c_vec, *bp = vp + phase, *ep = vp + (c->c_n + XTRASAMPS_TT); phase += n; while (n--) { t_sample f = *in++; if(IEM_DENORMAL(f)) f = 0; *bp++ = f; if (bp == ep) { vp[0] = ep[-4]; vp[1] = ep[-3]; vp[2] = ep[-2]; vp[3] = ep[-1]; bp = vp + XTRASAMPS_TT; phase -= nsamps; } } c->c_phase = phase; return (w+4); } static void delwrite_tilde_tilde_dsp(t_delwrite_tilde_tilde *x, t_signal **sp) { dsp_add(delwrite_tilde_tilde_perform, 3, sp[0]->s_vec, &x->x_cspace, sp[0]->s_n); x->x_sortno = ugen_getsortno(); delwrite_tilde_tilde_checkvecsize(x, sp[0]->s_n); delwrite_tilde_tilde_updatesr(x, sp[0]->s_sr); } static void delwrite_tilde_tilde_free(t_delwrite_tilde_tilde *x) { pd_unbind(&x->x_obj.ob_pd, x->x_sym); freebytes(x->x_cspace.c_vec, (x->x_cspace.c_n + XTRASAMPS_TT) * sizeof(t_sample)); } static void delwrite_tilde_tilde_setup(void) { delwrite_tilde_tilde_class = class_new(gensym("delwrite~~"), (t_newmethod)delwrite_tilde_tilde_new, (t_method)delwrite_tilde_tilde_free, sizeof(t_delwrite_tilde_tilde), 0, A_DEFSYM, A_DEFFLOAT, A_DEFFLOAT, 0); CLASS_MAINSIGNALIN(delwrite_tilde_tilde_class, t_delwrite_tilde_tilde, x_f); class_addmethod(delwrite_tilde_tilde_class, (t_method)delwrite_tilde_tilde_dsp, gensym("dsp"), 0); } /* ----------------------------- delread~~ ----------------------------- */ static t_class *delread_tilde_tilde_class; typedef struct _delread_tilde_tilde { t_object x_obj; t_symbol *x_sym; t_float x_fine; double x_deltime; /* delay in msec */ int x_delsamps; /* delay in samples */ t_float x_sr; /* samples per msec */ t_float x_n; /* vector size */ int x_zerodel; /* 0 or vecsize depending on read/write order */ } t_delread_tilde_tilde; static void delread_tilde_tilde_list(t_delread_tilde_tilde *x, t_symbol *s, int ac, t_atom *av); static void *delread_tilde_tilde_new(t_symbol *s, int ac, t_atom *av) { t_symbol *delname; t_delread_tilde_tilde *x = (t_delread_tilde_tilde *)pd_new(delread_tilde_tilde_class); if((ac > 0) && IS_A_SYMBOL(av, 0)) delname = atom_getsymbolarg(0, ac, av); else delname = &s_; x->x_sym = delname; x->x_sr = 1; x->x_n = 1; x->x_zerodel = 0; delread_tilde_tilde_list(x, &s_list, ac-1, av+1); floatinlet_new(&x->x_obj, &x->x_fine); outlet_new(&x->x_obj, &s_signal); return (x); } static void delread_tilde_tilde_list(t_delread_tilde_tilde *x, t_symbol *s, int ac, t_atom *av) { t_float coarse, fine; t_delwrite_tilde_tilde *delwriter = (t_delwrite_tilde_tilde *)pd_findbyclass(x->x_sym, delwrite_tilde_tilde_class); if((ac > 0) && (IS_A_FLOAT(av, 0))) coarse = atom_getfloatarg(0, ac, av); else coarse = 0.0; if((ac > 1) && (IS_A_FLOAT(av, 1))) fine = atom_getfloatarg(1, ac, av); else fine = 0.0; x->x_deltime = iem_dp_calc_sum(coarse, fine); if(delwriter) { int delsize = delwriter->x_cspace.c_n; x->x_delsamps = (int)(0.5 + (double)x->x_sr * x->x_deltime) + x->x_n - x->x_zerodel; if(x->x_delsamps < x->x_n) x->x_delsamps = x->x_n; else if(x->x_delsamps > delwriter->x_cspace.c_n - DEFDELVS_TT) x->x_delsamps = delwriter->x_cspace.c_n - DEFDELVS_TT; } } static void delread_tilde_tilde_double(t_delread_tilde_tilde *x, double d) { t_delwrite_tilde_tilde *delwriter = (t_delwrite_tilde_tilde *)pd_findbyclass(x->x_sym, delwrite_tilde_tilde_class); x->x_deltime = d; if(delwriter) { int delsize = delwriter->x_cspace.c_n; x->x_delsamps = (int)(0.5 + (double)x->x_sr * x->x_deltime) + x->x_n - x->x_zerodel; if(x->x_delsamps < x->x_n) x->x_delsamps = x->x_n; else if(x->x_delsamps > delwriter->x_cspace.c_n - DEFDELVS_TT) x->x_delsamps = delwriter->x_cspace.c_n - DEFDELVS_TT; } } static void delread_tilde_tilde_float(t_delread_tilde_tilde *x, t_float coarse) { t_delwrite_tilde_tilde *delwriter = (t_delwrite_tilde_tilde *)pd_findbyclass(x->x_sym, delwrite_tilde_tilde_class); x->x_deltime = iem_dp_calc_sum(coarse, x->x_fine); if(delwriter) { int delsize = delwriter->x_cspace.c_n; x->x_delsamps = (int)(0.5 + (double)x->x_sr * x->x_deltime) + x->x_n - x->x_zerodel; if(x->x_delsamps < x->x_n) x->x_delsamps = x->x_n; else if(x->x_delsamps > delwriter->x_cspace.c_n - DEFDELVS_TT) x->x_delsamps = delwriter->x_cspace.c_n - DEFDELVS_TT; } } static t_int *delread_tilde_tilde_perform(t_int *w) { t_sample *out = (t_float *)(w[1]); t_delwrite_tilde_tilde_ctl *c = (t_delwrite_tilde_tilde_ctl *)(w[2]); int delsamps = *(int *)(w[3]); int n = (int)(w[4]); int phase = c->c_phase - delsamps, nsamps = c->c_n; t_sample *vp = c->c_vec, *bp, *ep = vp + (c->c_n + XTRASAMPS_TT); if(phase < 0) phase += nsamps; bp = vp + phase; while(n--) { *out++ = *bp++; if(bp == ep) bp -= nsamps; } return (w+5); } static void delread_tilde_tilde_dsp(t_delread_tilde_tilde *x, t_signal **sp) { t_delwrite_tilde_tilde *delwriter = (t_delwrite_tilde_tilde *)pd_findbyclass(x->x_sym, delwrite_tilde_tilde_class); x->x_sr = sp[0]->s_sr * 0.001; x->x_n = sp[0]->s_n; if(delwriter) { delwrite_tilde_tilde_checkvecsize(delwriter, sp[0]->s_n); x->x_zerodel = (delwriter->x_sortno == ugen_getsortno() ? 0 : delwriter->x_vecsize); delread_tilde_tilde_double(x, x->x_deltime); dsp_add(delread_tilde_tilde_perform, 4, sp[0]->s_vec, &delwriter->x_cspace, &x->x_delsamps, sp[0]->s_n); } else if (*x->x_sym->s_name) error("delread~~: %s: no such delwrite~~",x->x_sym->s_name); } static void delread_tilde_tilde_setup(void) { delread_tilde_tilde_class = class_new(gensym("delread~~"), (t_newmethod)delread_tilde_tilde_new, 0, sizeof(t_delread_tilde_tilde), 0, A_GIMME, 0); class_addmethod(delread_tilde_tilde_class, (t_method)delread_tilde_tilde_dsp, gensym("dsp"), 0); class_addfloat(delread_tilde_tilde_class, (t_method)delread_tilde_tilde_float); } /* ----------------------------- vd~~ ----------------------------- */ static t_class *vd_tilde_tilde_class; typedef struct _vd_tilde_tilde { t_object x_obj; t_symbol *x_sym; t_float x_sr; /* samples per msec */ int x_zerodel; /* 0 or vecsize depending on read/write order */ t_float x_f; } t_vd_tilde_tilde; static void *vd_tilde_tilde_new(t_symbol *s) { t_vd_tilde_tilde *x = (t_vd_tilde_tilde *)pd_new(vd_tilde_tilde_class); if(!*s->s_name) s = gensym("vd~~"); x->x_sym = s; x->x_sr = 1; x->x_zerodel = 0; inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_signal, &s_signal); outlet_new(&x->x_obj, &s_signal); x->x_f = 0; return (x); } static t_int *vd_tilde_tilde_perform(t_int *w) { t_sample *cin = (t_sample *)(w[1]); t_sample *fin = (t_sample *)(w[2]); t_sample *out = (t_sample *)(w[3]); t_delwrite_tilde_tilde_ctl *ctl = (t_delwrite_tilde_tilde_ctl *)(w[4]); t_vd_tilde_tilde *x = (t_vd_tilde_tilde *)(w[5]); int n = (int)(w[6]); int nsamps = ctl->c_n; double limit = (double)nsamps - (double)n - 1.0; t_sample fn = n-1; t_sample *vp = ctl->c_vec, *bp, *wp = vp + ctl->c_phase; t_sample zerodel = x->x_zerodel; while (n--) { double delsamps = (double)x->x_sr * iem_dp_calc_sum(*cin++, *fin++) - (double)zerodel; t_sample frac; int idelsamps; t_sample a, b, c, d, cminusb; if(delsamps < 1.00001) delsamps = 1.00001; if(delsamps > limit) delsamps = limit; delsamps += (double)fn; fn = fn - 1.0f; idelsamps = (int)delsamps; frac = (t_sample)(delsamps - (double)idelsamps); bp = wp - idelsamps; if(bp < vp + 4) bp += nsamps; d = bp[-3]; c = bp[-2]; b = bp[-1]; a = bp[0]; cminusb = c - b; *out++ = b + frac * ( cminusb - 0.1666667f * (1.-frac) * ( (d - a - 3.0f * cminusb) * frac + (d + 2.0f*a - 3.0f*b) ) ); } return (w+7); } static void vd_tilde_tilde_dsp(t_vd_tilde_tilde *x, t_signal **sp) { t_delwrite_tilde_tilde *delwriter = (t_delwrite_tilde_tilde *)pd_findbyclass(x->x_sym, delwrite_tilde_tilde_class); x->x_sr = sp[0]->s_sr * 0.001; if(delwriter) { delwrite_tilde_tilde_checkvecsize(delwriter, sp[0]->s_n); x->x_zerodel = (delwriter->x_sortno == ugen_getsortno() ? 0 : delwriter->x_vecsize); dsp_add(vd_tilde_tilde_perform, 6, sp[0]->s_vec, sp[1]->s_vec, sp[2]->s_vec, &delwriter->x_cspace, x, sp[0]->s_n); } else error("vd~~: %s: no such delwrite~~", x->x_sym->s_name); } static void vd_tilde_tilde_setup(void) { vd_tilde_tilde_class = class_new(gensym("vd~~"), (t_newmethod)vd_tilde_tilde_new, 0, sizeof(t_vd_tilde_tilde), 0, A_DEFSYM, 0); class_addmethod(vd_tilde_tilde_class, (t_method)vd_tilde_tilde_dsp, gensym("dsp"), 0); CLASS_MAINSIGNALIN(vd_tilde_tilde_class, t_vd_tilde_tilde, x_f); } /********************/ void delay_tilde_tilde_setup(void) { delwrite_tilde_tilde_setup(); delread_tilde_tilde_setup(); vd_tilde_tilde_setup(); }iem_utils-v0.0.20180206/iem_dp/src/makefile_d_ppc0000644000175000017500000000207312630366345021567 0ustar zmoelnigzmoelnigcurrent: all .SUFFIXES: .d_ppc PD_INSTALL_PATH = "/Applications/Pd.app/Contents/Resources" INCLUDE = -I. -I$(PD_INSTALL_PATH)/src CFLAGS =-DPD -O2 -Wall -W -Wshadow -Wstrict-prototypes \ -Wno-unused -Wno-parentheses -Wno-switch LFLAGS = -bundle -undefined suppress -flat_namespace # the sources SRC = symtodp.c \ dptosym.c \ dptohex.c \ ftohex.c \ vline~~.c \ samphold~~.c \ wrap~~.c \ phasor~~.c \ print~~.c \ add__.c \ sub__.c \ mul__.c \ div__.c \ add~~.c \ sub~~.c \ mul~~.c \ div~~.c \ tabwrite_dp.c \ tabread_dp.c \ tabread4_dp.c \ tabwrite~~.c \ tabread~~.c \ tabread4~~.c \ max__.c \ min__.c \ max~~.c \ min~~.c \ random__.c \ delay~~.c \ iem_dp.c TARGET = iem_dp.d_ppc OBJ = $(SRC:.c=.o) # # ------------------ targets ------------------------------------ # clean: rm ../$(TARGET) rm *.o all: $(OBJ) @echo :: $(OBJ) $(CC) $(LFLAGS) -o $(TARGET) *.o strip -S -x $(TARGET) mv $(TARGET) .. $(OBJ) : %.o : %.c touch $*.c $(CC) $(CFLAGS) $(INCLUDE) -c -o $*.o $*.c iem_utils-v0.0.20180206/iem_dp/src/mul__.c0000644000175000017500000000441312630366345020161 0ustar zmoelnigzmoelnig/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_dp written by IOhannes m zmoelnig, Thomas Musil, Copyright (c) IEM KUG Graz Austria 1999 - 2007 */ /* double precision library */ #include "m_pd.h" #include "iemlib.h" #include "iem_dp.h" /* ------------------------ mul__ or *__ ---------------------------- */ /* based on miller's *, which is part of pd, only with double precision */ static t_class *mul___class; typedef struct _mul__ { t_object x_obj; t_float x_coarse_left; t_float x_fine_left; t_float x_coarse_right; t_float x_fine_right; t_outlet *x_out_coarse; t_outlet *x_out_fine; } t_mul__; static void mul___bang(t_mul__ *x) { double dprod; t_float fprod; dprod = iem_dp_calc_sum(x->x_coarse_left, x->x_fine_left) * iem_dp_calc_sum(x->x_coarse_right, x->x_fine_right); fprod = iem_dp_cast_to_float(dprod); outlet_float(x->x_out_fine, iem_dp_calc_residual(dprod, fprod)); outlet_float(x->x_out_coarse, fprod); } static void mul___float(t_mul__ *x, t_floatarg f) { x->x_coarse_left = f; mul___bang(x); } static void *mul___new(t_symbol *s, int ac, t_atom *av) { t_mul__ *x = (t_mul__ *)pd_new(mul___class); floatinlet_new(&x->x_obj, &x->x_fine_left); floatinlet_new(&x->x_obj, &x->x_coarse_right); floatinlet_new(&x->x_obj, &x->x_fine_right); x->x_coarse_left = 0.0f; x->x_fine_left = 0.0f; if((ac > 0) && (IS_A_FLOAT(av, 0))) x->x_coarse_right = atom_getfloatarg(0, ac, av); else x->x_coarse_right = 0.0f; if((ac > 1) && (IS_A_FLOAT(av, 1))) x->x_fine_right = atom_getfloatarg(1, ac, av); else x->x_fine_right = 0.0f; x->x_out_coarse = outlet_new(&x->x_obj, &s_float); x->x_out_fine = outlet_new(&x->x_obj, &s_float); return (x); } static void mul___free(t_mul__ *x) { } void mul___setup(void) { mul___class = class_new(gensym("mul__"), (t_newmethod)mul___new, 0, sizeof(t_mul__), 0, A_GIMME, 0); class_addcreator((t_newmethod)mul___new, gensym("*__"), A_GIMME, 0); class_addcreator((t_newmethod)mul___new, gensym("*''"), A_GIMME, 0); class_addbang(mul___class, mul___bang); class_addfloat(mul___class, mul___float); } iem_utils-v0.0.20180206/iem_dp/src/sub__.c0000644000175000017500000000441312630366345020155 0ustar zmoelnigzmoelnig/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_dp written by IOhannes m zmoelnig, Thomas Musil, Copyright (c) IEM KUG Graz Austria 1999 - 2007 */ /* double precision library */ #include "m_pd.h" #include "iemlib.h" #include "iem_dp.h" /* ------------------------ sub__ or -__ ---------------------------- */ /* based on miller's -, which is part of pd, only with double precision */ static t_class *sub___class; typedef struct _sub__ { t_object x_obj; t_float x_coarse_left; t_float x_fine_left; t_float x_coarse_right; t_float x_fine_right; t_outlet *x_out_coarse; t_outlet *x_out_fine; } t_sub__; static void sub___bang(t_sub__ *x) { double ddiff; t_float fdiff; ddiff = iem_dp_calc_sum(x->x_coarse_left, x->x_fine_left) - iem_dp_calc_sum(x->x_coarse_right, x->x_fine_right); fdiff = iem_dp_cast_to_float(ddiff); outlet_float(x->x_out_fine, iem_dp_calc_residual(ddiff, fdiff)); outlet_float(x->x_out_coarse, fdiff); } static void sub___float(t_sub__ *x, t_floatarg f) { x->x_coarse_left = f; sub___bang(x); } static void *sub___new(t_symbol *s, int ac, t_atom *av) { t_sub__ *x = (t_sub__ *)pd_new(sub___class); floatinlet_new(&x->x_obj, &x->x_fine_left); floatinlet_new(&x->x_obj, &x->x_coarse_right); floatinlet_new(&x->x_obj, &x->x_fine_right); x->x_coarse_left = 0.0f; x->x_fine_left = 0.0f; if((ac > 0) && (IS_A_FLOAT(av, 0))) x->x_coarse_right = atom_getfloatarg(0, ac, av); else x->x_coarse_right = 0.0f; if((ac > 1) && (IS_A_FLOAT(av, 1))) x->x_fine_right = atom_getfloatarg(1, ac, av); else x->x_fine_right = 0.0f; x->x_out_coarse = outlet_new(&x->x_obj, &s_float); x->x_out_fine = outlet_new(&x->x_obj, &s_float); return (x); } static void sub___free(t_sub__ *x) { } void sub___setup(void) { sub___class = class_new(gensym("sub__"), (t_newmethod)sub___new, 0, sizeof(t_sub__), 0, A_GIMME, 0); class_addcreator((t_newmethod)sub___new, gensym("-__"), A_GIMME, 0); class_addcreator((t_newmethod)sub___new, gensym("-''"), A_GIMME, 0); class_addbang(sub___class, sub___bang); class_addfloat(sub___class, sub___float); } iem_utils-v0.0.20180206/iem_dp/src/samphold~~.c0000644000175000017500000000772312630366345021300 0ustar zmoelnigzmoelnig/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_dp written by IOhannes m zmoelnig, Thomas Musil, Copyright (c) IEM KUG Graz Austria 1999 - 2007 */ /* double precision library */ #include "m_pd.h" #include "iemlib.h" #include "iem_dp.h" /* ---------------- samphold~~ - double precision sample and hold ----------------- */ /* based on miller's samphold~ which is part of pd */ typedef struct samphold_tilde_tilde { t_object x_obj; t_float x_f; t_sample *x_in1_coarse; t_sample *x_in1_fine; t_sample *x_in2_coarse; t_sample *x_in2_fine; t_sample *x_out_coarse; t_sample *x_out_fine; double x_lastin; double x_lastout; } t_samphold_tilde_tilde; t_class *samphold_tilde_tilde_class; static void *samphold_tilde_tilde_new(void) { t_samphold_tilde_tilde *x = (t_samphold_tilde_tilde *)pd_new(samphold_tilde_tilde_class); inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_signal, &s_signal); inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_signal, &s_signal); inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_signal, &s_signal); outlet_new(&x->x_obj, &s_signal); outlet_new(&x->x_obj, &s_signal); x->x_lastin = 0; x->x_lastout = 0; x->x_f = 0; return (x); } static t_int *samphold_tilde_tilde_perform(t_int *w) { t_samphold_tilde_tilde *x = (t_samphold_tilde_tilde *)(w[1]); int n = (int)(w[2]), i; t_sample *in1c = x->x_in1_coarse; t_sample *in1f = x->x_in1_fine; t_sample *in2c = x->x_in2_coarse; t_sample *in2f = x->x_in2_fine; t_sample *outc = x->x_out_coarse; t_sample *outf = x->x_out_fine; double lastin = x->x_lastin; double d_lastout = x->x_lastout; t_float f_lastout = 0.0f; for(i = 0; i < n; i++, in1c++, in1f++) { double next = iem_dp_calc_sum(*in2c++, *in2f++); if(next < lastin) d_lastout = iem_dp_calc_sum(*in1c, *in1f); f_lastout = iem_dp_cast_to_float(d_lastout); *outf++ = iem_dp_calc_residual(d_lastout, f_lastout); *outc++ = f_lastout; lastin = next; } x->x_lastin = lastin; x->x_lastout = d_lastout; return(w+3); } static void samphold_tilde_tilde_dsp(t_samphold_tilde_tilde *x, t_signal **sp) { x->x_in1_coarse = sp[0]->s_vec; x->x_in1_fine = sp[1]->s_vec; x->x_in2_coarse = sp[2]->s_vec; x->x_in2_fine = sp[3]->s_vec; x->x_out_coarse = sp[4]->s_vec; x->x_out_fine = sp[5]->s_vec; dsp_add(samphold_tilde_tilde_perform, 2, x, sp[0]->s_n); } static void samphold_tilde_tilde_reset(t_samphold_tilde_tilde *x, t_symbol *s, int argc, t_atom *argv) { t_float coarse, fine; if((argc > 0) && (IS_A_FLOAT(argv, 0))) coarse = atom_getfloatarg(0, argc, argv); else coarse = 1.0e20f; if((argc > 1) && (IS_A_FLOAT(argv, 1))) fine = atom_getfloatarg(1, argc, argv); else fine = 0.0f; x->x_lastin = iem_dp_calc_sum(coarse, fine); } static void samphold_tilde_tilde_set(t_samphold_tilde_tilde *x, t_symbol *s, int argc, t_atom *argv) { t_float coarse, fine; if((argc > 0) && (IS_A_FLOAT(argv, 0))) coarse = atom_getfloatarg(0, argc, argv); else coarse = 0.0f; if((argc > 1) && (IS_A_FLOAT(argv, 1))) fine = atom_getfloatarg(1, argc, argv); else fine = 0.0f; x->x_lastout = iem_dp_calc_sum(coarse, fine); } void samphold_tilde_tilde_setup(void) { samphold_tilde_tilde_class = class_new(gensym("samphold~~"), (t_newmethod)samphold_tilde_tilde_new, 0, sizeof(t_samphold_tilde_tilde), 0, 0); CLASS_MAINSIGNALIN(samphold_tilde_tilde_class, t_samphold_tilde_tilde, x_f); class_addmethod(samphold_tilde_tilde_class, (t_method)samphold_tilde_tilde_set, gensym("set"), A_GIMME, 0); class_addmethod(samphold_tilde_tilde_class, (t_method)samphold_tilde_tilde_reset, gensym("reset"), A_GIMME, 0); class_addmethod(samphold_tilde_tilde_class, (t_method)samphold_tilde_tilde_dsp, gensym("dsp"), 0); } iem_utils-v0.0.20180206/iem_dp/src/vline~~.c0000644000175000017500000001645012630366345020603 0ustar zmoelnigzmoelnig/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_dp written by IOhannes m zmoelnig, Thomas Musil, Copyright (c) IEM KUG Graz Austria 1999 - 2007 */ /* double precision library */ #include "m_pd.h" #include "iemlib.h" #include "iem_dp.h" /* -------------------------- vline~~ ------------------------------ */ /* based on miller's vline~ which is part of pd */ static t_class *vline_tilde_tilde_class; typedef struct _vseg_tt { double s_targettime; double s_starttime; double s_target; struct _vseg_tt *s_next; } t_vseg_tt; typedef struct _vline_tilde_tilde { t_object x_obj; double x_value; double x_inc; double x_referencetime; double x_samppermsec; double x_msecpersamp; double x_targettime; double x_target; t_float x_inlet2_fine_target; t_float x_inlet3_coarse_ramp_duration; t_float x_inlet4_fine_ramp_duration; t_float x_inlet5_coarse_delay; t_float x_inlet6_fine_delay; t_vseg_tt *x_list; } t_vline_tilde_tilde; static t_int *vline_tilde_tilde_perform(t_int *w) { t_vline_tilde_tilde *x = (t_vline_tilde_tilde *)(w[1]); t_float *out_float_cast = (t_float *)(w[2]); t_float *out_residual = (t_float *)(w[3]); t_float f_val; int n = (int)(w[4]), i; double d_val = x->x_value; double inc = x->x_inc; double msecpersamp = x->x_msecpersamp; double samppermsec = x->x_samppermsec; double timenow = clock_gettimesince(x->x_referencetime) - (double)n * msecpersamp; t_vseg_tt *seg_list = x->x_list; for(i = 0; i < n; i++) { double timenext = timenow + msecpersamp; checknext_tt: if(seg_list) { /* has starttime elapsed? If so update value and increment */ if(seg_list->s_starttime < timenext) { if(x->x_targettime <= timenext) d_val = x->x_target, inc = 0; /* if zero-length segment bash output value */ if(seg_list->s_targettime <= seg_list->s_starttime) { d_val = seg_list->s_target; inc = 0; } else { double incpermsec = (seg_list->s_target - d_val)/(seg_list->s_targettime - seg_list->s_starttime); d_val += incpermsec * (timenext - seg_list->s_starttime); inc = incpermsec * msecpersamp; } x->x_inc = inc; x->x_target = seg_list->s_target; x->x_targettime = seg_list->s_targettime; x->x_list = seg_list->s_next; t_freebytes(seg_list, sizeof(*seg_list)); seg_list = x->x_list; goto checknext_tt; } } if(x->x_targettime <= timenext) { d_val = x->x_target; inc = x->x_inc = 0; x->x_targettime = 1e20; } f_val = iem_dp_cast_to_float(d_val); *out_residual++ = iem_dp_calc_residual(d_val, f_val); *out_float_cast++ = f_val; d_val += inc; timenow = timenext; } x->x_value = d_val; return (w+5); } static void vline_tilde_tilde_stop(t_vline_tilde_tilde *x) { t_vseg_tt *s1, *s2; for (s1 = x->x_list; s1; s1 = s2) s2 = s1->s_next, t_freebytes(s1, sizeof(*s1)); x->x_list = 0; x->x_inc = 0; x->x_inlet2_fine_target = x->x_inlet3_coarse_ramp_duration = 0; x->x_inlet4_fine_ramp_duration = x->x_inlet5_coarse_delay = x->x_inlet6_fine_delay = 0; x->x_target = x->x_value; x->x_targettime = 1e20; } static void vline_tilde_tilde_float(t_vline_tilde_tilde *x, t_float inlet1_coarse_target) /* coarse target value */ { double timenow = clock_gettimesince(x->x_referencetime); double inlet12_target = iem_dp_calc_sum(inlet1_coarse_target, x->x_inlet2_fine_target); double inlet34_ramp_duration = iem_dp_calc_sum(x->x_inlet3_coarse_ramp_duration, x->x_inlet4_fine_ramp_duration); double inlet56_delay = iem_dp_calc_sum(x->x_inlet5_coarse_delay, x->x_inlet6_fine_delay); double starttime = timenow + inlet56_delay; t_vseg_tt *s1, *s2, *deletefrom = 0, *snew; if(inlet34_ramp_duration < 0) inlet34_ramp_duration = 0; /* if (PD_BIGORSMALL(inlet12_target)) inlet12_target = 0; */ /* negative delay input means stop and jump immediately to new value */ if (inlet56_delay < 0) { x->x_value = inlet12_target; vline_tilde_tilde_stop(x); return; } snew = (t_vseg_tt *)t_getbytes(sizeof(*snew)); /* check if we supplant the first item in the list. We supplant an item by having an earlier starttime, or an equal starttime unless the equal one was instantaneous and the new one isn't (in which case we'll do a jump-and-slide starting at that time.) */ if (!x->x_list || x->x_list->s_starttime > starttime || (x->x_list->s_starttime == starttime && (x->x_list->s_targettime > x->x_list->s_starttime || inlet34_ramp_duration <= 0))) { deletefrom = x->x_list; x->x_list = snew; } else { for (s1 = x->x_list; s2 = s1->s_next; s1 = s2) { if (s2->s_starttime > starttime || (s2->s_starttime == starttime && (s2->s_targettime > s2->s_starttime || inlet34_ramp_duration <= 0))) { deletefrom = s2; s1->s_next = snew; goto vl_didit_tt; } } s1->s_next = snew; deletefrom = 0; vl_didit_tt: ; } while (deletefrom) { s1 = deletefrom->s_next; t_freebytes(deletefrom, sizeof(*deletefrom)); deletefrom = s1; } snew->s_next = 0; snew->s_target = inlet12_target; snew->s_starttime = starttime; snew->s_targettime = starttime + inlet34_ramp_duration; x->x_inlet3_coarse_ramp_duration = x->x_inlet4_fine_ramp_duration = 0; x->x_inlet5_coarse_delay = x->x_inlet6_fine_delay = 0; } static void vline_tilde_tilde_dsp(t_vline_tilde_tilde *x, t_signal **sp) { dsp_add(vline_tilde_tilde_perform, 4, x, sp[0]->s_vec, sp[1]->s_vec, sp[0]->s_n); x->x_samppermsec = ((double)(sp[0]->s_sr)) / 1000.0; x->x_msecpersamp = ((double)1000.0) / sp[0]->s_sr; } static void *vline_tilde_tilde_new(t_floatarg init_val) { t_vline_tilde_tilde *x = (t_vline_tilde_tilde *)pd_new(vline_tilde_tilde_class); outlet_new(&x->x_obj, gensym("signal")); outlet_new(&x->x_obj, gensym("signal")); floatinlet_new(&x->x_obj, &x->x_inlet2_fine_target); floatinlet_new(&x->x_obj, &x->x_inlet3_coarse_ramp_duration); floatinlet_new(&x->x_obj, &x->x_inlet4_fine_ramp_duration); floatinlet_new(&x->x_obj, &x->x_inlet5_coarse_delay); floatinlet_new(&x->x_obj, &x->x_inlet6_fine_delay); x->x_inlet2_fine_target = x->x_inlet3_coarse_ramp_duration = 0; x->x_inlet4_fine_ramp_duration = x->x_inlet5_coarse_delay = x->x_inlet6_fine_delay = 0; x->x_value = x->x_inc = 0; x->x_referencetime = clock_getlogicaltime(); x->x_list = 0; x->x_samppermsec = 0; x->x_targettime = 1e20; return (x); } void vline_tilde_tilde_setup(void) { vline_tilde_tilde_class = class_new(gensym("vline~~"), (t_newmethod)vline_tilde_tilde_new, (t_method)vline_tilde_tilde_stop, sizeof(t_vline_tilde_tilde), 0, 0); class_addfloat(vline_tilde_tilde_class, (t_method)vline_tilde_tilde_float); class_addmethod(vline_tilde_tilde_class, (t_method)vline_tilde_tilde_dsp, gensym("dsp"), 0); class_addmethod(vline_tilde_tilde_class, (t_method)vline_tilde_tilde_stop, gensym("stop"), 0); } iem_utils-v0.0.20180206/iem_dp/src/max~~.c0000644000175000017500000002121512630366345020246 0ustar zmoelnigzmoelnig/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_dp written by IOhannes m zmoelnig, Thomas Musil, Copyright (c) IEM KUG Graz Austria 1999 - 2007 */ /* double precision library */ #include "m_pd.h" #include "iemlib.h" #include "iem_dp.h" /* -------------------------- max~~ ------------------------------ */ /* based on miller's max~ which is part of pd */ static t_class *max_tilde_tilde_class, *scalarmax_tilde_tilde_class; typedef struct _max_tilde_tilde { t_object x_obj; t_float x_f; t_sample *x_in1_coarse; t_sample *x_in1_fine; t_sample *x_in2_coarse; t_sample *x_in2_fine; t_sample *x_out_coarse; t_sample *x_out_fine; } t_max_tilde_tilde; typedef struct _scalarmax_tilde_tilde { t_object x_obj; t_float x_f; t_sample *x_in1_coarse; t_sample *x_in1_fine; t_sample *x_out_coarse; t_sample *x_out_fine; t_sample x_in2_coarse; t_sample x_in2_fine; } t_scalarmax_tilde_tilde; static void *max_tilde_tilde_new(t_symbol *s, int argc, t_atom *argv) { if(((argc==1)&&(argv->a_type == A_FLOAT))||(argc>=2)&&(argv->a_type == A_FLOAT)&&((argv+1)->a_type == A_FLOAT)) { t_scalarmax_tilde_tilde *x = (t_scalarmax_tilde_tilde *)pd_new(scalarmax_tilde_tilde_class); inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_signal, &s_signal); floatinlet_new(&x->x_obj, &x->x_in2_coarse); floatinlet_new(&x->x_obj, &x->x_in2_fine); x->x_in2_coarse = atom_getfloatarg(0, argc, argv); if(argc>=2) x->x_in2_fine = atom_getfloatarg(1, argc, argv); else x->x_in2_fine = 0; outlet_new(&x->x_obj, &s_signal); outlet_new(&x->x_obj, &s_signal); x->x_f = 0; return (x); } else /* either no arguments or symbols */ { t_max_tilde_tilde *x = (t_max_tilde_tilde *)pd_new(max_tilde_tilde_class); inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_signal, &s_signal); inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_signal, &s_signal); inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_signal, &s_signal); outlet_new(&x->x_obj, &s_signal); outlet_new(&x->x_obj, &s_signal); x->x_f = 0; return (x); } } static t_int *max_tilde_tilde_perform(t_int *w) { t_max_tilde_tilde *x = (t_max_tilde_tilde *)(w[1]); int n = (int)(w[2]); t_sample *in1c = x->x_in1_coarse; t_sample *in1f = x->x_in1_fine; t_sample *in2c = x->x_in2_coarse; t_sample *in2f = x->x_in2_fine; t_sample *outc = x->x_out_coarse; t_sample *outf = x->x_out_fine; while(n--) { t_sample i1c = *in1c++; t_sample i1f = *in1f++; t_sample i2c = *in2c++; t_sample i2f = *in2f++; double dleft = iem_dp_calc_sum(i1c, i1f); double dright = iem_dp_calc_sum(i2c, i2f); if(dleft > dright) { *outf++ = i1f; *outc++ = i1c; } else { *outf++ = i2f; *outc++ = i2c; } } return(w+3); } static t_int *max_tilde_tilde_perf8(t_int *w) { t_max_tilde_tilde *x = (t_max_tilde_tilde *)(w[1]); int n = (int)(w[2]); t_sample *in1c = x->x_in1_coarse; t_sample *in1f = x->x_in1_fine; t_sample *in2c = x->x_in2_coarse; t_sample *in2f = x->x_in2_fine; t_sample *outc = x->x_out_coarse; t_sample *outf = x->x_out_fine; for(; n; n -= 8, in1c += 8, in1f += 8, in2c += 8, in2f += 8, outc += 8, outf += 8) { double d; t_float f; d = iem_dp_calc_sum(in1c[0], in1f[0]) + iem_dp_calc_sum(in2c[0], in2f[0]); f = iem_dp_cast_to_float(d); outf[0] = iem_dp_calc_residual(d, f); outc[0] = f; d = iem_dp_calc_sum(in1c[1], in1f[1]) + iem_dp_calc_sum(in2c[1], in2f[1]); f = iem_dp_cast_to_float(d); outf[1] = iem_dp_calc_residual(d, f); outc[1] = f; d = iem_dp_calc_sum(in1c[2], in1f[2]) + iem_dp_calc_sum(in2c[2], in2f[2]); f = iem_dp_cast_to_float(d); outf[2] = iem_dp_calc_residual(d, f); outc[2] = f; d = iem_dp_calc_sum(in1c[3], in1f[3]) + iem_dp_calc_sum(in2c[3], in2f[3]); f = iem_dp_cast_to_float(d); outf[3] = iem_dp_calc_residual(d, f); outc[3] = f; d = iem_dp_calc_sum(in1c[4], in1f[4]) + iem_dp_calc_sum(in2c[4], in2f[4]); f = iem_dp_cast_to_float(d); outf[4] = iem_dp_calc_residual(d, f); outc[4] = f; d = iem_dp_calc_sum(in1c[5], in1f[5]) + iem_dp_calc_sum(in2c[5], in2f[5]); f = iem_dp_cast_to_float(d); outf[5] = iem_dp_calc_residual(d, f); outc[5] = f; d = iem_dp_calc_sum(in1c[6], in1f[6]) + iem_dp_calc_sum(in2c[6], in2f[6]); f = iem_dp_cast_to_float(d); outf[6] = iem_dp_calc_residual(d, f); outc[6] = f; d = iem_dp_calc_sum(in1c[7], in1f[7]) + iem_dp_calc_sum(in2c[7], in2f[7]); f = iem_dp_cast_to_float(d); outf[7] = iem_dp_calc_residual(d, f); outc[7] = f; } return(w+3); } static t_int *scalarmax_tilde_tilde_perform(t_int *w) { t_scalarmax_tilde_tilde *x = (t_scalarmax_tilde_tilde *)(w[1]); int n = (int)(w[2]); t_sample *in1c = x->x_in1_coarse; t_sample *in1f = x->x_in1_fine; t_sample i2c = x->x_in2_coarse; t_sample i2f = x->x_in2_fine; t_sample *outc = x->x_out_coarse; t_sample *outf = x->x_out_fine; double dright = iem_dp_calc_sum(i2c, i2f); while(n--) { t_sample i1c = *in1c++; t_sample i1f = *in1f++; double dleft = iem_dp_calc_sum(i1c, i1f); if(dleft > dright) { *outf++ = i1f; *outc++ = i1c; } else { *outf++ = i2f; *outc++ = i2c; } } return(w+3); } static t_int *scalarmax_tilde_tilde_perf8(t_int *w) { t_scalarmax_tilde_tilde *x = (t_scalarmax_tilde_tilde *)(w[1]); int n = (int)(w[2]); t_sample *inc = x->x_in1_coarse; t_sample *inf = x->x_in1_fine; t_sample *outc = x->x_out_coarse; t_sample *outf = x->x_out_fine; double g=iem_dp_calc_sum(x->x_in2_coarse, x->x_in2_fine); for(; n; n -= 8, inc += 8, inf += 8, outc += 8, outf += 8) { double d; t_float f; d = iem_dp_calc_sum(inc[0], inf[0]) + g; f = iem_dp_cast_to_float(d); outf[0] = iem_dp_calc_residual(d, f); outc[0] = f; d = iem_dp_calc_sum(inc[1], inf[1]) + g; f = iem_dp_cast_to_float(d); outf[1] = iem_dp_calc_residual(d, f); outc[1] = f; d = iem_dp_calc_sum(inc[2], inf[2]) + g; f = iem_dp_cast_to_float(d); outf[2] = iem_dp_calc_residual(d, f); outc[2] = f; d = iem_dp_calc_sum(inc[3], inf[3]) + g; f = iem_dp_cast_to_float(d); outf[3] = iem_dp_calc_residual(d, f); outc[3] = f; d = iem_dp_calc_sum(inc[4], inf[4]) + g; f = iem_dp_cast_to_float(d); outf[4] = iem_dp_calc_residual(d, f); outc[4] = f; d = iem_dp_calc_sum(inc[5], inf[5]) + g; f = iem_dp_cast_to_float(d); outf[5] = iem_dp_calc_residual(d, f); outc[5] = f; d = iem_dp_calc_sum(inc[6], inf[6]) + g; f = iem_dp_cast_to_float(d); outf[6] = iem_dp_calc_residual(d, f); outc[6] = f; d = iem_dp_calc_sum(inc[7], inf[7]) + g; f = iem_dp_cast_to_float(d); outf[7] = iem_dp_calc_residual(d, f); outc[7] = f; } return(w+3); } static void max_tilde_tilde_dsp(t_max_tilde_tilde *x, t_signal **sp) { x->x_in1_coarse = sp[0]->s_vec; x->x_in1_fine = sp[1]->s_vec; x->x_in2_coarse = sp[2]->s_vec; x->x_in2_fine = sp[3]->s_vec; x->x_out_coarse = sp[4]->s_vec; x->x_out_fine = sp[5]->s_vec; if(sp[0]->s_n&7) dsp_add(max_tilde_tilde_perform, 2, x, sp[0]->s_n); else dsp_add(max_tilde_tilde_perform, 2, x, sp[0]->s_n); //dsp_add(max_tilde_tilde_perf8, 2, x, sp[0]->s_n); } static void scalarmax_tilde_tilde_dsp(t_scalarmax_tilde_tilde *x, t_signal **sp) { x->x_in1_coarse = sp[0]->s_vec; x->x_in1_fine = sp[1]->s_vec; x->x_out_coarse = sp[2]->s_vec; x->x_out_fine = sp[3]->s_vec; if(sp[0]->s_n&7) dsp_add(scalarmax_tilde_tilde_perform, 2, sp[0]->s_n); else dsp_add(scalarmax_tilde_tilde_perform, 2, x, sp[0]->s_n); //dsp_add(scalarmax_tilde_tilde_perf8, 2, x, sp[0]->s_n); } void max_tilde_tilde_setup(void) { max_tilde_tilde_class = class_new(gensym("max~~"), (t_newmethod)max_tilde_tilde_new, 0, sizeof(t_max_tilde_tilde), 0, A_GIMME, 0); CLASS_MAINSIGNALIN(max_tilde_tilde_class, t_max_tilde_tilde, x_f); class_addmethod(max_tilde_tilde_class, (t_method)max_tilde_tilde_dsp, gensym("dsp"), 0); scalarmax_tilde_tilde_class = class_new(gensym("max~~"), 0, 0, sizeof(t_scalarmax_tilde_tilde), 0, 0); CLASS_MAINSIGNALIN(scalarmax_tilde_tilde_class, t_scalarmax_tilde_tilde, x_f); class_addmethod(scalarmax_tilde_tilde_class, (t_method)scalarmax_tilde_tilde_dsp, gensym("dsp"), 0); } iem_utils-v0.0.20180206/iem_dp/src/VC7/0000755000175000017500000000000012630366345017317 5ustar zmoelnigzmoelnigiem_utils-v0.0.20180206/iem_dp/src/VC7/iem_dp.vcproj0000644000175000017500000000241512630366345022003 0ustar zmoelnigzmoelnig iem_utils-v0.0.20180206/iem_dp/src/VC7/makefile_vc7proj0000644000175000017500000000245612630366345022500 0ustar zmoelnigzmoelnigTARGET = iem_dp all: ..\$(TARGET).dll VIS_CPP_PATH = "C:\Programme\Microsoft Visual Studio .NET 2003\Vc7" VIS_SDK_PATH = "C:\Programme\Microsoft Visual Studio .NET 2003\Vc7\PlatformSDK" PD_INST_PATH = "C:\Programme\pd-0.42-5" PD_WIN_INCLUDE_PATH = /I. /I$(PD_INST_PATH)\src /I$(VIS_CPP_PATH)\include PD_WIN_C_FLAGS = /nologo /W3 /WX /DMSW /DNT /DPD /DWIN32 /DWINDOWS /Ox -D_CRT_SECURE_NO_WARNINGS PD_WIN_L_FLAGS = /nologo PD_WIN_LIB = /NODEFAULTLIB:libcmt /NODEFAULTLIB:oldnames /NODEFAULTLIB:kernel32 \ $(VIS_CPP_PATH)\lib\libcmt.lib \ $(VIS_CPP_PATH)\lib\oldnames.lib \ $(VIS_SDK_PATH)\lib\kernel32.lib \ $(PD_INST_PATH)\bin\pd.lib SRC = symtodp.c \ dptosym.c \ dptohex.c \ ftohex.c \ vline~~.c \ samphold~~.c \ wrap~~.c \ phasor~~.c \ print~~.c \ add__.c \ sub__.c \ mul__.c \ div__.c \ add~~.c \ sub~~.c \ mul~~.c \ div~~.c \ tabwrite_dp.c \ tabread_dp.c \ tabread4_dp.c \ tabwrite~~.c \ tabread~~.c \ tabread4~~.c \ max__.c \ min__.c \ max~~.c \ min~~.c \ random__.c \ delay~~.c \ $(TARGET).c OBJ = $(SRC:.c=.obj) .c.obj: cl $(PD_WIN_C_FLAGS) $(PD_WIN_INCLUDE_PATH) /c $*.c ..\$(TARGET).dll: $(OBJ) link $(PD_WIN_L_FLAGS) /dll /export:$(TARGET)_setup \ /out:..\$(TARGET).dll $(OBJ) $(PD_WIN_LIB) clean: del *.obj iem_utils-v0.0.20180206/iem_dp/src/iem_dp.h0000644000175000017500000000247212630366345020333 0ustar zmoelnigzmoelnig/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_dp written by IOhannes m zmoelnig, Thomas Musil, Copyright (c) IEM KUG Graz Austria 1999 - 2013 */ /* double precision library */ #ifndef __IEM_DP_H__ #define __IEM_DP_H__ /* #ifdef __i386__ */ /* more stringent test: anything not between 1e-19 and 1e19 in absolute val */ /* #define PD_BIGORSMALL(f) ((((*(unsigned int*)&(f))&0x60000000)==0) || \ (((*(unsigned int*)&(f))&0x60000000)==0x60000000)) #else #define PD_BIGORSMALL(f) 0 #endif #endif */ t_float iem_dp_cast_to_float(double d); double iem_dp_cast_to_double(t_float f); t_float iem_dp_calc_residual(double d, t_float f); double iem_dp_calc_sum(t_float f, t_float r); extern int ugen_getsortno(void); #endif /* #ifdef Z_USE_WORD_ARRAYS #define zarray_t t_word #define zarray_getarray garray_getfloatwords #define zarray_getfloat(pointer, index) (pointer[index].w_float) #define zarray_setfloat(pointer, index, value) (pointer[index].w_float = value) #else #define zarray_t t_float #define zarray_getarray garray_getfloatarray #define zarray_getfloat(pointer, index) (pointer[index]) #define zarray_setfloat(pointer, index, value) (pointer[index] = value) #endif*/ iem_utils-v0.0.20180206/iem_dp/src/makefile_linux0000644000175000017500000000220312630366345021634 0ustar zmoelnigzmoelnigcurrent: all .SUFFIXES: .pd_linux PD_INCLUDE=/usr/local/src/pd/src INCLUDE = -I. -I$(PD_INCLUDE) LDFLAGS = -export-dynamic -shared LIB = -ldl -lm -lpthread #select either the DBG and OPT compiler flags below: CFLAGS = -DPD -DUNIX -W -Werror -Wno-unused \ -Wno-parentheses -Wno-switch -O6 -funroll-loops -fomit-frame-pointer -fno-strict-aliasing \ -DDL_OPEN -fPIC SYSTEM = $(shell uname -m) # the sources SRC = symtodp.c \ dptosym.c \ dptohex.c \ ftohex.c \ vline~~.c \ samphold~~.c \ wrap~~.c \ phasor~~.c \ print~~.c \ add__.c \ sub__.c \ mul__.c \ div__.c \ add~~.c \ sub~~.c \ mul~~.c \ div~~.c \ tabwrite_dp.c \ tabread_dp.c \ tabread4_dp.c \ tabwrite~~.c \ tabread~~.c \ tabread4~~.c \ max__.c \ min__.c \ max~~.c \ min~~.c \ random__.c \ delay~~.c \ iem_dp.c TARGET = iem_dp.pd_linux OBJ = $(SRC:.c=.o) # # ------------------ targets ------------------------------------ # clean: rm ../$(TARGET) rm *.o all: $(OBJ) @echo :: $(OBJ) $(LD) $(LDFLAGS) -o $(TARGET) *.o $(LIB) strip --strip-unneeded $(TARGET) mv $(TARGET) .. $(OBJ) : %.o : %.c $(CC) $(CFLAGS) $(INCLUDE) -c -o $*.o $*.c iem_utils-v0.0.20180206/iem_dp/src/min__.c0000644000175000017500000000443212630366345020150 0ustar zmoelnigzmoelnig/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_dp written by IOhannes m zmoelnig, Thomas Musil, Copyright (c) IEM KUG Graz Austria 1999 - 2007 */ /* double precision library */ #include "m_pd.h" #include "iemlib.h" #include "iem_dp.h" /* ------------------------ min_dp ---------------------------- */ /* based on miller's min, which is part of pd, only with double precision */ static t_class *min_dp_class; typedef struct _min_dp { t_object x_obj; t_float x_coarse_left; t_float x_fine_left; t_float x_coarse_right; t_float x_fine_right; t_outlet *x_out_coarse; t_outlet *x_out_fine; } t_min_dp; static void min_dp_bang(t_min_dp *x) { double dleft, dright; dleft = iem_dp_calc_sum(x->x_coarse_left, x->x_fine_left); dright = iem_dp_calc_sum(x->x_coarse_right, x->x_fine_right); if(dleft < dright) { outlet_float(x->x_out_fine, x->x_fine_left); outlet_float(x->x_out_coarse, x->x_coarse_left); } else { outlet_float(x->x_out_fine, x->x_fine_right); outlet_float(x->x_out_coarse, x->x_coarse_right); } } static void min_dp_float(t_min_dp *x, t_floatarg f) { x->x_coarse_left = f; min_dp_bang(x); } static void *min_dp_new(t_symbol *s, int ac, t_atom *av) { t_min_dp *x = (t_min_dp *)pd_new(min_dp_class); floatinlet_new(&x->x_obj, &x->x_fine_left); floatinlet_new(&x->x_obj, &x->x_coarse_right); floatinlet_new(&x->x_obj, &x->x_fine_right); x->x_coarse_left = 0.0f; x->x_fine_left = 0.0f; if((ac > 0) && (IS_A_FLOAT(av, 0))) x->x_coarse_right = atom_getfloatarg(0, ac, av); else x->x_coarse_right = 0.0f; if((ac > 1) && (IS_A_FLOAT(av, 1))) x->x_fine_right = atom_getfloatarg(1, ac, av); else x->x_fine_right = 0.0f; x->x_out_coarse = outlet_new(&x->x_obj, &s_float); x->x_out_fine = outlet_new(&x->x_obj, &s_float); return (x); } void min_dp_setup(void) { min_dp_class = class_new(gensym("min__"), (t_newmethod)min_dp_new, 0, sizeof(t_min_dp), 0, A_GIMME, 0); class_addcreator((t_newmethod)min_dp_new, gensym("min''"), A_GIMME, 0); class_addbang(min_dp_class, min_dp_bang); class_addfloat(min_dp_class, min_dp_float); } iem_utils-v0.0.20180206/iem_dp/src/print~~.c0000644000175000017500000000553212630366345020621 0ustar zmoelnigzmoelnig/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_dp written by IOhannes m zmoelnig, Thomas Musil, Copyright (c) IEM KUG Graz Austria 1999 - 2007 */ /* double precision library */ #include "m_pd.h" #include "iemlib.h" #include "iem_dp.h" /* -------------------------- print~~ ------------------------------ */ /* based on miller's print~ which is part of pd */ static t_class *print_tilde_tilde_class; typedef struct _print_tilde_tilde { t_object x_obj; t_float x_f; t_symbol *x_sym; int x_count; } t_print_tilde_tilde; static void *print_tilde_tilde_new(t_symbol *s) { t_print_tilde_tilde *x = (t_print_tilde_tilde *)pd_new(print_tilde_tilde_class); inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_signal, &s_signal); x->x_sym = (s->s_name[0] ? s : gensym("print~~")); x->x_count = 0; x->x_f = 0; return(x); } static t_int *print_tilde_tilde_perform(t_int *w) { t_print_tilde_tilde *x = (t_print_tilde_tilde *)(w[1]); t_sample *inc = (t_sample *)(w[2]); t_sample *inf = (t_sample *)(w[3]); int n = (int)(w[4]); if(x->x_count) { post("%s:", x->x_sym->s_name); while(n >= 4) { post("%-20.14g %-20.14g %-20.14g %-20.14g", iem_dp_calc_sum(inc[0], inf[0]), iem_dp_calc_sum(inc[1], inf[1]), iem_dp_calc_sum(inc[2], inf[2]), iem_dp_calc_sum(inc[3], inf[3])); n -= 4; inc += 4; inf += 4; } if(n) { if(n == 3) { post("%-20.14g %-20.14g %-20.14g", iem_dp_calc_sum(inc[0], inf[0]), iem_dp_calc_sum(inc[1], inf[1]), iem_dp_calc_sum(inc[2], inf[2])); } else if(n == 2) { post("%-20.14g %-20.14g", iem_dp_calc_sum(inc[0], inf[0]), iem_dp_calc_sum(inc[1], inf[1])); } else if(n == 1) { post("%-20.14g", iem_dp_calc_sum(inc[0], inf[0])); } } x->x_count--; } return(w+5); } static void print_tilde_tilde_float(t_print_tilde_tilde *x, t_floatarg f) { if(f < 0) f = 0; x->x_count = f; } static void print_tilde_tilde_bang(t_print_tilde_tilde *x) { x->x_count = 1; } static void print_tilde_tilde_dsp(t_print_tilde_tilde *x, t_signal **sp) { dsp_add(print_tilde_tilde_perform, 4, x, sp[0]->s_vec, sp[1]->s_vec, sp[0]->s_n); } void print_tilde_tilde_setup(void) { print_tilde_tilde_class = class_new(gensym("print~~"), (t_newmethod)print_tilde_tilde_new, 0, sizeof(t_print_tilde_tilde), 0, A_DEFSYM, 0); CLASS_MAINSIGNALIN(print_tilde_tilde_class, t_print_tilde_tilde, x_f); class_addmethod(print_tilde_tilde_class, (t_method)print_tilde_tilde_dsp, gensym("dsp"), 0); class_addbang(print_tilde_tilde_class, print_tilde_tilde_bang); class_addfloat(print_tilde_tilde_class, print_tilde_tilde_float); } iem_utils-v0.0.20180206/iem_dp/src/min~~.c0000644000175000017500000002121512630366345020244 0ustar zmoelnigzmoelnig/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_dp written by IOhannes m zmoelnig, Thomas Musil, Copyright (c) IEM KUG Graz Austria 1999 - 2007 */ /* double precision library */ #include "m_pd.h" #include "iemlib.h" #include "iem_dp.h" /* -------------------------- min~~ ------------------------------ */ /* based on miller's min~ which is part of pd */ static t_class *min_tilde_tilde_class, *scalarmin_tilde_tilde_class; typedef struct _min_tilde_tilde { t_object x_obj; t_float x_f; t_sample *x_in1_coarse; t_sample *x_in1_fine; t_sample *x_in2_coarse; t_sample *x_in2_fine; t_sample *x_out_coarse; t_sample *x_out_fine; } t_min_tilde_tilde; typedef struct _scalarmin_tilde_tilde { t_object x_obj; t_float x_f; t_sample *x_in1_coarse; t_sample *x_in1_fine; t_sample *x_out_coarse; t_sample *x_out_fine; t_sample x_in2_coarse; t_sample x_in2_fine; } t_scalarmin_tilde_tilde; static void *min_tilde_tilde_new(t_symbol *s, int argc, t_atom *argv) { if(((argc==1)&&(argv->a_type == A_FLOAT))||(argc>=2)&&(argv->a_type == A_FLOAT)&&((argv+1)->a_type == A_FLOAT)) { t_scalarmin_tilde_tilde *x = (t_scalarmin_tilde_tilde *)pd_new(scalarmin_tilde_tilde_class); inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_signal, &s_signal); floatinlet_new(&x->x_obj, &x->x_in2_coarse); floatinlet_new(&x->x_obj, &x->x_in2_fine); x->x_in2_coarse = atom_getfloatarg(0, argc, argv); if(argc>=2) x->x_in2_fine = atom_getfloatarg(1, argc, argv); else x->x_in2_fine = 0; outlet_new(&x->x_obj, &s_signal); outlet_new(&x->x_obj, &s_signal); x->x_f = 0; return (x); } else /* either no arguments or symbols */ { t_min_tilde_tilde *x = (t_min_tilde_tilde *)pd_new(min_tilde_tilde_class); inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_signal, &s_signal); inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_signal, &s_signal); inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_signal, &s_signal); outlet_new(&x->x_obj, &s_signal); outlet_new(&x->x_obj, &s_signal); x->x_f = 0; return (x); } } static t_int *min_tilde_tilde_perform(t_int *w) { t_min_tilde_tilde *x = (t_min_tilde_tilde *)(w[1]); int n = (int)(w[2]); t_sample *in1c = x->x_in1_coarse; t_sample *in1f = x->x_in1_fine; t_sample *in2c = x->x_in2_coarse; t_sample *in2f = x->x_in2_fine; t_sample *outc = x->x_out_coarse; t_sample *outf = x->x_out_fine; while(n--) { t_sample i1c = *in1c++; t_sample i1f = *in1f++; t_sample i2c = *in2c++; t_sample i2f = *in2f++; double dleft = iem_dp_calc_sum(i1c, i1f); double dright = iem_dp_calc_sum(i2c, i2f); if(dleft < dright) { *outf++ = i1f; *outc++ = i1c; } else { *outf++ = i2f; *outc++ = i2c; } } return(w+3); } static t_int *min_tilde_tilde_perf8(t_int *w) { t_min_tilde_tilde *x = (t_min_tilde_tilde *)(w[1]); int n = (int)(w[2]); t_sample *in1c = x->x_in1_coarse; t_sample *in1f = x->x_in1_fine; t_sample *in2c = x->x_in2_coarse; t_sample *in2f = x->x_in2_fine; t_sample *outc = x->x_out_coarse; t_sample *outf = x->x_out_fine; for(; n; n -= 8, in1c += 8, in1f += 8, in2c += 8, in2f += 8, outc += 8, outf += 8) { double d; t_float f; d = iem_dp_calc_sum(in1c[0], in1f[0]) + iem_dp_calc_sum(in2c[0], in2f[0]); f = iem_dp_cast_to_float(d); outf[0] = iem_dp_calc_residual(d, f); outc[0] = f; d = iem_dp_calc_sum(in1c[1], in1f[1]) + iem_dp_calc_sum(in2c[1], in2f[1]); f = iem_dp_cast_to_float(d); outf[1] = iem_dp_calc_residual(d, f); outc[1] = f; d = iem_dp_calc_sum(in1c[2], in1f[2]) + iem_dp_calc_sum(in2c[2], in2f[2]); f = iem_dp_cast_to_float(d); outf[2] = iem_dp_calc_residual(d, f); outc[2] = f; d = iem_dp_calc_sum(in1c[3], in1f[3]) + iem_dp_calc_sum(in2c[3], in2f[3]); f = iem_dp_cast_to_float(d); outf[3] = iem_dp_calc_residual(d, f); outc[3] = f; d = iem_dp_calc_sum(in1c[4], in1f[4]) + iem_dp_calc_sum(in2c[4], in2f[4]); f = iem_dp_cast_to_float(d); outf[4] = iem_dp_calc_residual(d, f); outc[4] = f; d = iem_dp_calc_sum(in1c[5], in1f[5]) + iem_dp_calc_sum(in2c[5], in2f[5]); f = iem_dp_cast_to_float(d); outf[5] = iem_dp_calc_residual(d, f); outc[5] = f; d = iem_dp_calc_sum(in1c[6], in1f[6]) + iem_dp_calc_sum(in2c[6], in2f[6]); f = iem_dp_cast_to_float(d); outf[6] = iem_dp_calc_residual(d, f); outc[6] = f; d = iem_dp_calc_sum(in1c[7], in1f[7]) + iem_dp_calc_sum(in2c[7], in2f[7]); f = iem_dp_cast_to_float(d); outf[7] = iem_dp_calc_residual(d, f); outc[7] = f; } return(w+3); } static t_int *scalarmin_tilde_tilde_perform(t_int *w) { t_scalarmin_tilde_tilde *x = (t_scalarmin_tilde_tilde *)(w[1]); int n = (int)(w[2]); t_sample *in1c = x->x_in1_coarse; t_sample *in1f = x->x_in1_fine; t_sample i2c = x->x_in2_coarse; t_sample i2f = x->x_in2_fine; t_sample *outc = x->x_out_coarse; t_sample *outf = x->x_out_fine; double dright = iem_dp_calc_sum(i2c, i2f); while(n--) { t_sample i1c = *in1c++; t_sample i1f = *in1f++; double dleft = iem_dp_calc_sum(i1c, i1f); if(dleft < dright) { *outf++ = i1f; *outc++ = i1c; } else { *outf++ = i2f; *outc++ = i2c; } } return(w+3); } static t_int *scalarmin_tilde_tilde_perf8(t_int *w) { t_scalarmin_tilde_tilde *x = (t_scalarmin_tilde_tilde *)(w[1]); int n = (int)(w[2]); t_sample *inc = x->x_in1_coarse; t_sample *inf = x->x_in1_fine; t_sample *outc = x->x_out_coarse; t_sample *outf = x->x_out_fine; double g=iem_dp_calc_sum(x->x_in2_coarse, x->x_in2_fine); for(; n; n -= 8, inc += 8, inf += 8, outc += 8, outf += 8) { double d; t_float f; d = iem_dp_calc_sum(inc[0], inf[0]) + g; f = iem_dp_cast_to_float(d); outf[0] = iem_dp_calc_residual(d, f); outc[0] = f; d = iem_dp_calc_sum(inc[1], inf[1]) + g; f = iem_dp_cast_to_float(d); outf[1] = iem_dp_calc_residual(d, f); outc[1] = f; d = iem_dp_calc_sum(inc[2], inf[2]) + g; f = iem_dp_cast_to_float(d); outf[2] = iem_dp_calc_residual(d, f); outc[2] = f; d = iem_dp_calc_sum(inc[3], inf[3]) + g; f = iem_dp_cast_to_float(d); outf[3] = iem_dp_calc_residual(d, f); outc[3] = f; d = iem_dp_calc_sum(inc[4], inf[4]) + g; f = iem_dp_cast_to_float(d); outf[4] = iem_dp_calc_residual(d, f); outc[4] = f; d = iem_dp_calc_sum(inc[5], inf[5]) + g; f = iem_dp_cast_to_float(d); outf[5] = iem_dp_calc_residual(d, f); outc[5] = f; d = iem_dp_calc_sum(inc[6], inf[6]) + g; f = iem_dp_cast_to_float(d); outf[6] = iem_dp_calc_residual(d, f); outc[6] = f; d = iem_dp_calc_sum(inc[7], inf[7]) + g; f = iem_dp_cast_to_float(d); outf[7] = iem_dp_calc_residual(d, f); outc[7] = f; } return(w+3); } static void min_tilde_tilde_dsp(t_min_tilde_tilde *x, t_signal **sp) { x->x_in1_coarse = sp[0]->s_vec; x->x_in1_fine = sp[1]->s_vec; x->x_in2_coarse = sp[2]->s_vec; x->x_in2_fine = sp[3]->s_vec; x->x_out_coarse = sp[4]->s_vec; x->x_out_fine = sp[5]->s_vec; if(sp[0]->s_n&7) dsp_add(min_tilde_tilde_perform, 2, x, sp[0]->s_n); else dsp_add(min_tilde_tilde_perform, 2, x, sp[0]->s_n); //dsp_add(min_tilde_tilde_perf8, 2, x, sp[0]->s_n); } static void scalarmin_tilde_tilde_dsp(t_scalarmin_tilde_tilde *x, t_signal **sp) { x->x_in1_coarse = sp[0]->s_vec; x->x_in1_fine = sp[1]->s_vec; x->x_out_coarse = sp[2]->s_vec; x->x_out_fine = sp[3]->s_vec; if(sp[0]->s_n&7) dsp_add(scalarmin_tilde_tilde_perform, 2, sp[0]->s_n); else dsp_add(scalarmin_tilde_tilde_perform, 2, x, sp[0]->s_n); //dsp_add(scalarmin_tilde_tilde_perf8, 2, x, sp[0]->s_n); } void min_tilde_tilde_setup(void) { min_tilde_tilde_class = class_new(gensym("min~~"), (t_newmethod)min_tilde_tilde_new, 0, sizeof(t_min_tilde_tilde), 0, A_GIMME, 0); CLASS_MAINSIGNALIN(min_tilde_tilde_class, t_min_tilde_tilde, x_f); class_addmethod(min_tilde_tilde_class, (t_method)min_tilde_tilde_dsp, gensym("dsp"), 0); scalarmin_tilde_tilde_class = class_new(gensym("min~~"), 0, 0, sizeof(t_scalarmin_tilde_tilde), 0, 0); CLASS_MAINSIGNALIN(scalarmin_tilde_tilde_class, t_scalarmin_tilde_tilde, x_f); class_addmethod(scalarmin_tilde_tilde_class, (t_method)scalarmin_tilde_tilde_dsp, gensym("dsp"), 0); } iem_utils-v0.0.20180206/iem_dp/src/VC6/0000755000175000017500000000000012630366345017316 5ustar zmoelnigzmoelnigiem_utils-v0.0.20180206/iem_dp/src/VC6/iem_dp.dsp0000644000175000017500000000472412630366345021272 0ustar zmoelnigzmoelnig# Microsoft Developer Studio Project File - Name="iem_dp" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** NICHT BEARBEITEN ** # TARGTYPE "Win32 (x86) External Target" 0x0106 CFG=iem_dp - Win32 Debug !MESSAGE Dies ist kein gültiges Makefile. Zum Erstellen dieses Projekts mit NMAKE !MESSAGE verwenden Sie den Befehl "Makefile exportieren" und führen Sie den Befehl !MESSAGE !MESSAGE NMAKE /f "iem_dp.mak". !MESSAGE !MESSAGE Sie können beim Ausführen von NMAKE eine Konfiguration angeben !MESSAGE durch Definieren des Makros CFG in der Befehlszeile. Zum Beispiel: !MESSAGE !MESSAGE NMAKE /f "iem_dp.mak" CFG="iem_dp - Win32 Debug" !MESSAGE !MESSAGE Für die Konfiguration stehen zur Auswahl: !MESSAGE !MESSAGE "iem_dp - Win32 Release" (basierend auf "Win32 (x86) External Target") !MESSAGE "iem_dp - Win32 Debug" (basierend auf "Win32 (x86) External Target") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" !IF "$(CFG)" == "iem_dp - Win32 Release" # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "Release" # PROP BASE Intermediate_Dir "Release" # PROP BASE Cmd_Line "NMAKE /f makefile_win" # PROP BASE Rebuild_Opt "/a" # PROP BASE Target_File "makefile_win.exe" # PROP BASE Bsc_Name "makefile_win.bsc" # PROP BASE Target_Dir "" # PROP Use_Debug_Libraries 0 # PROP Output_Dir "Release" # PROP Intermediate_Dir "Release" # PROP Cmd_Line "NMAKE /f makefile_win" # PROP Rebuild_Opt "/a" # PROP Target_File "iem_dp.exe" # PROP Bsc_Name "iem_dp.bsc" # PROP Target_Dir "" !ELSEIF "$(CFG)" == "iem_dp - Win32 Debug" # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "Debug" # PROP BASE Intermediate_Dir "Debug" # PROP BASE Cmd_Line "NMAKE /f makefile_win" # PROP BASE Rebuild_Opt "/a" # PROP BASE Target_File "makefile_win.exe" # PROP BASE Bsc_Name "makefile_win.bsc" # PROP BASE Target_Dir "" # PROP Use_Debug_Libraries 1 # PROP Output_Dir "Debug" # PROP Intermediate_Dir "Debug" # PROP Cmd_Line "NMAKE /f makefile_win" # PROP Rebuild_Opt "/a" # PROP Target_File "iem_dp.exe" # PROP Bsc_Name "iem_dp.bsc" # PROP Target_Dir "" !ENDIF # Begin Target # Name "iem_dp - Win32 Release" # Name "iem_dp - Win32 Debug" !IF "$(CFG)" == "iem_dp - Win32 Release" !ELSEIF "$(CFG)" == "iem_dp - Win32 Debug" !ENDIF # Begin Source File SOURCE=.\makefile_win # End Source File # End Target # End Project iem_utils-v0.0.20180206/iem_dp/src/VC6/iem_dp.dsw0000644000175000017500000000106312630366345021272 0ustar zmoelnigzmoelnigMicrosoft Developer Studio Workspace File, Format Version 6.00 # WARNUNG: DIESE ARBEITSBEREICHSDATEI DARF NICHT BEARBEITET ODER GELÖSCHT WERDEN! ############################################################################### Project: "iem_dp"=.\iem_dp.dsp - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ }}} ############################################################################### Global: Package=<5> {{{ }}} Package=<3> {{{ }}} ############################################################################### iem_utils-v0.0.20180206/iem_dp/src/VC6/makefile_win0000644000175000017500000000244312630366345021676 0ustar zmoelnigzmoelnigTARGET = iem_dp all: ..\$(TARGET).dll VIS_CPP_PATH = "C:\Programme\Microsoft Visual Studio\Vc98" PD_INST_PATH = "C:\Programme\pd" PD_WIN_INCLUDE_PATH = /I. /I$(PD_INST_PATH)\src /I$(VIS_CPP_PATH)\include PD_WIN_C_FLAGS = /nologo /W3 /WX /DMSW /DNT /DPD /DWIN32 /DWINDOWS /Ox -DPA_LITTLE_ENDIAN PD_WIN_L_FLAGS = /nologo PD_WIN_LIB = /NODEFAULTLIB:libc /NODEFAULTLIB:oldnames /NODEFAULTLIB:kernel /NODEFAULTLIB:uuid \ $(VIS_CPP_PATH)\lib\libc.lib \ $(VIS_CPP_PATH)\lib\oldnames.lib \ $(VIS_CPP_PATH)\lib\kernel32.lib \ $(VIS_CPP_PATH)\lib\wsock32.lib \ $(VIS_CPP_PATH)\lib\winmm.lib \ $(PD_INST_PATH)\bin\pd.lib SRC = symtodp.c \ dptosym.c \ dptohex.c \ ftohex.c \ vline~~.c \ samphold~~.c \ wrap~~.c \ phasor~~.c \ print~~.c \ add__.c \ sub__.c \ mul__.c \ div__.c \ add~~.c \ sub~~.c \ mul~~.c \ div~~.c \ tabwrite_dp.c \ tabread_dp.c \ tabread4_dp.c \ tabwrite~~.c \ tabread~~.c \ tabread4~~.c \ max__.c \ min__.c \ max~~.c \ min~~.c \ random__.c \ delay~~.c \ $(TARGET).c OBJ = $(SRC:.c=.obj) .c.obj: cl $(PD_WIN_C_FLAGS) $(PD_WIN_INCLUDE_PATH) /c $*.c ..\$(TARGET).dll: $(OBJ) link $(PD_WIN_L_FLAGS) /dll /export:$(TARGET)_setup \ /out:..\$(TARGET).dll $(OBJ) $(PD_WIN_LIB) clean: del *.obj iem_utils-v0.0.20180206/iem_dp/src/iemlib.h0000644000175000017500000000730012630366345020332 0ustar zmoelnigzmoelnig/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iemlib written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2011 */ #ifndef __IEMLIB_H__ #define __IEMLIB_H__ #define IS_A_POINTER(atom,index) ((atom+index)->a_type == A_POINTER) #define IS_A_FLOAT(atom,index) ((atom+index)->a_type == A_FLOAT) #define IS_A_SYMBOL(atom,index) ((atom+index)->a_type == A_SYMBOL) #define IS_A_DOLLAR(atom,index) ((atom+index)->a_type == A_DOLLAR) #define IS_A_DOLLSYM(atom,index) ((atom+index)->a_type == A_DOLLSYM) #define IS_A_SEMI(atom,index) ((atom+index)->a_type == A_SEMI) #define IS_A_COMMA(atom,index) ((atom+index)->a_type == A_COMMA) /* now miller's code starts : for 4 point interpolation for lookup tables for denormal floats */ #ifdef MSW int sys_noloadbang; //t_symbol *iemgui_key_sym=0; #include #else extern int sys_noloadbang; //extern t_symbol *iemgui_key_sym; #include #endif #define DEFDELVS 64 #define XTRASAMPS 4 #define SAMPBLK 4 #define UNITBIT32 1572864. /* 3*2^19; bit 32 has place value 1 */ /* machine-dependent definitions. These ifdefs really should have been by CPU type and not by operating system! */ #ifdef IRIX /* big-endian. Most significant byte is at low address in memory */ #define HIOFFSET 0 /* word offset to find MSB */ #define LOWOFFSET 1 /* word offset to find LSB */ #define int32 long /* a data type that has 32 bits */ #endif /* IRIX */ #ifdef MSW /* little-endian; most significant byte is at highest address */ #define HIOFFSET 1 #define LOWOFFSET 0 #define int32 long #endif /* MSW */ #if defined(__FreeBSD__) || defined(__APPLE__) #include #endif #ifdef __linux__ #include #endif #if defined(__unix__) || defined(__APPLE__) #if !defined(BYTE_ORDER) || !defined(LITTLE_ENDIAN) #error No byte order defined #endif #if BYTE_ORDER == LITTLE_ENDIAN #define HIOFFSET 1 #define LOWOFFSET 0 #else #define HIOFFSET 0 /* word offset to find MSB */ #define LOWOFFSET 1 /* word offset to find LSB */ #endif /* __BYTE_ORDER */ #include #define int32 int32_t #endif /* __unix__ or __APPLE__*/ union tabfudge_d { double tf_d; int32 tf_i[2]; }; union tabfudge_f { float tf_f; long tf_l; }; #if defined __i386__ || defined __x86_64__ #define IEM_DENORMAL(f) ((((*(unsigned int*)&(f))&0x60000000)==0) || \ (((*(unsigned int*)&(f))&0x60000000)==0x60000000)) /* more stringent test: anything not between 1e-19 and 1e19 in absolute val */ #else #define IEM_DENORMAL(f) 0 #endif /* on 64bit systems we cannot use garray_getfloatarray... */ #if ((defined PD_MAJOR_VERSION && defined PD_MINOR_VERSION) && (PD_MAJOR_VERSION > 0 || PD_MINOR_VERSION > 40)) # define iemarray_t t_word # define iemarray_getarray garray_getfloatwords # define iemarray_getfloat(pointer, index) (pointer[index].w_float) # define iemarray_setfloat(pointer, index, fvalue) (pointer[index].w_float = fvalue) #else # define iemarray_t t_float # define iemarray_getarray garray_getfloatarray # define iemarray_getfloat(pointer, index) (pointer[index]) # define iemarray_setfloat(pointer, index, fvalue) (pointer[index] = fvalue) #endif #endif iem_utils-v0.0.20180206/iem_dp/src/symtodp.c0000644000175000017500000000727012630366345020571 0ustar zmoelnigzmoelnig/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_dp written by IOhannes m zmoelnig, Thomas Musil, Copyright (c) IEM KUG Graz Austria 1999 - 2013 */ /* double precision library */ #include "m_pd.h" #include "iemlib.h" #include "iem_dp.h" #include #include #include /* -------------------------- symtodp ------------------------------ */ /* symbol double precision number to double float converter */ /* double float is only internal used */ /* to transfer this value, we divide this double value into use one float casted value */ /* and into the difference to the accurate double value. */ /* double float (sign_1 + exp_12 + mant_51) */ static t_class *symtodp_class; typedef struct _symtodp { t_object x_obj; double x_inner_double_value; t_outlet *x_out_floatcasted; t_outlet *x_out_residual; } t_symtodp; static double symtodp_calc_list_sum(int ac, t_atom *av) { int i; char str[1000], buf[100], *dummy; str[0] = 0; for(i=0; ix_inner_double_value); outlet_float(x->x_out_residual, iem_dp_calc_residual(x->x_inner_double_value, float_casted_value)); outlet_float(x->x_out_floatcasted, float_casted_value); } static void symtodp_float(t_symtodp *x, t_floatarg f) { x->x_inner_double_value = (double)f; symtodp_bang(x); } static void symtodp_symbol(t_symtodp *x, t_symbol *s) { char *dummy; if((s->s_name[0] == '"') && (s->s_name[1])) { if((s->s_name[1] == '.') || (s->s_name[1] == '+') || (s->s_name[1] == '-') || ((s->s_name[1] >= '0') && (s->s_name[1] <= '9'))) { x->x_inner_double_value = strtod(s->s_name+1, &dummy); symtodp_bang(x); } } else if((s->s_name[0] == '.') || (s->s_name[0] == '+') || (s->s_name[0] == '-') || ((s->s_name[0] >= '0') && (s->s_name[0] <= '9'))) { x->x_inner_double_value = strtod(s->s_name, &dummy); symtodp_bang(x); } } static void symtodp_list(t_symtodp *x, t_symbol *s, int ac, t_atom *av) { if(ac > 0) { x->x_inner_double_value = symtodp_calc_list_sum(ac, av); // post("listtodp double: %.18g", x->x_inner_double_value); symtodp_bang(x); } } static void symtodp_anything(t_symtodp *x, t_symbol *s, int ac, t_atom *av) { char *dummy; if((s->s_name[0] == '"') && (s->s_name[1])) { if((s->s_name[1] == '.') || (s->s_name[1] == '+') || (s->s_name[1] == '-') || ((s->s_name[1] >= '0') && (s->s_name[1] <= '9'))) { x->x_inner_double_value = strtod(s->s_name+1, &dummy); symtodp_bang(x); } } } static void *symtodp_new(void) { t_symtodp *x = (t_symtodp *)pd_new(symtodp_class); x->x_inner_double_value = 0.0; x->x_out_floatcasted = outlet_new(&x->x_obj, &s_float); x->x_out_residual = outlet_new(&x->x_obj, &s_float); return (x); } static void symtodp_free(t_symtodp *x) { } void symtodp_setup(void) { symtodp_class = class_new(gensym("symtodp"), (t_newmethod)symtodp_new, (t_method)symtodp_free, sizeof(t_symtodp), 0, 0); class_addbang(symtodp_class, symtodp_bang); class_addfloat(symtodp_class, symtodp_float); class_addsymbol(symtodp_class, symtodp_symbol); class_addlist(symtodp_class, symtodp_list); class_addanything(symtodp_class, symtodp_anything); } iem_utils-v0.0.20180206/iem_dp/src/random__.c0000644000175000017500000000547412630366345020654 0ustar zmoelnigzmoelnig/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_dp written by IOhannes m zmoelnig, Thomas Musil, Copyright (c) IEM KUG Graz Austria 1999 - 2007 */ /* double precision library */ #include "m_pd.h" #include "iemlib.h" #include "iem_dp.h" /* ------------------------ random_dp ---------------------------- */ /* based on miller's random, which is part of pd, only with double precision */ static t_class *random_dp_class; typedef struct _random_dp { t_object x_obj; t_float x_max_coarse; t_float x_max_fine; unsigned int x_state; t_outlet *x_out_coarse; t_outlet *x_out_fine; } t_random_dp; static int makeseed(void) { static unsigned int random_nextseed = 1489853723; random_nextseed = random_nextseed * 435898247 + 938284287; return (random_nextseed & 0x7fffffff); } static void *random_dp_new(t_symbol *s, int ac, t_atom *av) { t_random_dp *x = (t_random_dp *)pd_new(random_dp_class); if((ac > 0) && (IS_A_FLOAT(av, 0))) x->x_max_coarse = atom_getfloatarg(0, ac, av); else x->x_max_coarse = 0.0f; if((ac > 1) && (IS_A_FLOAT(av, 1))) x->x_max_fine = atom_getfloatarg(1, ac, av); else x->x_max_fine = 0.0f; x->x_state = makeseed(); floatinlet_new(&x->x_obj, &x->x_max_coarse); floatinlet_new(&x->x_obj, &x->x_max_fine); x->x_out_coarse = outlet_new(&x->x_obj, &s_float); x->x_out_fine = outlet_new(&x->x_obj, &s_float); return (x); } static void random_dp_bang(t_random_dp *x) { int n = (int)iem_dp_calc_sum(x->x_max_coarse, x->x_max_fine); int nval; int range = (n < 1 ? 1 : n); unsigned int randval = x->x_state; t_float fine, coarse; x->x_state = randval = randval * 472940017 + 832416023; nval = ((double)range) * ((double)randval) * (1./4294967296.); if(nval >= range) nval = range-1; coarse = iem_dp_cast_to_float((double)nval); outlet_float(x->x_out_fine, iem_dp_calc_residual((double)nval, coarse)); outlet_float(x->x_out_coarse, coarse); } static void random_dp_seed(t_random_dp *x, t_symbol *s, int ac, t_atom *av) { t_float fine, coarse; if((ac > 0) && (IS_A_FLOAT(av, 0))) coarse = atom_getfloatarg(0, ac, av); else coarse = 0.0f; if((ac > 1) && (IS_A_FLOAT(av, 1))) fine = atom_getfloatarg(1, ac, av); else fine = 0.0f; x->x_state = (int)iem_dp_calc_sum(coarse, fine); } void random_dp_setup(void) { random_dp_class = class_new(gensym("random__"), (t_newmethod)random_dp_new, 0, sizeof(t_random_dp), 0, A_GIMME, 0); class_addcreator((t_newmethod)random_dp_new, gensym("random''"), A_GIMME, 0); class_addbang(random_dp_class, random_dp_bang); class_addmethod(random_dp_class, (t_method)random_dp_seed, gensym("seed"), A_GIMME, 0); } iem_utils-v0.0.20180206/iem_dp/src/tabread~~.c0000644000175000017500000000646012630366345021070 0ustar zmoelnigzmoelnig/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_dp written by IOhannes m zmoelnig, Thomas Musil, Copyright (c) IEM KUG Graz Austria 1999 - 2007 */ /* double precision library */ #include "m_pd.h" #include "iemlib.h" #include "iem_dp.h" /* -------------------------- tabread~~ ------------------------------ */ /* based on miller's tabread~ which is part of pd */ /******************** tabread~ ***********************/ static t_class *tabread_tilde_tilde_class; typedef struct _tabread_tilde_tilde { t_object x_obj; int x_npoints; iemarray_t *x_vec; t_symbol *x_arrayname; t_float x_f; } t_tabread_tilde_tilde; static void *tabread_tilde_tilde_new(t_symbol *s) { t_tabread_tilde_tilde *x = (t_tabread_tilde_tilde *)pd_new(tabread_tilde_tilde_class); x->x_arrayname = s; x->x_npoints=0; x->x_vec = 0; inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_signal, &s_signal); outlet_new(&x->x_obj, gensym("signal")); x->x_f = 0; return (x); } static t_int *tabread_tilde_tilde_perform(t_int *w) { t_tabread_tilde_tilde *x = (t_tabread_tilde_tilde *)(w[1]); t_sample *in0 = (t_sample *)(w[2]); t_sample *in1 = (t_sample *)(w[3]); t_sample *out = (t_sample *)(w[4]); int n = (int)(w[5]); int maxindexminusone; iemarray_t *buf = x->x_vec; int i; maxindexminusone = x->x_npoints - 1; if(!buf) { while(n--) *out++ = 0; return(w+6); } for (i = 0; i < n; i++) { t_sample in0_s=*in0++; t_sample in1_s=*in1++; double findex = iem_dp_calc_sum(in0_s, in1_s); int index = (int)findex; if (index < 0) index = 0; else if (index > maxindexminusone) index = maxindexminusone; *out++ = iemarray_getfloat(buf, index); } return (w+6); } void tabread_tilde_tilde_set(t_tabread_tilde_tilde *x, t_symbol *s) { t_garray *a; x->x_arrayname = s; if (!(a = (t_garray *)pd_findbyclass(x->x_arrayname, garray_class))) { if (*s->s_name) pd_error(x, "tabread~: %s: no such array", x->x_arrayname->s_name); x->x_vec = 0; } else if (!iemarray_getarray(a, &x->x_npoints, &x->x_vec)) { pd_error(x, "%s: bad template for tabread~", x->x_arrayname->s_name); x->x_vec = 0; } else garray_usedindsp(a); } static void tabread_tilde_tilde_dsp(t_tabread_tilde_tilde *x, t_signal **sp) { tabread_tilde_tilde_set(x, x->x_arrayname); dsp_add(tabread_tilde_tilde_perform, 5, x, sp[0]->s_vec, sp[1]->s_vec, sp[2]->s_vec, sp[0]->s_n); } static void tabread_tilde_tilde_free(t_tabread_tilde_tilde *x) { } void tabread_tilde_tilde_setup(void) { tabread_tilde_tilde_class = class_new(gensym("tabread~~"), (t_newmethod)tabread_tilde_tilde_new, (t_method)tabread_tilde_tilde_free, sizeof(t_tabread_tilde_tilde), 0, A_DEFSYM, 0); CLASS_MAINSIGNALIN(tabread_tilde_tilde_class, t_tabread_tilde_tilde, x_f); class_addmethod(tabread_tilde_tilde_class, (t_method)tabread_tilde_tilde_dsp, gensym("dsp"), 0); class_addmethod(tabread_tilde_tilde_class, (t_method)tabread_tilde_tilde_set, gensym("set"), A_SYMBOL, 0); } iem_utils-v0.0.20180206/iem_dp/src/makefile_d_fat0000644000175000017500000000216012630366345021554 0ustar zmoelnigzmoelnigcurrent: all .SUFFIXES: .d_fat PD_INSTALL_PATH = "/Applications/Pd.app/Contents/Resources" PD_INCLUDE=$(PD_INSTALL_PATH)/src INCLUDE = -I. -I$(PD_INCLUDE) PD_CFLAGS =-DPD CFLAGS =-O2 -Wall -W -Wshadow -Wstrict-prototypes \ -Wno-unused -Wno-parentheses -Wno-switch -fPIC LFLAGS = -bundle -undefined suppress -flat_namespace ARCH_FLAGS=-arch i386 -arch ppc # the sources SRC = symtodp.c \ dptosym.c \ dptohex.c \ ftohex.c \ vline~~.c \ samphold~~.c \ wrap~~.c \ phasor~~.c \ print~~.c \ add__.c \ sub__.c \ mul__.c \ div__.c \ add~~.c \ sub~~.c \ mul~~.c \ div~~.c \ tabwrite_dp.c \ tabread_dp.c \ tabread4_dp.c \ tabwrite~~.c \ tabread~~.c \ tabread4~~.c \ max__.c \ min__.c \ max~~.c \ min~~.c \ random__.c \ delay~~.c \ iem_dp.c TARGET = iem_dp.d_fat OBJ = $(SRC:.c=.o) # # ------------------ targets ------------------------------------ # clean: rm ../$(TARGET) rm *.o all: $(OBJ) @echo :: $(OBJ) $(CC) $(ARCH_FLAGS) $(LFLAGS) -o $(TARGET) *.o strip -S -x $(TARGET) mv $(TARGET) .. $(OBJ) : %.o : %.c $(CC) $(ARCH_FLAGS) $(PD_CFLAGS) $(CFLAGS) $(INCLUDE) -c -o $*.o $*.c iem_utils-v0.0.20180206/iem_dp/src/tabwrite~~.c0000644000175000017500000001027212630366345021303 0ustar zmoelnigzmoelnig/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_dp written by IOhannes m zmoelnig, Thomas Musil, Copyright (c) IEM KUG Graz Austria 1999 - 2007 */ /* double precision library */ #include "m_pd.h" #include "iemlib.h" #include "iem_dp.h" /* -------------------------- tabwrite~~ ------------------------------ */ /* based on miller's tabwrite~ which is part of pd */ static t_class *tabwrite_tilde_tilde_class; typedef struct _tabwrite_tilde_tilde { t_object x_obj; int x_phase; int x_nsampsintab; iemarray_t *x_vec; t_symbol *x_arrayname; t_float x_f; } t_tabwrite_tilde_tilde; static void *tabwrite_tilde_tilde_new(t_symbol *s) { t_tabwrite_tilde_tilde *x = (t_tabwrite_tilde_tilde *)pd_new(tabwrite_tilde_tilde_class); x->x_phase = 0x7fffffff; x->x_arrayname = s; x->x_vec = 0; x->x_nsampsintab=0; x->x_f = 0; return (x); } static void tabwrite_tilde_tilde_redraw(t_tabwrite_tilde_tilde *x) { t_garray *a = (t_garray *)pd_findbyclass(x->x_arrayname, garray_class); if(!a) bug("tabwrite~~_redraw"); else garray_redraw(a); } static t_int *tabwrite_tilde_tilde_perform(t_int *w) { t_tabwrite_tilde_tilde *x = (t_tabwrite_tilde_tilde *)(w[1]); t_sample *in = (t_sample *)(w[2]); int n = (int)(w[3]); int phase = x->x_phase, endphase = x->x_nsampsintab; iemarray_t *vec = x->x_vec; if(!x->x_vec) return(w+4); if(endphase > phase) { int nxfer = endphase - phase; int i; vec += phase; if(nxfer > n) nxfer = n; phase += nxfer; for(i=0; i= endphase) { tabwrite_tilde_tilde_redraw(x); phase = 0x7fffffff; } x->x_phase = phase; } else x->x_phase = 0x7fffffff; return (w+4); } static void tabwrite_tilde_tilde_set(t_tabwrite_tilde_tilde *x, t_symbol *s) { t_garray *a; x->x_arrayname = s; if(!(a = (t_garray *)pd_findbyclass(x->x_arrayname, garray_class))) { if(*s->s_name) pd_error(x, "tabwrite~~: %s: no such array", x->x_arrayname->s_name); x->x_vec = 0; } else if(!iemarray_getarray(a, &x->x_nsampsintab, &x->x_vec)) { pd_error(x, "%s: bad template for tabwrite~~", x->x_arrayname->s_name); x->x_vec = 0; } else garray_usedindsp(a); } static void tabwrite_tilde_tilde_dsp(t_tabwrite_tilde_tilde *x, t_signal **sp) { tabwrite_tilde_tilde_set(x, x->x_arrayname); dsp_add(tabwrite_tilde_tilde_perform, 3, x, sp[0]->s_vec, sp[0]->s_n); } static void tabwrite_tilde_tilde_bang(t_tabwrite_tilde_tilde *x) { x->x_phase = 0; } static void tabwrite_tilde_tilde_start(t_tabwrite_tilde_tilde *x, t_symbol *s, int ac, t_atom *av) { double fi=0; int ii=0; t_float f=0, c=0; if((ac > 0)&&((av+0)->a_type == A_FLOAT)) c = atom_getfloatarg(0, ac, av); if((ac > 1)&&((av+1)->a_type == A_FLOAT)) f = atom_getfloatarg(1, ac, av); fi = iem_dp_calc_sum(c, f); ii = (int)fi; x->x_phase = (ii > 0 ? ii : 0); } static void tabwrite_tilde_tilde_stop(t_tabwrite_tilde_tilde *x) { if(x->x_phase != 0x7fffffff) { tabwrite_tilde_tilde_redraw(x); x->x_phase = 0x7fffffff; } } void tabwrite_tilde_tilde_setup(void) { tabwrite_tilde_tilde_class = class_new(gensym("tabwrite~~"), (t_newmethod)tabwrite_tilde_tilde_new, 0, sizeof(t_tabwrite_tilde_tilde), 0, A_DEFSYM, 0); CLASS_MAINSIGNALIN(tabwrite_tilde_tilde_class, t_tabwrite_tilde_tilde, x_f); class_addmethod(tabwrite_tilde_tilde_class, (t_method)tabwrite_tilde_tilde_dsp, gensym("dsp"), 0); class_addmethod(tabwrite_tilde_tilde_class, (t_method)tabwrite_tilde_tilde_set, gensym("set"), A_SYMBOL, 0); class_addmethod(tabwrite_tilde_tilde_class, (t_method)tabwrite_tilde_tilde_start, gensym("start"), A_GIMME, 0); class_addmethod(tabwrite_tilde_tilde_class, (t_method)tabwrite_tilde_tilde_stop, gensym("stop"), 0); class_addbang(tabwrite_tilde_tilde_class, tabwrite_tilde_tilde_bang); } iem_utils-v0.0.20180206/iem_dp/src/VC9/0000755000175000017500000000000012630366345017321 5ustar zmoelnigzmoelnigiem_utils-v0.0.20180206/iem_dp/src/VC9/makefile_vc9proj0000644000175000017500000000243412630366345022500 0ustar zmoelnigzmoelnigTARGET = iem_dp all: ..\$(TARGET).dll VIS_CPP_PATH = "C:\Program Files\Microsoft Visual Studio 9.0\VC" VIS_SDK_PATH = "C:\Program Files\Microsoft SDKs\Windows\v6.0A" PD_INST_PATH = "C:\Program Files\pd-0.43.0" PD_WIN_INCLUDE_PATH = /I. /I$(PD_INST_PATH)\src /I$(VIS_CPP_PATH)\include PD_WIN_C_FLAGS = /nologo /W3 /WX /DMSW /DNT /DPD /DWIN32 /DWINDOWS /Ox -D_CRT_SECURE_NO_WARNINGS PD_WIN_L_FLAGS = /nologo PD_WIN_LIB = /NODEFAULTLIB:libcmt /NODEFAULTLIB:oldnames /NODEFAULTLIB:kernel32 \ $(VIS_CPP_PATH)\lib\libcmt.lib \ $(VIS_CPP_PATH)\lib\oldnames.lib \ $(VIS_SDK_PATH)\lib\kernel32.lib \ $(PD_INST_PATH)\bin\pd.lib SRC = symtodp.c \ dptosym.c \ dptohex.c \ ftohex.c \ vline~~.c \ samphold~~.c \ wrap~~.c \ phasor~~.c \ print~~.c \ add__.c \ sub__.c \ mul__.c \ div__.c \ add~~.c \ sub~~.c \ mul~~.c \ div~~.c \ tabwrite_dp.c \ tabread_dp.c \ tabread4_dp.c \ tabwrite~~.c \ tabread~~.c \ tabread4~~.c \ max__.c \ min__.c \ max~~.c \ min~~.c \ random__.c \ delay~~.c \ $(TARGET).c OBJ = $(SRC:.c=.obj) .c.obj: cl $(PD_WIN_C_FLAGS) $(PD_WIN_INCLUDE_PATH) /c $*.c ..\$(TARGET).dll: $(OBJ) link $(PD_WIN_L_FLAGS) /dll /export:$(TARGET)_setup \ /out:..\$(TARGET).dll $(OBJ) $(PD_WIN_LIB) clean: del *.obj iem_utils-v0.0.20180206/iem_dp/src/VC9/iem_dp.vcproj0000644000175000017500000000356112630366345022010 0ustar zmoelnigzmoelnig iem_utils-v0.0.20180206/iem_dp/src/VC9/iem_dp.sln0000644000175000017500000000155512630366345021302 0ustar zmoelnigzmoelnig Microsoft Visual Studio Solution File, Format Version 10.00 # Visual Studio 2008 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "iem_dp", "iem_dp.vcproj", "{6A44952F-0D55-44EE-9032-928368583BEC}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Win32 = Debug|Win32 Release|Win32 = Release|Win32 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {6A44952F-0D55-44EE-9032-928368583BEC}.Debug|Win32.ActiveCfg = Debug|Win32 {6A44952F-0D55-44EE-9032-928368583BEC}.Debug|Win32.Build.0 = Debug|Win32 {6A44952F-0D55-44EE-9032-928368583BEC}.Release|Win32.ActiveCfg = Release|Win32 {6A44952F-0D55-44EE-9032-928368583BEC}.Release|Win32.Build.0 = Release|Win32 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection EndGlobal iem_utils-v0.0.20180206/iem_dp/src/wrap~~.c0000644000175000017500000000400012630366345020423 0ustar zmoelnigzmoelnig/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_dp written by IOhannes m zmoelnig, Thomas Musil, Copyright (c) IEM KUG Graz Austria 1999 - 2007 */ /* double precision library */ #include "m_pd.h" #include "iemlib.h" #include "iem_dp.h" /* -------------------------- wrap~~ ------------------------------ */ /* based on miller's wrap~ which is part of pd */ static t_class *wrap_tilde_tilde_class; typedef struct _wrap_tilde_tilde { t_object x_obj; t_float x_f; } t_wrap_tilde_tilde; static void *wrap_tilde_tilde_new(void) { t_wrap_tilde_tilde *x = (t_wrap_tilde_tilde *)pd_new(wrap_tilde_tilde_class); inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_signal, &s_signal); outlet_new(&x->x_obj, &s_signal); outlet_new(&x->x_obj, &s_signal); x->x_f = 0; return(x); } static t_int *wrap_tilde_tilde_perform(t_int *w) { t_sample *inc = (t_sample *)(w[1]); t_sample *inf = (t_sample *)(w[2]); t_sample *outc = (t_sample *)(w[3]); t_sample *outf = (t_sample *)(w[4]); int n = (int)(w[5]); while(n--) { double coarse = *inc++; double fine = *inf++; double d=iem_dp_calc_sum(coarse, fine); int k=(int)d; t_float f; if(d > 0) d -= (double)k; else d -= (double)(k-1); f = iem_dp_cast_to_float(d); *outf++ = iem_dp_calc_residual(d, f); *outc++ = f; } return(w+6); } static void wrap_tilde_tilde_dsp(t_wrap_tilde_tilde *x, t_signal **sp) { dsp_add(wrap_tilde_tilde_perform, 5, sp[0]->s_vec, sp[1]->s_vec, sp[2]->s_vec, sp[3]->s_vec, sp[0]->s_n); } void wrap_tilde_tilde_setup(void) { wrap_tilde_tilde_class = class_new(gensym("wrap~~"), (t_newmethod)wrap_tilde_tilde_new, 0, sizeof(t_wrap_tilde_tilde), 0, 0); CLASS_MAINSIGNALIN(wrap_tilde_tilde_class, t_wrap_tilde_tilde, x_f); class_addmethod(wrap_tilde_tilde_class, (t_method)wrap_tilde_tilde_dsp, gensym("dsp"), 0); } iem_utils-v0.0.20180206/iem_dp/src/sub~~.c0000644000175000017500000002044112630366345020252 0ustar zmoelnigzmoelnig/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_dp written by IOhannes m zmoelnig, Thomas Musil, Copyright (c) IEM KUG Graz Austria 1999 - 2007 */ /* double precision library */ #include "m_pd.h" #include "iemlib.h" #include "iem_dp.h" /* -------------------------- sub~~ ------------------------------ */ /* based on miller's -~ which is part of pd */ static t_class *sub_tilde_tilde_class, *scalarsub_tilde_tilde_class; typedef struct _sub_tilde_tilde { t_object x_obj; t_float x_f; t_sample *x_in1_coarse; t_sample *x_in1_fine; t_sample *x_in2_coarse; t_sample *x_in2_fine; t_sample *x_out_coarse; t_sample *x_out_fine; } t_sub_tilde_tilde; typedef struct _scalarsub_tilde_tilde { t_object x_obj; t_float x_f; t_sample *x_in1_coarse; t_sample *x_in1_fine; t_sample *x_out_coarse; t_sample *x_out_fine; t_sample x_in2_coarse; t_sample x_in2_fine; } t_scalarsub_tilde_tilde; static void *sub_tilde_tilde_new(t_symbol *s, int argc, t_atom *argv) { if(((argc==1)&&(argv->a_type == A_FLOAT))||(argc>=2)&&(argv->a_type == A_FLOAT)&&((argv+1)->a_type == A_FLOAT)) { t_scalarsub_tilde_tilde *x = (t_scalarsub_tilde_tilde *)pd_new(scalarsub_tilde_tilde_class); inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_signal, &s_signal); floatinlet_new(&x->x_obj, &x->x_in2_coarse); floatinlet_new(&x->x_obj, &x->x_in2_fine); x->x_in2_coarse = atom_getfloatarg(0, argc, argv); if(argc>=2) x->x_in2_fine = atom_getfloatarg(1, argc, argv); else x->x_in2_fine = 0; outlet_new(&x->x_obj, &s_signal); outlet_new(&x->x_obj, &s_signal); x->x_f = 0; return (x); } else /* either no arguments or symbols */ { t_sub_tilde_tilde *x = (t_sub_tilde_tilde *)pd_new(sub_tilde_tilde_class); inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_signal, &s_signal); inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_signal, &s_signal); inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_signal, &s_signal); outlet_new(&x->x_obj, &s_signal); outlet_new(&x->x_obj, &s_signal); x->x_f = 0; return (x); } } static t_int *sub_tilde_tilde_perform(t_int *w) { t_sub_tilde_tilde *x = (t_sub_tilde_tilde *)(w[1]); int n = (int)(w[2]); t_sample *in1c = x->x_in1_coarse; t_sample *in1f = x->x_in1_fine; t_sample *in2c = x->x_in2_coarse; t_sample *in2f = x->x_in2_fine; t_sample *outc = x->x_out_coarse; t_sample *outf = x->x_out_fine; double d; t_float f; while(n--) { d = iem_dp_calc_sum(*in1c++, *in1f++) - iem_dp_calc_sum(*in2c++, *in2f++); f = iem_dp_cast_to_float(d); *outf++ = iem_dp_calc_residual(d, f); *outc++ = f; } return(w+3); } static t_int *sub_tilde_tilde_perf8(t_int *w) { t_sub_tilde_tilde *x = (t_sub_tilde_tilde *)(w[1]); int n = (int)(w[2]); t_sample *in1c = x->x_in1_coarse; t_sample *in1f = x->x_in1_fine; t_sample *in2c = x->x_in2_coarse; t_sample *in2f = x->x_in2_fine; t_sample *outc = x->x_out_coarse; t_sample *outf = x->x_out_fine; for(; n; n -= 8, in1c += 8, in1f += 8, in2c += 8, in2f += 8, outc += 8, outf += 8) { double d; t_float f; d = iem_dp_calc_sum(in1c[0], in1f[0]) - iem_dp_calc_sum(in2c[0], in2f[0]); f = iem_dp_cast_to_float(d); outf[0] = iem_dp_calc_residual(d, f); outc[0] = f; d = iem_dp_calc_sum(in1c[1], in1f[1]) - iem_dp_calc_sum(in2c[1], in2f[1]); f = iem_dp_cast_to_float(d); outf[1] = iem_dp_calc_residual(d, f); outc[1] = f; d = iem_dp_calc_sum(in1c[2], in1f[2]) - iem_dp_calc_sum(in2c[2], in2f[2]); f = iem_dp_cast_to_float(d); outf[2] = iem_dp_calc_residual(d, f); outc[2] = f; d = iem_dp_calc_sum(in1c[3], in1f[3]) - iem_dp_calc_sum(in2c[3], in2f[3]); f = iem_dp_cast_to_float(d); outf[3] = iem_dp_calc_residual(d, f); outc[3] = f; d = iem_dp_calc_sum(in1c[4], in1f[4]) - iem_dp_calc_sum(in2c[4], in2f[4]); f = iem_dp_cast_to_float(d); outf[4] = iem_dp_calc_residual(d, f); outc[4] = f; d = iem_dp_calc_sum(in1c[5], in1f[5]) - iem_dp_calc_sum(in2c[5], in2f[5]); f = iem_dp_cast_to_float(d); outf[5] = iem_dp_calc_residual(d, f); outc[5] = f; d = iem_dp_calc_sum(in1c[6], in1f[6]) - iem_dp_calc_sum(in2c[6], in2f[6]); f = iem_dp_cast_to_float(d); outf[6] = iem_dp_calc_residual(d, f); outc[6] = f; d = iem_dp_calc_sum(in1c[7], in1f[7]) - iem_dp_calc_sum(in2c[7], in2f[7]); f = iem_dp_cast_to_float(d); outf[7] = iem_dp_calc_residual(d, f); outc[7] = f; } return(w+3); } static t_int *scalarsub_tilde_tilde_perform(t_int *w) { t_scalarsub_tilde_tilde *x = (t_scalarsub_tilde_tilde *)(w[1]); int n = (int)(w[2]); t_sample *inc = x->x_in1_coarse; t_sample *inf = x->x_in1_fine; t_sample *outc = x->x_out_coarse; t_sample *outf = x->x_out_fine; double d, g=iem_dp_calc_sum(x->x_in2_coarse, x->x_in2_fine); t_float f; while(n--) { d = iem_dp_calc_sum(*inc++, *inf++) - g; f = iem_dp_cast_to_float(d); *outf++ = iem_dp_calc_residual(d, f); *outc++ = f; } return(w+3); } static t_int *scalarsub_tilde_tilde_perf8(t_int *w) { t_scalarsub_tilde_tilde *x = (t_scalarsub_tilde_tilde *)(w[1]); int n = (int)(w[2]); t_sample *inc = x->x_in1_coarse; t_sample *inf = x->x_in1_fine; t_sample *outc = x->x_out_coarse; t_sample *outf = x->x_out_fine; double g=iem_dp_calc_sum(x->x_in2_coarse, x->x_in2_fine); for(; n; n -= 8, inc += 8, inf += 8, outc += 8, outf += 8) { double d; t_float f; d = iem_dp_calc_sum(inc[0], inf[0]) - g; f = iem_dp_cast_to_float(d); outf[0] = iem_dp_calc_residual(d, f); outc[0] = f; d = iem_dp_calc_sum(inc[1], inf[1]) - g; f = iem_dp_cast_to_float(d); outf[1] = iem_dp_calc_residual(d, f); outc[1] = f; d = iem_dp_calc_sum(inc[2], inf[2]) - g; f = iem_dp_cast_to_float(d); outf[2] = iem_dp_calc_residual(d, f); outc[2] = f; d = iem_dp_calc_sum(inc[3], inf[3]) - g; f = iem_dp_cast_to_float(d); outf[3] = iem_dp_calc_residual(d, f); outc[3] = f; d = iem_dp_calc_sum(inc[4], inf[4]) - g; f = iem_dp_cast_to_float(d); outf[4] = iem_dp_calc_residual(d, f); outc[4] = f; d = iem_dp_calc_sum(inc[5], inf[5]) - g; f = iem_dp_cast_to_float(d); outf[5] = iem_dp_calc_residual(d, f); outc[5] = f; d = iem_dp_calc_sum(inc[6], inf[6]) - g; f = iem_dp_cast_to_float(d); outf[6] = iem_dp_calc_residual(d, f); outc[6] = f; d = iem_dp_calc_sum(inc[7], inf[7]) - g; f = iem_dp_cast_to_float(d); outf[7] = iem_dp_calc_residual(d, f); outc[7] = f; } return(w+3); } static void sub_tilde_tilde_dsp(t_sub_tilde_tilde *x, t_signal **sp) { x->x_in1_coarse = sp[0]->s_vec; x->x_in1_fine = sp[1]->s_vec; x->x_in2_coarse = sp[2]->s_vec; x->x_in2_fine = sp[3]->s_vec; x->x_out_coarse = sp[4]->s_vec; x->x_out_fine = sp[5]->s_vec; if(sp[0]->s_n&7) dsp_add(sub_tilde_tilde_perform, 2, x, sp[0]->s_n); else dsp_add(sub_tilde_tilde_perf8, 2, x, sp[0]->s_n); } static void scalarsub_tilde_tilde_dsp(t_scalarsub_tilde_tilde *x, t_signal **sp) { x->x_in1_coarse = sp[0]->s_vec; x->x_in1_fine = sp[1]->s_vec; x->x_out_coarse = sp[2]->s_vec; x->x_out_fine = sp[3]->s_vec; if(sp[0]->s_n&7) dsp_add(scalarsub_tilde_tilde_perform, 2, x, sp[0]->s_n); else dsp_add(scalarsub_tilde_tilde_perf8, 2, x, sp[0]->s_n); } void sub_tilde_tilde_setup(void) { sub_tilde_tilde_class = class_new(gensym("-~~"), (t_newmethod)sub_tilde_tilde_new, 0, sizeof(t_sub_tilde_tilde), 0, A_GIMME, 0); class_addcreator((t_newmethod)sub_tilde_tilde_new, gensym("sub~~"), A_GIMME, 0); CLASS_MAINSIGNALIN(sub_tilde_tilde_class, t_sub_tilde_tilde, x_f); class_addmethod(sub_tilde_tilde_class, (t_method)sub_tilde_tilde_dsp, gensym("dsp"), 0); scalarsub_tilde_tilde_class = class_new(gensym("-~~"), 0, 0, sizeof(t_scalarsub_tilde_tilde), 0, 0); CLASS_MAINSIGNALIN(scalarsub_tilde_tilde_class, t_scalarsub_tilde_tilde, x_f); class_addmethod(scalarsub_tilde_tilde_class, (t_method)scalarsub_tilde_tilde_dsp, gensym("dsp"), 0); } iem_utils-v0.0.20180206/iem_dp/src/max__.c0000644000175000017500000000443212630366345020152 0ustar zmoelnigzmoelnig/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_dp written by IOhannes m zmoelnig, Thomas Musil, Copyright (c) IEM KUG Graz Austria 1999 - 2007 */ /* double precision library */ #include "m_pd.h" #include "iemlib.h" #include "iem_dp.h" /* ------------------------ max_dp ---------------------------- */ /* based on miller's max, which is part of pd, only with double precision */ static t_class *max_dp_class; typedef struct _max_dp { t_object x_obj; t_float x_coarse_left; t_float x_fine_left; t_float x_coarse_right; t_float x_fine_right; t_outlet *x_out_coarse; t_outlet *x_out_fine; } t_max_dp; static void max_dp_bang(t_max_dp *x) { double dleft, dright; dleft = iem_dp_calc_sum(x->x_coarse_left, x->x_fine_left); dright = iem_dp_calc_sum(x->x_coarse_right, x->x_fine_right); if(dleft > dright) { outlet_float(x->x_out_fine, x->x_fine_left); outlet_float(x->x_out_coarse, x->x_coarse_left); } else { outlet_float(x->x_out_fine, x->x_fine_right); outlet_float(x->x_out_coarse, x->x_coarse_right); } } static void max_dp_float(t_max_dp *x, t_floatarg f) { x->x_coarse_left = f; max_dp_bang(x); } static void *max_dp_new(t_symbol *s, int ac, t_atom *av) { t_max_dp *x = (t_max_dp *)pd_new(max_dp_class); floatinlet_new(&x->x_obj, &x->x_fine_left); floatinlet_new(&x->x_obj, &x->x_coarse_right); floatinlet_new(&x->x_obj, &x->x_fine_right); x->x_coarse_left = 0.0f; x->x_fine_left = 0.0f; if((ac > 0) && (IS_A_FLOAT(av, 0))) x->x_coarse_right = atom_getfloatarg(0, ac, av); else x->x_coarse_right = 0.0f; if((ac > 1) && (IS_A_FLOAT(av, 1))) x->x_fine_right = atom_getfloatarg(1, ac, av); else x->x_fine_right = 0.0f; x->x_out_coarse = outlet_new(&x->x_obj, &s_float); x->x_out_fine = outlet_new(&x->x_obj, &s_float); return (x); } void max_dp_setup(void) { max_dp_class = class_new(gensym("max__"), (t_newmethod)max_dp_new, 0, sizeof(t_max_dp), 0, A_GIMME, 0); class_addcreator((t_newmethod)max_dp_new, gensym("max''"), A_GIMME, 0); class_addbang(max_dp_class, max_dp_bang); class_addfloat(max_dp_class, max_dp_float); } iem_utils-v0.0.20180206/iem_dp/src/makefile_darwin0000644000175000017500000000231312630366345021763 0ustar zmoelnigzmoelnigcurrent: all .SUFFIXES: .pd_darwin PD_INSTALL_PATH = "/Applications/Pd.app/Contents/Resources" INCLUDE = -I. -I$(PD_INSTALL_PATH)/src LIB = -ldl -lm -lpthread CFLAGS = -DPD -DUNIX -g -Wall -W -Werror -Wno-unused \ -Wno-parentheses -Wno-switch -O2 -fno-strict-aliasing \ $(INCLUDE) $(UCFLAGS) $(AFLAGS) \ MACOSXLINKFLAGS = -bundle -bundle_loader $(PD_INSTALL_PATH)/bin/pd SYSTEM = $(shell uname -m) # the sources SRC = symtodp.c \ dptosym.c \ dptohex.c \ ftohex.c \ vline~~.c \ samphold~~.c \ wrap~~.c \ phasor~~.c \ print~~.c \ add__.c \ sub__.c \ mul__.c \ div__.c \ add~~.c \ sub~~.c \ mul~~.c \ div~~.c \ tabwrite_dp.c \ tabread_dp.c \ tabread4_dp.c \ tabwrite~~.c \ tabread~~.c \ tabread4~~.c \ max__.c \ min__.c \ max~~.c \ min~~.c \ random__.c \ delay~~.c \ iem_dp.c TARGET = iem_dp.pd_darwin OBJ = $(SRC:.c=.o) # # ------------------ targets ------------------------------------ # clean: rm ../$(TARGET) rm *.o all: $(OBJ) @echo :: $(OBJ) $(CC) $(MACOSXLINKFLAGS) -o $(TARGET) *.o $(LIB) strip -S -x $(TARGET) mv $(TARGET) .. $(OBJ) : %.o : %.c touch $*.c $(CC) $(CFLAGS) -DPD $(INCLUDE) -c -o $*.o $*.c iem_utils-v0.0.20180206/iem_dp/src/div~~.c0000644000175000017500000002226212630366345020246 0ustar zmoelnigzmoelnig/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_dp written by IOhannes m zmoelnig, Thomas Musil, Copyright (c) IEM KUG Graz Austria 1999 - 2007 */ /* double precision library */ #include "m_pd.h" #include "iemlib.h" #include "iem_dp.h" /* -------------------------- div~~ ------------------------------ */ /* based on miller's /~ which is part of pd */ static t_class *div_tilde_tilde_class, *scalardiv_tilde_tilde_class; typedef struct _div_tilde_tilde { t_object x_obj; t_float x_f; t_sample *x_in1_coarse; t_sample *x_in1_fine; t_sample *x_in2_coarse; t_sample *x_in2_fine; t_sample *x_out_coarse; t_sample *x_out_fine; } t_div_tilde_tilde; typedef struct _scalardiv_tilde_tilde { t_object x_obj; t_float x_f; t_sample *x_in1_coarse; t_sample *x_in1_fine; t_sample *x_out_coarse; t_sample *x_out_fine; t_sample x_in2_coarse; t_sample x_in2_fine; } t_scalardiv_tilde_tilde; static void *div_tilde_tilde_new(t_symbol *s, int argc, t_atom *argv) { if(((argc==1)&&(argv->a_type == A_FLOAT))||(argc>=2)&&(argv->a_type == A_FLOAT)&&((argv+1)->a_type == A_FLOAT)) { t_scalardiv_tilde_tilde *x = (t_scalardiv_tilde_tilde *)pd_new(scalardiv_tilde_tilde_class); inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_signal, &s_signal); floatinlet_new(&x->x_obj, &x->x_in2_coarse); floatinlet_new(&x->x_obj, &x->x_in2_fine); x->x_in2_coarse = atom_getfloatarg(0, argc, argv); if(argc>=2) x->x_in2_fine = atom_getfloatarg(1, argc, argv); else x->x_in2_fine = 0; outlet_new(&x->x_obj, &s_signal); outlet_new(&x->x_obj, &s_signal); x->x_f = 0; return (x); } else /* either no arguments or symbols */ { t_div_tilde_tilde *x = (t_div_tilde_tilde *)pd_new(div_tilde_tilde_class); inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_signal, &s_signal); inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_signal, &s_signal); inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_signal, &s_signal); outlet_new(&x->x_obj, &s_signal); outlet_new(&x->x_obj, &s_signal); x->x_f = 0; return (x); } } static t_int *div_tilde_tilde_perform(t_int *w) { t_div_tilde_tilde *x = (t_div_tilde_tilde *)(w[1]); int n = (int)(w[2]); t_sample *in1c = x->x_in1_coarse; t_sample *in1f = x->x_in1_fine; t_sample *in2c = x->x_in2_coarse; t_sample *in2f = x->x_in2_fine; t_sample *outc = x->x_out_coarse; t_sample *outf = x->x_out_fine; double d, nom; t_float f; while(n--) { nom = iem_dp_calc_sum(*in2c++, *in2f++); d = (nom ? iem_dp_calc_sum(*in1c++, *in1f++) / nom : 0); f = iem_dp_cast_to_float(d); *outf++ = iem_dp_calc_residual(d, f); *outc++ = f; } return(w+3); } static t_int *div_tilde_tilde_perf8(t_int *w) { t_div_tilde_tilde *x = (t_div_tilde_tilde *)(w[1]); int n = (int)(w[2]); t_sample *in1c = x->x_in1_coarse; t_sample *in1f = x->x_in1_fine; t_sample *in2c = x->x_in2_coarse; t_sample *in2f = x->x_in2_fine; t_sample *outc = x->x_out_coarse; t_sample *outf = x->x_out_fine; for(; n; n -= 8, in1c += 8, in1f += 8, in2c += 8, in2f += 8, outc += 8, outf += 8) { double d, nom; t_float f; nom = iem_dp_calc_sum(in2c[0], in2f[0]); d = (nom ? iem_dp_calc_sum(in1c[0], in1f[0]) / nom : 0); f = iem_dp_cast_to_float(d); outf[0] = iem_dp_calc_residual(d, f); outc[0] = f; nom = iem_dp_calc_sum(in2c[1], in2f[1]); d = (nom ? iem_dp_calc_sum(in1c[1], in1f[1]) / nom : 0); f = iem_dp_cast_to_float(d); outf[1] = iem_dp_calc_residual(d, f); outc[1] = f; nom = iem_dp_calc_sum(in2c[2], in2f[2]); d = (nom ? iem_dp_calc_sum(in1c[2], in1f[2]) / nom : 0); f = iem_dp_cast_to_float(d); outf[2] = iem_dp_calc_residual(d, f); outc[2] = f; nom = iem_dp_calc_sum(in2c[3], in2f[3]); d = (nom ? iem_dp_calc_sum(in1c[3], in1f[3]) / nom : 0); f = iem_dp_cast_to_float(d); outf[3] = iem_dp_calc_residual(d, f); outc[3] = f; nom = iem_dp_calc_sum(in2c[4], in2f[4]); d = (nom ? iem_dp_calc_sum(in1c[4], in1f[4]) / nom : 0); f = iem_dp_cast_to_float(d); outf[4] = iem_dp_calc_residual(d, f); outc[4] = f; nom = iem_dp_calc_sum(in2c[5], in2f[5]); d = (nom ? iem_dp_calc_sum(in1c[5], in1f[5]) / nom : 0); f = iem_dp_cast_to_float(d); outf[5] = iem_dp_calc_residual(d, f); outc[5] = f; nom = iem_dp_calc_sum(in2c[6], in2f[6]); d = (nom ? iem_dp_calc_sum(in1c[6], in1f[6]) / nom : 0); f = iem_dp_cast_to_float(d); outf[6] = iem_dp_calc_residual(d, f); outc[6] = f; nom = iem_dp_calc_sum(in2c[7], in2f[7]); d = (nom ? iem_dp_calc_sum(in1c[7], in1f[7]) / nom : 0); f = iem_dp_cast_to_float(d); outf[7] = iem_dp_calc_residual(d, f); outc[7] = f; } return(w+3); } static t_int *scalardiv_tilde_tilde_perform(t_int *w) { t_scalardiv_tilde_tilde *x = (t_scalardiv_tilde_tilde *)(w[1]); int n = (int)(w[2]); t_sample *inc = x->x_in1_coarse; t_sample *inf = x->x_in1_fine; t_sample *outc = x->x_out_coarse; t_sample *outf = x->x_out_fine; double d, g=iem_dp_calc_sum(x->x_in2_coarse, x->x_in2_fine); t_float f; if(g) { double h=1.0/g; while(n--) { d = iem_dp_calc_sum(*inc++, *inf++) * h; f = iem_dp_cast_to_float(d); *outf++ = iem_dp_calc_residual(d, f); *outc++ = f; } } else { while(n--) { *outf++ = 0; *outc++ = 0; } } return(w+3); } static t_int *scalardiv_tilde_tilde_perf8(t_int *w) { t_scalardiv_tilde_tilde *x = (t_scalardiv_tilde_tilde *)(w[1]); int n = (int)(w[2]); t_sample *inc = x->x_in1_coarse; t_sample *inf = x->x_in1_fine; t_sample *outc = x->x_out_coarse; t_sample *outf = x->x_out_fine; double g=iem_dp_calc_sum(x->x_in2_coarse, x->x_in2_fine); if(g) { double h=1.0/g; for(; n; n -= 8, inc += 8, inf += 8, outc += 8, outf += 8) { double d; t_float f; d = iem_dp_calc_sum(inc[0], inf[0]) * h; f = iem_dp_cast_to_float(d); outf[0] = iem_dp_calc_residual(d, f); outc[0] = f; d = iem_dp_calc_sum(inc[1], inf[1]) * h; f = iem_dp_cast_to_float(d); outf[1] = iem_dp_calc_residual(d, f); outc[1] = f; d = iem_dp_calc_sum(inc[2], inf[2]) * h; f = iem_dp_cast_to_float(d); outf[2] = iem_dp_calc_residual(d, f); outc[2] = f; d = iem_dp_calc_sum(inc[3], inf[3]) * h; f = iem_dp_cast_to_float(d); outf[3] = iem_dp_calc_residual(d, f); outc[3] = f; d = iem_dp_calc_sum(inc[4], inf[4]) * h; f = iem_dp_cast_to_float(d); outf[4] = iem_dp_calc_residual(d, f); outc[4] = f; d = iem_dp_calc_sum(inc[5], inf[5]) * h; f = iem_dp_cast_to_float(d); outf[5] = iem_dp_calc_residual(d, f); outc[5] = f; d = iem_dp_calc_sum(inc[6], inf[6]) * h; f = iem_dp_cast_to_float(d); outf[6] = iem_dp_calc_residual(d, f); outc[6] = f; d = iem_dp_calc_sum(inc[7], inf[7]) * h; f = iem_dp_cast_to_float(d); outf[7] = iem_dp_calc_residual(d, f); outc[7] = f; } } else { for(; n; n -= 8, outc += 8, outf += 8) { outf[0] = 0; outc[0] = 0; outf[1] = 0; outc[1] = 0; outf[2] = 0; outc[2] = 0; outf[3] = 0; outc[3] = 0; outf[4] = 0; outc[4] = 0; outf[5] = 0; outc[5] = 0; outf[6] = 0; outc[6] = 0; outf[7] = 0; outc[7] = 0; } } return(w+3); } static void div_tilde_tilde_dsp(t_div_tilde_tilde *x, t_signal **sp) { x->x_in1_coarse = sp[0]->s_vec; x->x_in1_fine = sp[1]->s_vec; x->x_in2_coarse = sp[2]->s_vec; x->x_in2_fine = sp[3]->s_vec; x->x_out_coarse = sp[4]->s_vec; x->x_out_fine = sp[5]->s_vec; if(sp[0]->s_n&7) dsp_add(div_tilde_tilde_perform, 2, x, sp[0]->s_n); else dsp_add(div_tilde_tilde_perf8, 2, x, sp[0]->s_n); } static void scalardiv_tilde_tilde_dsp(t_scalardiv_tilde_tilde *x, t_signal **sp) { x->x_in1_coarse = sp[0]->s_vec; x->x_in1_fine = sp[1]->s_vec; x->x_out_coarse = sp[2]->s_vec; x->x_out_fine = sp[3]->s_vec; if(sp[0]->s_n&7) dsp_add(scalardiv_tilde_tilde_perform, 2, x, sp[0]->s_n); else dsp_add(scalardiv_tilde_tilde_perf8, 2, x, sp[0]->s_n); } void div_tilde_tilde_setup(void) { div_tilde_tilde_class = class_new(gensym("/~~"), (t_newmethod)div_tilde_tilde_new, 0, sizeof(t_div_tilde_tilde), 0, A_GIMME, 0); class_addcreator((t_newmethod)div_tilde_tilde_new, gensym("div~~"), A_GIMME, 0); CLASS_MAINSIGNALIN(div_tilde_tilde_class, t_div_tilde_tilde, x_f); class_addmethod(div_tilde_tilde_class, (t_method)div_tilde_tilde_dsp, gensym("dsp"), 0); scalardiv_tilde_tilde_class = class_new(gensym("/~~"), 0, 0, sizeof(t_scalardiv_tilde_tilde), 0, 0); CLASS_MAINSIGNALIN(scalardiv_tilde_tilde_class, t_scalardiv_tilde_tilde, x_f); class_addmethod(scalardiv_tilde_tilde_class, (t_method)scalardiv_tilde_tilde_dsp, gensym("dsp"), 0); } iem_utils-v0.0.20180206/iem_dp/src/iem_dp.c0000644000175000017500000000714412630366345020327 0ustar zmoelnigzmoelnig/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. * iem_dp written by IOhannes m zmoelnig, Thomas Musil, * Copyright (c) IEM KUG Graz Austria 2000 - 2008 */ /* iem_dp means double precision, it is a library of external pd objects */ /* which deal with array access and delay lines */ /* the way how objects comunicate with other objects in double precision is, */ /* to send two values on two different outputs to two different inputs */ /* one value is the float casted value of the original double value */ /* the other value is the difference in double of the original minus the float casted value */ /* the receiving inlets only cast them to double and add them */ #include "m_pd.h" #include "iemlib.h" //static int delread_zero = 0; /* four bytes of zero for delread~, vd~ */ t_float iem_dp_cast_to_float(double d) { return((t_float)d); } double iem_dp_cast_to_double(t_float f) { return((double)f); } t_float iem_dp_calc_residual(double d, t_float f) { return(iem_dp_cast_to_float(d - iem_dp_cast_to_double(f))); } double iem_dp_calc_sum(t_float f, t_float r) { return(iem_dp_cast_to_double(f) + iem_dp_cast_to_double(r)); } static t_class *iem_dp_class; static void *iem_dp_new(void) { t_object *x = (t_object *)pd_new(iem_dp_class); return (x); } void ftohex_setup(void); void symtodp_setup(void); void dptosym_setup(void); void dptohex_setup(void); void vline_tilde_tilde_setup(void); void samphold_tilde_tilde_setup(void); void wrap_tilde_tilde_setup(void); void phasor_tilde_tilde_setup(void); void print_tilde_tilde_setup(void); void add___setup(void); void sub___setup(void); void mul___setup(void); void div___setup(void); void add_tilde_tilde_setup(void); void sub_tilde_tilde_setup(void); void mul_tilde_tilde_setup(void); void div_tilde_tilde_setup(void); void tabwrite_dp_setup(void); void tabread_dp_setup(void); void tabread4_dp_setup(void); void tabwrite_tilde_tilde_setup(void); void tabread_tilde_tilde_setup(void); void tabread4_tilde_tilde_setup(void); void max_dp_setup(void); void min_dp_setup(void); void max_tilde_tilde_setup(void); void min_tilde_tilde_setup(void); void random_dp_setup(void); void delay_tilde_tilde_setup(void); //void listtodp_setup(void); //void dqnsymtodp_setup(void); //void dptodqnsym_setup(void); /* ------------------------ setup routine ------------------------- */ void iem_dp_setup(void) { iem_dp_class = class_new(gensym("iem_dp"), iem_dp_new, 0, sizeof(t_object), CLASS_NOINLET, 0); ftohex_setup(); symtodp_setup(); dptosym_setup(); dptohex_setup(); vline_tilde_tilde_setup(); samphold_tilde_tilde_setup(); wrap_tilde_tilde_setup(); phasor_tilde_tilde_setup(); print_tilde_tilde_setup(); add___setup(); sub___setup(); mul___setup(); div___setup(); add_tilde_tilde_setup(); sub_tilde_tilde_setup(); mul_tilde_tilde_setup(); div_tilde_tilde_setup(); tabwrite_dp_setup(); tabread_dp_setup(); tabread4_dp_setup(); tabwrite_tilde_tilde_setup(); tabread_tilde_tilde_setup(); tabread4_tilde_tilde_setup(); max_dp_setup(); min_dp_setup(); max_tilde_tilde_setup(); min_tilde_tilde_setup(); random_dp_setup(); delay_tilde_tilde_setup(); // listtodp_setup(); // dqnsymtodp_setup(); // dptodqnsym_setup(); post("iem_dp (R-1.19) library loaded! (c) IOhannes m zmoelnig, Thomas Musil 06.2013"); post(" zmoelnig%ciem.at iem KUG Graz Austria", '@'); post(" musil%ciem.at iem KUG Graz Austria", '@'); } iem_utils-v0.0.20180206/iem_dp/src/dptohex.c0000644000175000017500000000355712630366345020551 0ustar zmoelnigzmoelnig/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_dp written by IOhannes m zmoelnig, Thomas Musil, Copyright (c) IEM KUG Graz Austria 1999 - 2013 */ /* double precision library */ #include "m_pd.h" #include "iemlib.h" #include "iem_dp.h" #include #include #include /* -------------------------- dptohex ------------------------------ */ /* double float to 16 digits of hexadecimal converter */ /* double float is only internal used */ /* to transfer this value, we divide this double value into use one float casted value */ /* and into the difference to the accurate double value. */ /* double float (sign_1 + exp_12 + mant_51) */ static t_class *dptohex_class; typedef struct _dptohex { t_object x_obj; t_float x_float_casted_value; t_float x_residual; } t_dptohex; static void dptohex_bang(t_dptohex *x) { char buf[100]; union tabfudge_d tf; tf.tf_d = iem_dp_calc_sum(x->x_float_casted_value, x->x_residual); sprintf(buf, "#%08X%08X", tf.tf_i[HIOFFSET], tf.tf_i[LOWOFFSET]); outlet_symbol(x->x_obj.ob_outlet, gensym(buf)); } static void dptohex_float(t_dptohex *x, t_floatarg f) { x->x_float_casted_value = f; dptohex_bang(x); } static void *dptohex_new(void) { t_dptohex *x = (t_dptohex *)pd_new(dptohex_class); floatinlet_new(&x->x_obj, &x->x_residual); x->x_float_casted_value = 0.0f; x->x_residual = 0.0f; outlet_new(&x->x_obj, &s_symbol); return (x); } static void dptohex_free(t_dptohex *x) { } void dptohex_setup(void) { dptohex_class = class_new(gensym("dptohex"), (t_newmethod)dptohex_new, (t_method)dptohex_free, sizeof(t_dptohex), 0, 0); class_addbang(dptohex_class, dptohex_bang); class_addfloat(dptohex_class, dptohex_float); } iem_utils-v0.0.20180206/iem_dp/src/ftohex.c0000644000175000017500000000230012630366345020354 0ustar zmoelnigzmoelnig/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_dp written by IOhannes m zmoelnig, Thomas Musil, Copyright (c) IEM KUG Graz Austria 1999 - 2007 */ /* double precision library */ #include "m_pd.h" #include "iemlib.h" #include "iem_dp.h" #include #include #include /* -------------------------- ftohex ------------------------------ */ /* float to 8 digits of hexadecimal converter */ /* float (sign_1 + exp_8 + mant_23) */ static t_class *ftohex_class; typedef struct _ftohex { t_object x_obj; } t_ftohex; static void ftohex_float(t_ftohex *x, t_floatarg f) { char buf[100]; union tabfudge_f tf; tf.tf_f = f; sprintf(buf, "#%08X", (unsigned int)tf.tf_l); outlet_symbol(x->x_obj.ob_outlet, gensym(buf)); } static void *ftohex_new(void) { t_ftohex *x = (t_ftohex *)pd_new(ftohex_class); outlet_new(&x->x_obj, &s_symbol); return (x); } void ftohex_setup(void) { ftohex_class = class_new(gensym("ftohex"), (t_newmethod)ftohex_new, 0, sizeof(t_ftohex), 0, 0); class_addfloat(ftohex_class, ftohex_float); } iem_utils-v0.0.20180206/iem_dp/src/dptosym.c0000644000175000017500000000401512630366345020563 0ustar zmoelnigzmoelnig/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_dp written by IOhannes m zmoelnig, Thomas Musil, Copyright (c) IEM KUG Graz Austria 1999 - 2007 */ /* double precision library */ #include "m_pd.h" #include "iemlib.h" #include "iem_dp.h" #include #include #include /* -------------------------- dptosym ------------------------------ */ /* double float to symbol-string of a double value converter */ /* double float is only internal used */ /* to transfer this value, we divide this double value into use one float casted value */ /* and into the difference to the accurate double value. */ /* double float (sign_1 + exp_12 + mant_51) */ static t_class *dptosym_class; typedef struct _dptosym { t_object x_obj; t_float x_float_casted_value; t_float x_residual; t_outlet *x_out_sym; t_outlet *x_out_any; } t_dptosym; static void dptosym_bang(t_dptosym *x) { char buf[100]; double d=iem_dp_calc_sum(x->x_float_casted_value, x->x_residual); t_atom at_dummy; sprintf(buf, "\"%.18g", d); outlet_anything(x->x_out_any, gensym(buf), 0, &at_dummy); outlet_symbol(x->x_out_sym, gensym(buf+1)); } static void dptosym_float(t_dptosym *x, t_floatarg f) { x->x_float_casted_value = f; // post("dptosym float float: %.12g + %.12g", x->x_float_casted_value, x->x_residual); dptosym_bang(x); } static void *dptosym_new(void) { t_dptosym *x = (t_dptosym *)pd_new(dptosym_class); floatinlet_new(&x->x_obj, &x->x_residual); x->x_float_casted_value = 0.0f; x->x_residual = 0.0f; x->x_out_sym = outlet_new(&x->x_obj, &s_symbol); x->x_out_any = outlet_new(&x->x_obj, &s_list); return (x); } void dptosym_setup(void) { dptosym_class = class_new(gensym("dptosym"), (t_newmethod)dptosym_new, 0, sizeof(t_dptosym), 0, 0); class_addbang(dptosym_class, dptosym_bang); class_addfloat(dptosym_class, dptosym_float); } iem_utils-v0.0.20180206/iem_dp/src/tabwrite_dp.c0000644000175000017500000000442412630366345021374 0ustar zmoelnigzmoelnig/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_dp written by IOhannes m zmoelnig, Thomas Musil, Copyright (c) IEM KUG Graz Austria 1999 - 2007 */ /* double precision library */ #include "m_pd.h" #include "iemlib.h" #include "iem_dp.h" /* -------------------------- tabwrite__ ------------------------------ */ /* based on miller's tabwrite which is part of pd */ static t_class *tabwrite_dp_class; typedef struct _tabwrite_dp { t_object x_obj; t_symbol *x_arrayname; t_float x_float_casted_index; t_float x_residual_index; } t_tabwrite_dp; static void *tabwrite_dp_new(t_symbol *s) { t_tabwrite_dp *x = (t_tabwrite_dp *)pd_new(tabwrite_dp_class); x->x_arrayname = s; x->x_float_casted_index = 0.0f; x->x_residual_index = 0.0f; floatinlet_new(&x->x_obj, &x->x_float_casted_index); floatinlet_new(&x->x_obj, &x->x_residual_index); return (x); } static void tabwrite_dp_float(t_tabwrite_dp *x, t_floatarg fvalue) { t_garray *a; iemarray_t *vec; int npoints; if (!(a = (t_garray *)pd_findbyclass(x->x_arrayname, garray_class))) { if (*x->x_arrayname->s_name) pd_error(x, "tabwrite__: %s: no such array", x->x_arrayname->s_name); vec = 0; } else if (!iemarray_getarray(a, &npoints, &vec)) { pd_error(x, "%s: bad template for tabwrite__", x->x_arrayname->s_name); vec = 0; } else { double findex = iem_dp_calc_sum(x->x_float_casted_index, x->x_residual_index); int n = findex; if(n < 0) n = 0; else if(n >= npoints) n = npoints - 1; if(npoints) { iemarray_setfloat(vec, n, fvalue); garray_redraw(a); } } } static void tabwrite_dp_set(t_tabwrite_dp *x, t_symbol *s) { x->x_arrayname = s; } void tabwrite_dp_setup(void) { tabwrite_dp_class = class_new(gensym("tabwrite__"), (t_newmethod)tabwrite_dp_new, 0, sizeof(t_tabwrite_dp), 0, A_DEFSYM, 0); class_addcreator((t_newmethod)tabwrite_dp_new, gensym("tabwrite''"), A_DEFSYM, 0); class_addfloat(tabwrite_dp_class, (t_method)tabwrite_dp_float); class_addmethod(tabwrite_dp_class, (t_method)tabwrite_dp_set, gensym("set"), A_SYMBOL, 0); } iem_utils-v0.0.20180206/iem_dp/src/add__.c0000644000175000017500000000432712630366345020120 0ustar zmoelnigzmoelnig/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_dp written by IOhannes m zmoelnig, Thomas Musil, Copyright (c) IEM KUG Graz Austria 1999 - 2007 */ /* double precision library */ #include "m_pd.h" #include "iemlib.h" #include "iem_dp.h" /* ------------------------ add__ or +__ ---------------------------- */ /* based on miller's +, which is part of pd, only with double precision */ static t_class *add___class; typedef struct _add__ { t_object x_obj; t_float x_coarse_left; t_float x_fine_left; t_float x_coarse_right; t_float x_fine_right; t_outlet *x_out_coarse; t_outlet *x_out_fine; } t_add__; static void add___bang(t_add__ *x) { double dsum; t_float fsum; dsum = iem_dp_calc_sum(x->x_coarse_left, x->x_fine_left) + iem_dp_calc_sum(x->x_coarse_right, x->x_fine_right); fsum = iem_dp_cast_to_float(dsum); outlet_float(x->x_out_fine, iem_dp_calc_residual(dsum, fsum)); outlet_float(x->x_out_coarse, fsum); } static void add___float(t_add__ *x, t_floatarg f) { x->x_coarse_left = f; add___bang(x); } static void *add___new(t_symbol *s, int ac, t_atom *av) { t_add__ *x = (t_add__ *)pd_new(add___class); floatinlet_new(&x->x_obj, &x->x_fine_left); floatinlet_new(&x->x_obj, &x->x_coarse_right); floatinlet_new(&x->x_obj, &x->x_fine_right); x->x_coarse_left = 0.0f; x->x_fine_left = 0.0f; if((ac > 0) && (IS_A_FLOAT(av, 0))) x->x_coarse_right = atom_getfloatarg(0, ac, av); else x->x_coarse_right = 0.0f; if((ac > 1) && (IS_A_FLOAT(av, 1))) x->x_fine_right = atom_getfloatarg(1, ac, av); else x->x_fine_right = 0.0f; x->x_out_coarse = outlet_new(&x->x_obj, &s_float); x->x_out_fine = outlet_new(&x->x_obj, &s_float); return (x); } void add___setup(void) { add___class = class_new(gensym("add__"), (t_newmethod)add___new, 0, sizeof(t_add__), 0, A_GIMME, 0); class_addcreator((t_newmethod)add___new, gensym("+__"), A_GIMME, 0); class_addcreator((t_newmethod)add___new, gensym("+''"), A_GIMME, 0); class_addbang(add___class, add___bang); class_addfloat(add___class, add___float); } iem_utils-v0.0.20180206/iem_dp/src/tabread4~~.c0000644000175000017500000000733212630366345021153 0ustar zmoelnigzmoelnig/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_dp written by IOhannes m zmoelnig, Thomas Musil, Copyright (c) IEM KUG Graz Austria 1999 - 2007 */ /* double precision library */ #include "m_pd.h" #include "iemlib.h" #include "iem_dp.h" /* -------------------------- tabread4~~ ------------------------------ */ /* based on miller's tabread4~ which is part of pd */ static t_class *tabread4_tilde_tilde_class; typedef struct _tabread4_tilde_tilde { t_object x_obj; int x_npoints; iemarray_t *x_vec; t_symbol *x_arrayname; t_float x_f; } t_tabread4_tilde_tilde; static void *tabread4_tilde_tilde_new(t_symbol *s) { t_tabread4_tilde_tilde *x = (t_tabread4_tilde_tilde *)pd_new(tabread4_tilde_tilde_class); x->x_arrayname = s; x->x_vec = 0; x->x_npoints=0; inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_signal, &s_signal); outlet_new(&x->x_obj, &s_signal); x->x_f = 0; return (x); } static t_int *tabread4_tilde_tilde_perform(t_int *w) { t_tabread4_tilde_tilde *x = (t_tabread4_tilde_tilde *)(w[1]); t_sample *in0 = (t_sample *)(w[2]); t_sample *in1 = (t_sample *)(w[3]); t_sample *out = (t_sample *)(w[4]); int n = (int)(w[5]); int maxindex; iemarray_t *buf = x->x_vec, *wp; int i; maxindex = x->x_npoints - 3; if (!buf){ while (n--) *out++ = 0; return (w+6); } // post("xxx"); for (i = 0; i < n; i++) { t_sample in0_s=*in0++; t_sample in1_s=*in1++; double findex = iem_dp_calc_sum(in0_s, in1_s); long int index = findex; double frac; t_sample a, b, c, d, cminusb; if (index < 1) index = 1, frac = 0; else if (index > maxindex) index = maxindex, frac = 1; else frac = findex - index; // post("%f + %f = %f", in0_s, in1_s, findex); // post("%f - %f = %d", findex, frac, index); wp = buf + index; a = iemarray_getfloat(wp,-1); b = iemarray_getfloat(wp, 0); c = iemarray_getfloat(wp, 1); d = iemarray_getfloat(wp, 2); cminusb = c-b; *out++ = b + frac * (cminusb - 0.1666667f * (1.-frac) * ((d - a - 3.0f * cminusb) * frac + (d + 2.0f*a - 3.0f*b))); } return (w+6); } static void tabread4_tilde_tilde_set(t_tabread4_tilde_tilde *x, t_symbol *s) { t_garray *a; x->x_arrayname = s; if (!(a = (t_garray *)pd_findbyclass(x->x_arrayname, garray_class))) { if (*s->s_name) pd_error(x, "tabread4~~: %s: no such array", x->x_arrayname->s_name); iemarray_setfloat(x->x_vec, 0, 0.0f); } else if (!iemarray_getarray(a, &x->x_npoints, &x->x_vec)) { pd_error(x, "%s: bad template for tabread4~~", x->x_arrayname->s_name); iemarray_setfloat(x->x_vec, 0, 0.0f); } else garray_usedindsp(a); } static void tabread4_tilde_tilde_dsp(t_tabread4_tilde_tilde *x, t_signal **sp) { tabread4_tilde_tilde_set(x, x->x_arrayname); dsp_add(tabread4_tilde_tilde_perform, 5, x, sp[0]->s_vec, sp[1]->s_vec, sp[2]->s_vec, sp[0]->s_n); } static void tabread4_tilde_tilde_free(t_tabread4_tilde_tilde *x) { } void tabread4_tilde_tilde_setup(void) { tabread4_tilde_tilde_class = class_new(gensym("tabread4~~"), (t_newmethod)tabread4_tilde_tilde_new, (t_method)tabread4_tilde_tilde_free, sizeof(t_tabread4_tilde_tilde), 0, A_DEFSYM, 0); CLASS_MAINSIGNALIN(tabread4_tilde_tilde_class, t_tabread4_tilde_tilde, x_f); class_addmethod(tabread4_tilde_tilde_class, (t_method)tabread4_tilde_tilde_dsp, gensym("dsp"), 0); class_addmethod(tabread4_tilde_tilde_class, (t_method)tabread4_tilde_tilde_set, gensym("set"), A_SYMBOL, 0); } iem_utils-v0.0.20180206/iem_dp/src/add~~.c0000644000175000017500000002044112630366345020211 0ustar zmoelnigzmoelnig/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_dp written by IOhannes m zmoelnig, Thomas Musil, Copyright (c) IEM KUG Graz Austria 1999 - 2007 */ /* double precision library */ #include "m_pd.h" #include "iemlib.h" #include "iem_dp.h" /* -------------------------- add~~ ------------------------------ */ /* based on miller's +~ which is part of pd */ static t_class *add_tilde_tilde_class, *scalaradd_tilde_tilde_class; typedef struct _add_tilde_tilde { t_object x_obj; t_float x_f; t_sample *x_in1_coarse; t_sample *x_in1_fine; t_sample *x_in2_coarse; t_sample *x_in2_fine; t_sample *x_out_coarse; t_sample *x_out_fine; } t_add_tilde_tilde; typedef struct _scalaradd_tilde_tilde { t_object x_obj; t_float x_f; t_sample *x_in1_coarse; t_sample *x_in1_fine; t_sample *x_out_coarse; t_sample *x_out_fine; t_sample x_in2_coarse; t_sample x_in2_fine; } t_scalaradd_tilde_tilde; static void *add_tilde_tilde_new(t_symbol *s, int argc, t_atom *argv) { if(((argc==1)&&(argv->a_type == A_FLOAT))||(argc>=2)&&(argv->a_type == A_FLOAT)&&((argv+1)->a_type == A_FLOAT)) { t_scalaradd_tilde_tilde *x = (t_scalaradd_tilde_tilde *)pd_new(scalaradd_tilde_tilde_class); inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_signal, &s_signal); floatinlet_new(&x->x_obj, &x->x_in2_coarse); floatinlet_new(&x->x_obj, &x->x_in2_fine); x->x_in2_coarse = atom_getfloatarg(0, argc, argv); if(argc>=2) x->x_in2_fine = atom_getfloatarg(1, argc, argv); else x->x_in2_fine = 0; outlet_new(&x->x_obj, &s_signal); outlet_new(&x->x_obj, &s_signal); x->x_f = 0; return (x); } else /* either no arguments or symbols */ { t_add_tilde_tilde *x = (t_add_tilde_tilde *)pd_new(add_tilde_tilde_class); inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_signal, &s_signal); inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_signal, &s_signal); inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_signal, &s_signal); outlet_new(&x->x_obj, &s_signal); outlet_new(&x->x_obj, &s_signal); x->x_f = 0; return (x); } } static t_int *add_tilde_tilde_perform(t_int *w) { t_add_tilde_tilde *x = (t_add_tilde_tilde *)(w[1]); int n = (int)(w[2]); t_sample *in1c = x->x_in1_coarse; t_sample *in1f = x->x_in1_fine; t_sample *in2c = x->x_in2_coarse; t_sample *in2f = x->x_in2_fine; t_sample *outc = x->x_out_coarse; t_sample *outf = x->x_out_fine; double d; t_float f; while(n--) { d = iem_dp_calc_sum(*in1c++, *in1f++) + iem_dp_calc_sum(*in2c++, *in2f++); f = iem_dp_cast_to_float(d); *outf++ = iem_dp_calc_residual(d, f); *outc++ = f; } return(w+3); } static t_int *add_tilde_tilde_perf8(t_int *w) { t_add_tilde_tilde *x = (t_add_tilde_tilde *)(w[1]); int n = (int)(w[2]); t_sample *in1c = x->x_in1_coarse; t_sample *in1f = x->x_in1_fine; t_sample *in2c = x->x_in2_coarse; t_sample *in2f = x->x_in2_fine; t_sample *outc = x->x_out_coarse; t_sample *outf = x->x_out_fine; for(; n; n -= 8, in1c += 8, in1f += 8, in2c += 8, in2f += 8, outc += 8, outf += 8) { double d; t_float f; d = iem_dp_calc_sum(in1c[0], in1f[0]) + iem_dp_calc_sum(in2c[0], in2f[0]); f = iem_dp_cast_to_float(d); outf[0] = iem_dp_calc_residual(d, f); outc[0] = f; d = iem_dp_calc_sum(in1c[1], in1f[1]) + iem_dp_calc_sum(in2c[1], in2f[1]); f = iem_dp_cast_to_float(d); outf[1] = iem_dp_calc_residual(d, f); outc[1] = f; d = iem_dp_calc_sum(in1c[2], in1f[2]) + iem_dp_calc_sum(in2c[2], in2f[2]); f = iem_dp_cast_to_float(d); outf[2] = iem_dp_calc_residual(d, f); outc[2] = f; d = iem_dp_calc_sum(in1c[3], in1f[3]) + iem_dp_calc_sum(in2c[3], in2f[3]); f = iem_dp_cast_to_float(d); outf[3] = iem_dp_calc_residual(d, f); outc[3] = f; d = iem_dp_calc_sum(in1c[4], in1f[4]) + iem_dp_calc_sum(in2c[4], in2f[4]); f = iem_dp_cast_to_float(d); outf[4] = iem_dp_calc_residual(d, f); outc[4] = f; d = iem_dp_calc_sum(in1c[5], in1f[5]) + iem_dp_calc_sum(in2c[5], in2f[5]); f = iem_dp_cast_to_float(d); outf[5] = iem_dp_calc_residual(d, f); outc[5] = f; d = iem_dp_calc_sum(in1c[6], in1f[6]) + iem_dp_calc_sum(in2c[6], in2f[6]); f = iem_dp_cast_to_float(d); outf[6] = iem_dp_calc_residual(d, f); outc[6] = f; d = iem_dp_calc_sum(in1c[7], in1f[7]) + iem_dp_calc_sum(in2c[7], in2f[7]); f = iem_dp_cast_to_float(d); outf[7] = iem_dp_calc_residual(d, f); outc[7] = f; } return(w+3); } static t_int *scalaradd_tilde_tilde_perform(t_int *w) { t_scalaradd_tilde_tilde *x = (t_scalaradd_tilde_tilde *)(w[1]); int n = (int)(w[2]); t_sample *inc = x->x_in1_coarse; t_sample *inf = x->x_in1_fine; t_sample *outc = x->x_out_coarse; t_sample *outf = x->x_out_fine; double d, g=iem_dp_calc_sum(x->x_in2_coarse, x->x_in2_fine); t_float f; while(n--) { d = iem_dp_calc_sum(*inc++, *inf++) + g; f = iem_dp_cast_to_float(d); *outf++ = iem_dp_calc_residual(d, f); *outc++ = f; } return(w+3); } static t_int *scalaradd_tilde_tilde_perf8(t_int *w) { t_scalaradd_tilde_tilde *x = (t_scalaradd_tilde_tilde *)(w[1]); int n = (int)(w[2]); t_sample *inc = x->x_in1_coarse; t_sample *inf = x->x_in1_fine; t_sample *outc = x->x_out_coarse; t_sample *outf = x->x_out_fine; double g=iem_dp_calc_sum(x->x_in2_coarse, x->x_in2_fine); for(; n; n -= 8, inc += 8, inf += 8, outc += 8, outf += 8) { double d; t_float f; d = iem_dp_calc_sum(inc[0], inf[0]) + g; f = iem_dp_cast_to_float(d); outf[0] = iem_dp_calc_residual(d, f); outc[0] = f; d = iem_dp_calc_sum(inc[1], inf[1]) + g; f = iem_dp_cast_to_float(d); outf[1] = iem_dp_calc_residual(d, f); outc[1] = f; d = iem_dp_calc_sum(inc[2], inf[2]) + g; f = iem_dp_cast_to_float(d); outf[2] = iem_dp_calc_residual(d, f); outc[2] = f; d = iem_dp_calc_sum(inc[3], inf[3]) + g; f = iem_dp_cast_to_float(d); outf[3] = iem_dp_calc_residual(d, f); outc[3] = f; d = iem_dp_calc_sum(inc[4], inf[4]) + g; f = iem_dp_cast_to_float(d); outf[4] = iem_dp_calc_residual(d, f); outc[4] = f; d = iem_dp_calc_sum(inc[5], inf[5]) + g; f = iem_dp_cast_to_float(d); outf[5] = iem_dp_calc_residual(d, f); outc[5] = f; d = iem_dp_calc_sum(inc[6], inf[6]) + g; f = iem_dp_cast_to_float(d); outf[6] = iem_dp_calc_residual(d, f); outc[6] = f; d = iem_dp_calc_sum(inc[7], inf[7]) + g; f = iem_dp_cast_to_float(d); outf[7] = iem_dp_calc_residual(d, f); outc[7] = f; } return(w+3); } static void add_tilde_tilde_dsp(t_add_tilde_tilde *x, t_signal **sp) { x->x_in1_coarse = sp[0]->s_vec; x->x_in1_fine = sp[1]->s_vec; x->x_in2_coarse = sp[2]->s_vec; x->x_in2_fine = sp[3]->s_vec; x->x_out_coarse = sp[4]->s_vec; x->x_out_fine = sp[5]->s_vec; if(sp[0]->s_n&7) dsp_add(add_tilde_tilde_perform, 2, x, sp[0]->s_n); else dsp_add(add_tilde_tilde_perf8, 2, x, sp[0]->s_n); } static void scalaradd_tilde_tilde_dsp(t_scalaradd_tilde_tilde *x, t_signal **sp) { x->x_in1_coarse = sp[0]->s_vec; x->x_in1_fine = sp[1]->s_vec; x->x_out_coarse = sp[2]->s_vec; x->x_out_fine = sp[3]->s_vec; if(sp[0]->s_n&7) dsp_add(scalaradd_tilde_tilde_perform, 2, x, sp[0]->s_n); else dsp_add(scalaradd_tilde_tilde_perf8, 2, x, sp[0]->s_n); } void add_tilde_tilde_setup(void) { add_tilde_tilde_class = class_new(gensym("+~~"), (t_newmethod)add_tilde_tilde_new, 0, sizeof(t_add_tilde_tilde), 0, A_GIMME, 0); class_addcreator((t_newmethod)add_tilde_tilde_new, gensym("add~~"), A_GIMME, 0); CLASS_MAINSIGNALIN(add_tilde_tilde_class, t_add_tilde_tilde, x_f); class_addmethod(add_tilde_tilde_class, (t_method)add_tilde_tilde_dsp, gensym("dsp"), 0); scalaradd_tilde_tilde_class = class_new(gensym("+~~"), 0, 0, sizeof(t_scalaradd_tilde_tilde), 0, 0); CLASS_MAINSIGNALIN(scalaradd_tilde_tilde_class, t_scalaradd_tilde_tilde, x_f); class_addmethod(scalaradd_tilde_tilde_class, (t_method)scalaradd_tilde_tilde_dsp, gensym("dsp"), 0); } iem_utils-v0.0.20180206/iem_dp/src/tabread4_dp.c0000644000175000017500000000516112630366345021240 0ustar zmoelnigzmoelnig/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_dp written by IOhannes m zmoelnig, Thomas Musil, Copyright (c) IEM KUG Graz Austria 1999 - 2007 */ /* double precision library */ #include "m_pd.h" #include "iemlib.h" #include "iem_dp.h" /* -------------------------- tabread4__ ------------------------------ */ /* based on miller's tabread4 which is part of pd */ static t_class *tabread4_dp_class; typedef struct _tabread4_dp { t_object x_obj; t_symbol *x_arrayname; t_float x_residual; } t_tabread4_dp; static void *tabread4_dp_new(t_symbol *s) { t_tabread4_dp *x = (t_tabread4_dp *)pd_new(tabread4_dp_class); x->x_arrayname = s; floatinlet_new(&x->x_obj, &x->x_residual); outlet_new(&x->x_obj, &s_float); return (x); } static void tabread4_dp_float(t_tabread4_dp *x, t_floatarg f) { t_garray *ga; iemarray_t *vec; int npoints; if(!(ga = (t_garray *)pd_findbyclass(x->x_arrayname, garray_class))) { if(*x->x_arrayname->s_name) pd_error(x, "tabread4__: %s: no such array", x->x_arrayname->s_name); iemarray_setfloat(vec, 0, 0.0f); } else if (!iemarray_getarray(ga, &npoints, &vec)) { pd_error(x, "%s: bad template for tabread4__", x->x_arrayname->s_name); iemarray_setfloat(vec, 0, 0.0f); } else { double findex = iem_dp_calc_sum(f, x->x_residual); double frac; int index = findex; int maxindex = npoints - 3; t_sample a, b, c, d, cmb; if(index < 1) index = 1, frac = 0; else if (index > maxindex) index = maxindex, frac = 1; else frac = findex - index; vec += index; a = iemarray_getfloat(vec,-1); b = iemarray_getfloat(vec, 0); c = iemarray_getfloat(vec, 1); d = iemarray_getfloat(vec, 2); cmb = c-b; outlet_float(x->x_obj.ob_outlet, (npoints ? b+frac*(cmb-0.1666667f*(1.-frac)*((d-a-3.0f*cmb)*frac+(d+2.0f*a-3.0f*b))) : 0)); } } static void tabread4_dp_set(t_tabread4_dp *x, t_symbol *s) { x->x_arrayname = s; } static void tabread4_dp_free(t_tabread4_dp *x) { } void tabread4_dp_setup(void) { tabread4_dp_class = class_new(gensym("tabread4__"), (t_newmethod)tabread4_dp_new, (t_method)tabread4_dp_free, sizeof(t_tabread4_dp), 0, A_DEFSYM, 0); class_addcreator((t_newmethod)tabread4_dp_new, gensym("tabread4''"), A_DEFSYM, 0); class_addfloat(tabread4_dp_class, (t_method)tabread4_dp_float); class_addmethod(tabread4_dp_class, (t_method)tabread4_dp_set, gensym("set"), A_SYMBOL, 0); } iem_utils-v0.0.20180206/iem_dp/src/mul~~.c0000644000175000017500000002043412630366345020260 0ustar zmoelnigzmoelnig/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_dp written by IOhannes m zmoelnig, Thomas Musil, Copyright (c) IEM KUG Graz Austria 1999 - 2007 */ /* double precision library */ #include "m_pd.h" #include "iemlib.h" #include "iem_dp.h" /* -------------------------- mul~~ ------------------------------ */ /* based on miller's *~ which is part of pd */ static t_class *mul_tilde_tilde_class, *scalarmul_tilde_tilde_class; typedef struct _mul_tilde_tilde { t_object x_obj; t_float x_f; t_sample *x_in1_coarse; t_sample *x_in1_fine; t_sample *x_in2_coarse; t_sample *x_in2_fine; t_sample *x_out_coarse; t_sample *x_out_fine; } t_mul_tilde_tilde; typedef struct _scalarmul_tilde_tilde { t_object x_obj; t_float x_f; t_sample *x_in1_coarse; t_sample *x_in1_fine; t_sample *x_out_coarse; t_sample *x_out_fine; t_sample x_in2_coarse; t_sample x_in2_fine; } t_scalarmul_tilde_tilde; static void *mul_tilde_tilde_new(t_symbol *s, int argc, t_atom *argv) { if(((argc==1)&&(argv->a_type == A_FLOAT))||(argc>=2)&&(argv->a_type == A_FLOAT)&&((argv+1)->a_type == A_FLOAT)) { t_scalarmul_tilde_tilde *x = (t_scalarmul_tilde_tilde *)pd_new(scalarmul_tilde_tilde_class); inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_signal, &s_signal); floatinlet_new(&x->x_obj, &x->x_in2_coarse); floatinlet_new(&x->x_obj, &x->x_in2_fine); x->x_in2_coarse = atom_getfloatarg(0, argc, argv); if(argc>=2) x->x_in2_fine = atom_getfloatarg(1, argc, argv); else x->x_in2_fine = 0; outlet_new(&x->x_obj, &s_signal); outlet_new(&x->x_obj, &s_signal); x->x_f = 0; return (x); } else /* either no arguments or symbols */ { t_mul_tilde_tilde *x = (t_mul_tilde_tilde *)pd_new(mul_tilde_tilde_class); inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_signal, &s_signal); inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_signal, &s_signal); inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_signal, &s_signal); outlet_new(&x->x_obj, &s_signal); outlet_new(&x->x_obj, &s_signal); x->x_f = 0; return (x); } } static t_int *mul_tilde_tilde_perform(t_int *w) { t_mul_tilde_tilde *x = (t_mul_tilde_tilde *)(w[1]); int n = (int)(w[2]); t_sample *in1c = x->x_in1_coarse; t_sample *in1f = x->x_in1_fine; t_sample *in2c = x->x_in2_coarse; t_sample *in2f = x->x_in2_fine; t_sample *outc = x->x_out_coarse; t_sample *outf = x->x_out_fine; double d; t_float f; while(n--) { d = iem_dp_calc_sum(*in1c++, *in1f++) * iem_dp_calc_sum(*in2c++, *in2f++); f = iem_dp_cast_to_float(d); *outf++ = iem_dp_calc_residual(d, f); *outc++ = f; } return(w+3); } static t_int *mul_tilde_tilde_perf8(t_int *w) { t_mul_tilde_tilde *x = (t_mul_tilde_tilde *)(w[1]); int n = (int)(w[2]); t_sample *in1c = x->x_in1_coarse; t_sample *in1f = x->x_in1_fine; t_sample *in2c = x->x_in2_coarse; t_sample *in2f = x->x_in2_fine; t_sample *outc = x->x_out_coarse; t_sample *outf = x->x_out_fine; for(; n; n -= 8, in1c += 8, in1f += 8, in2c += 8, in2f += 8, outc += 8, outf += 8) { double d; t_float f; d = iem_dp_calc_sum(in1c[0], in1f[0]) * iem_dp_calc_sum(in2c[0], in2f[0]); f = iem_dp_cast_to_float(d); outf[0] = iem_dp_calc_residual(d, f); outc[0] = f; d = iem_dp_calc_sum(in1c[1], in1f[1]) * iem_dp_calc_sum(in2c[1], in2f[1]); f = iem_dp_cast_to_float(d); outf[1] = iem_dp_calc_residual(d, f); outc[1] = f; d = iem_dp_calc_sum(in1c[2], in1f[2]) * iem_dp_calc_sum(in2c[2], in2f[2]); f = iem_dp_cast_to_float(d); outf[2] = iem_dp_calc_residual(d, f); outc[2] = f; d = iem_dp_calc_sum(in1c[3], in1f[3]) * iem_dp_calc_sum(in2c[3], in2f[3]); f = iem_dp_cast_to_float(d); outf[3] = iem_dp_calc_residual(d, f); outc[3] = f; d = iem_dp_calc_sum(in1c[4], in1f[4]) * iem_dp_calc_sum(in2c[4], in2f[4]); f = iem_dp_cast_to_float(d); outf[4] = iem_dp_calc_residual(d, f); outc[4] = f; d = iem_dp_calc_sum(in1c[5], in1f[5]) * iem_dp_calc_sum(in2c[5], in2f[5]); f = iem_dp_cast_to_float(d); outf[5] = iem_dp_calc_residual(d, f); outc[5] = f; d = iem_dp_calc_sum(in1c[6], in1f[6]) * iem_dp_calc_sum(in2c[6], in2f[6]); f = iem_dp_cast_to_float(d); outf[6] = iem_dp_calc_residual(d, f); outc[6] = f; d = iem_dp_calc_sum(in1c[7], in1f[7]) * iem_dp_calc_sum(in2c[7], in2f[7]); f = iem_dp_cast_to_float(d); outf[7] = iem_dp_calc_residual(d, f); outc[7] = f; } return(w+3); } static t_int *scalarmul_tilde_tilde_perform(t_int *w) { t_scalarmul_tilde_tilde *x = (t_scalarmul_tilde_tilde *)(w[1]); int n = (int)(w[2]); t_sample *inc = x->x_in1_coarse; t_sample *inf = x->x_in1_fine; t_sample *outc = x->x_out_coarse; t_sample *outf = x->x_out_fine; double d, g=iem_dp_calc_sum(x->x_in2_coarse, x->x_in2_fine); t_float f; while(n--) { d = iem_dp_calc_sum(*inc++, *inf++) * g; f = iem_dp_cast_to_float(d); *outf++ = iem_dp_calc_residual(d, f); *outc++ = f; } return(w+3); } static t_int *scalarmul_tilde_tilde_perf8(t_int *w) { t_scalarmul_tilde_tilde *x = (t_scalarmul_tilde_tilde *)(w[1]); int n = (int)(w[2]); t_sample *inc = x->x_in1_coarse; t_sample *inf = x->x_in1_fine; t_sample *outc = x->x_out_coarse; t_sample *outf = x->x_out_fine; double g=iem_dp_calc_sum(x->x_in2_coarse, x->x_in2_fine); for(; n; n -= 8, inc += 8, inf += 8, outc += 8, outf += 8) { double d; t_float f; d = iem_dp_calc_sum(inc[0], inf[0]) * g; f = iem_dp_cast_to_float(d); outf[0] = iem_dp_calc_residual(d, f); outc[0] = f; d = iem_dp_calc_sum(inc[1], inf[1]) * g; f = iem_dp_cast_to_float(d); outf[1] = iem_dp_calc_residual(d, f); outc[1] = f; d = iem_dp_calc_sum(inc[2], inf[2]) * g; f = iem_dp_cast_to_float(d); outf[2] = iem_dp_calc_residual(d, f); outc[2] = f; d = iem_dp_calc_sum(inc[3], inf[3]) * g; f = iem_dp_cast_to_float(d); outf[3] = iem_dp_calc_residual(d, f); outc[3] = f; d = iem_dp_calc_sum(inc[4], inf[4]) * g; f = iem_dp_cast_to_float(d); outf[4] = iem_dp_calc_residual(d, f); outc[4] = f; d = iem_dp_calc_sum(inc[5], inf[5]) * g; f = iem_dp_cast_to_float(d); outf[5] = iem_dp_calc_residual(d, f); outc[5] = f; d = iem_dp_calc_sum(inc[6], inf[6]) * g; f = iem_dp_cast_to_float(d); outf[6] = iem_dp_calc_residual(d, f); outc[6] = f; d = iem_dp_calc_sum(inc[7], inf[7]) * g; f = iem_dp_cast_to_float(d); outf[7] = iem_dp_calc_residual(d, f); outc[7] = f; } return(w+3); } static void mul_tilde_tilde_dsp(t_mul_tilde_tilde *x, t_signal **sp) { x->x_in1_coarse = sp[0]->s_vec; x->x_in1_fine = sp[1]->s_vec; x->x_in2_coarse = sp[2]->s_vec; x->x_in2_fine = sp[3]->s_vec; x->x_out_coarse = sp[4]->s_vec; x->x_out_fine = sp[5]->s_vec; if(sp[0]->s_n&7) dsp_add(mul_tilde_tilde_perform, 2, x, sp[0]->s_n); else dsp_add(mul_tilde_tilde_perf8, 2, x, sp[0]->s_n); } static void scalarmul_tilde_tilde_dsp(t_scalarmul_tilde_tilde *x, t_signal **sp) { x->x_in1_coarse = sp[0]->s_vec; x->x_in1_fine = sp[1]->s_vec; x->x_out_coarse = sp[2]->s_vec; x->x_out_fine = sp[3]->s_vec; if(sp[0]->s_n&7) dsp_add(scalarmul_tilde_tilde_perform, 2, x, sp[0]->s_n); else dsp_add(scalarmul_tilde_tilde_perf8, 2, x, sp[0]->s_n); } void mul_tilde_tilde_setup(void) { mul_tilde_tilde_class = class_new(gensym("*~~"), (t_newmethod)mul_tilde_tilde_new, 0, sizeof(t_mul_tilde_tilde), 0, A_GIMME, 0); class_addcreator((t_newmethod)mul_tilde_tilde_new, gensym("mul~~"), A_GIMME, 0); CLASS_MAINSIGNALIN(mul_tilde_tilde_class, t_mul_tilde_tilde, x_f); class_addmethod(mul_tilde_tilde_class, (t_method)mul_tilde_tilde_dsp, gensym("dsp"), 0); scalarmul_tilde_tilde_class = class_new(gensym("*~~"), 0, 0, sizeof(t_scalarmul_tilde_tilde), 0, 0); CLASS_MAINSIGNALIN(scalarmul_tilde_tilde_class, t_scalarmul_tilde_tilde, x_f); class_addmethod(scalarmul_tilde_tilde_class, (t_method)scalarmul_tilde_tilde_dsp, gensym("dsp"), 0); } iem_utils-v0.0.20180206/iem_dp/src/phasor~~.c0000644000175000017500000000513312630366345020756 0ustar zmoelnigzmoelnig/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_dp written by IOhannes m zmoelnig, Thomas Musil, Copyright (c) IEM KUG Graz Austria 1999 - 2007 */ /* double precision library */ #include "m_pd.h" #include "iemlib.h" #include "iem_dp.h" /* -------------------------- phasor~~ ------------------------------ */ /* based on miller's phasor~ which is part of pd */ static t_class *phasor_tilde_tilde_class, *scalarphasor_tilde_tilde_class; typedef struct _phasor_tilde_tilde { t_object x_obj; double x_phase; double x_rcp_sr; t_float x_freq; } t_phasor_tilde_tilde; static void *phasor_tilde_tilde_new(t_floatarg freq) { t_phasor_tilde_tilde *x = (t_phasor_tilde_tilde *)pd_new(phasor_tilde_tilde_class); inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_float, gensym("ft1")); x->x_phase = 0; x->x_rcp_sr = 0; outlet_new(&x->x_obj, &s_signal); outlet_new(&x->x_obj, &s_signal); x->x_freq = freq; return(x); } static t_int *phasor_tilde_tilde_perform(t_int *w) { t_phasor_tilde_tilde *x = (t_phasor_tilde_tilde *)(w[1]); t_sample *freq_in = (t_sample *)(w[2]); t_sample *outc = (t_sample *)(w[3]); t_sample *outf = (t_sample *)(w[4]); int n = (int)(w[5]); double dphase = x->x_phase; double rcp_sr = x->x_rcp_sr; double fin; t_float fphase; int k; while(n--) { fin = (double)*freq_in++; k = (int)dphase; if(dphase >= 0) dphase -= (double)k; else dphase -= (double)(k-1); fphase = iem_dp_cast_to_float(dphase); *outf++ = iem_dp_calc_residual(dphase, fphase); *outc++ = fphase; dphase += fin * rcp_sr; } x->x_phase = dphase; return(w+6); } static void phasor_tilde_tilde_dsp(t_phasor_tilde_tilde *x, t_signal **sp) { x->x_rcp_sr = (double)(1.0)/(double)(sp[0]->s_sr); dsp_add(phasor_tilde_tilde_perform, 5, x, sp[0]->s_vec, sp[1]->s_vec, sp[2]->s_vec, sp[0]->s_n); } static void phasor_tilde_tilde_ft1(t_phasor_tilde_tilde *x, t_floatarg ph) { x->x_phase = (double)ph; } void phasor_tilde_tilde_setup(void) { phasor_tilde_tilde_class = class_new(gensym("phasor~~"), (t_newmethod)phasor_tilde_tilde_new, 0, sizeof(t_phasor_tilde_tilde), 0, A_DEFFLOAT, 0); CLASS_MAINSIGNALIN(phasor_tilde_tilde_class, t_phasor_tilde_tilde, x_freq); class_addmethod(phasor_tilde_tilde_class, (t_method)phasor_tilde_tilde_dsp, gensym("dsp"), 0); class_addmethod(phasor_tilde_tilde_class, (t_method)phasor_tilde_tilde_ft1, gensym("ft1"), A_FLOAT, 0); } iem_utils-v0.0.20180206/iem_dp/dptohex-help.pd0000644000175000017500000001071212630366345021060 0ustar zmoelnigzmoelnig#N canvas 159 54 987 753 10; #X floatatom 143 239 11 0 0 0 - - -; #X floatatom 120 266 11 0 0 0 - - -; #X symbolatom 21 380 25 0 0 0 - - -; #X symbolatom 473 281 25 0 0 0 - - -; #X obj 472 222 + 3.1415; #X msg 472 201 9.26536e-05; #X text 526 258 7-8 digits accurate; #X text 229 238 difference; #X text 204 265 truncated; #X text 203 380 internal value; #X text 664 617 IEM KUG; #X text 648 605 musil; #X text 685 605 @; #X text 694 605 iem.at; #X text 647 627 Graz \, Austria; #X text 707 579 @; #X text 716 579 iem.at; #X text 648 579 zmoelnig; #X text 75 53 the inputs are two floats \, left one is the float-truncated value of a double value \, the right one is the difference between double value and the float-truncated.; #X text 74 112 output is a symbol:hexadeximal of sum of both double casted inputs; #X symbolatom 104 459 25 0 0 0 - - -; #X obj 36 313 +__ 2; #X symbolatom 159 337 25 0 0 0 - - -; #X msg 668 440 1e-23; #X symbolatom 645 493 25 0 0 0 - - -; #X obj 644 470 ftohex; #X msg 719 440 2e-23; #X msg 773 440 4e-23; #X msg 824 440 8e-23; #X msg 707 361 1e+19; #X msg 756 360 1e+20; #X symbolatom 318 579 25 0 0 0 - - -; #X msg 670 385 1e-18; #X msg 719 385 1e-19; #X text 70 13 double to hexadecimal converter (only for debugging purpose) ; #X msg 20 149 "0.000000000000000001; #X msg 21 175 "1e-18; #X msg 19 199 "1e-23; #X msg 709 95 "22.2222222233; #X msg 708 71 "44.4444444444; #X msg 708 48 "44.444444444444; #X msg 710 119 "22.2222222222; #X msg 710 142 "-22.2222222222; #X msg 555 81 "1.234; #X msg 558 106 "1.9999; #X msg 562 131 "2.00123; #X msg 491 154 "0.987; #X msg 627 175 "1e-14; #X msg 384 388 "1e+19; #X msg 436 388 "1e+20; #X msg 396 413 "-1e+19; #X msg 456 413 "-1e+20; #X msg 365 448 "1e-18; #X msg 423 449 "1e-19; #X msg 377 471 "-1e-18; #X msg 423 513 "2; #X msg 441 473 "-1e-19; #N canvas 0 22 907 755 (subpatch) 0; #X symbolatom 317 582 25 0 0 0 - - -; #X msg 396 413 "-1e+19; #X msg 456 413 "-1e+20; #X msg 365 448 "1e-18; #X msg 423 449 "1e-19; #X msg 377 471 "-1e-18; #X msg 423 513 "2; #X msg 441 473 "-1e-19; #X symbolatom 163 312 10 0 0 0 - - -; #X obj 162 290 makefilename "1e%d; #X floatatom 163 254 5 -78 78 0 - - -; #X obj 164 334 unsymbol; #X symbolatom 314 311 10 0 0 0 - - -; #X floatatom 314 253 5 -46 39 0 - - -; #X obj 315 333 unsymbol; #X obj 313 289 makefilename "-1e%d; #X obj 316 559 dptohex; #X obj 317 531 symtodp; #X connect 1 0 17 0; #X connect 2 0 17 0; #X connect 3 0 17 0; #X connect 4 0 17 0; #X connect 5 0 17 0; #X connect 6 0 17 0; #X connect 7 0 17 0; #X connect 8 0 11 0; #X connect 9 0 8 0; #X connect 10 0 9 0; #X connect 11 0 17 0; #X connect 12 0 14 0; #X connect 13 0 15 0; #X connect 14 0 17 0; #X connect 15 0 12 0; #X connect 16 0 0 0; #X connect 17 0 16 0; #X connect 17 1 16 1; #X restore 76 577 pd; #X obj 548 377 pow; #X msg 546 355 10 \$1; #X floatatom 545 335 5 -46 39 0 - - -; #X floatatom 549 400 0 0 0 0 - - -; #X obj 595 376 pow; #X msg 593 354 10 \$1; #X floatatom 592 334 5 -46 39 0 - - -; #X floatatom 600 423 0 0 0 0 - - -; #X obj 598 400 * -1; #X obj 472 258 dptohex; #X obj 317 556 dptohex; #X obj 20 357 dptohex; #X obj 158 314 dptohex; #X obj 103 436 dptosym; #X text 14 12 dptohex; #X text 199 196 15 digits accurate; #X msg 94 169 "3.14159265358979; #X msg 100 477 "3.14159265358979; #X text 37 478 should be; #X obj 117 195 symtodp; #X obj 317 531 symtodp; #X text 599 566 (c) IOhannes m zmoelnig 1999 - 2013; #X text 599 594 (c) Thomas Musil 2000 - 2013; #X connect 4 0 67 0; #X connect 5 0 4 0; #X connect 21 0 69 0; #X connect 21 1 69 1; #X connect 23 0 25 0; #X connect 25 0 24 0; #X connect 26 0 25 0; #X connect 27 0 25 0; #X connect 28 0 25 0; #X connect 29 0 25 0; #X connect 30 0 25 0; #X connect 32 0 25 0; #X connect 33 0 25 0; #X connect 35 0 77 0; #X connect 36 0 77 0; #X connect 37 0 77 0; #X connect 48 0 78 0; #X connect 49 0 78 0; #X connect 50 0 78 0; #X connect 51 0 78 0; #X connect 52 0 78 0; #X connect 53 0 78 0; #X connect 54 0 78 0; #X connect 55 0 78 0; #X connect 56 0 78 0; #X connect 58 0 61 0; #X connect 59 0 58 0; #X connect 60 0 59 0; #X connect 61 0 25 0; #X connect 62 0 66 0; #X connect 63 0 62 0; #X connect 64 0 63 0; #X connect 65 0 25 0; #X connect 66 0 65 0; #X connect 67 0 3 0; #X connect 68 0 31 0; #X connect 69 0 2 0; #X connect 70 0 22 0; #X connect 71 0 20 0; #X connect 74 0 77 0; #X connect 77 0 1 0; #X connect 77 0 21 0; #X connect 77 0 70 0; #X connect 77 0 71 0; #X connect 77 1 0 0; #X connect 77 1 21 1; #X connect 77 1 70 1; #X connect 77 1 71 1; #X connect 78 0 68 0; #X connect 78 1 68 1; iem_utils-v0.0.20180206/iem_dp/wrap~~-help.pd0000644000175000017500000000243112630366345020751 0ustar zmoelnigzmoelnig#N canvas 78 22 598 414 10; #X obj 30 19 tgl 15 0 empty empty empty 20 8 0 10 -262144 -1 -1 0 1 ; #X floatatom 30 86 5 0 0 0 - - -; #X floatatom 46 64 3 0 0 0 - - -; #X obj 30 41 dsp; #X text 290 39 see also:; #X text 360 283 IEM KUG; #X text 344 271 musil; #X text 381 271 @; #X text 390 271 iem.at; #X text 343 293 Graz \, Austria; #X text 403 245 @; #X text 412 245 iem.at; #X text 344 245 zmoelnig; #X obj 357 40 wrap~; #X obj 145 292 metro 500; #X floatatom 34 116 0 0 0 0 - - -; #X floatatom 36 360 0 0 0 0 - - -; #X obj 36 327 snapshot~; #X obj 34 142 sig~; #X text 86 -9 - remainder modulo 1; #X text 65 115 <-- shift-drag here to get non-integers to try; #X text 15 -10 wrap~~; #X obj 145 267 loadbang; #X obj 34 221 wrap~~; #X text 83 208 <-- fine inlet; #X text 83 237 <-- fine outlet; #X obj 72 182 *~ 0.01; #X floatatom 104 360 0 0 0 0 - - -; #X obj 104 327 snapshot~; #X text 295 232 (c) IOhannes m zmoelnig 1999 - 2013; #X text 295 260 (c) Thomas Musil 2000 - 2013; #X connect 0 0 3 0; #X connect 3 0 1 0; #X connect 3 1 2 0; #X connect 14 0 17 0; #X connect 14 0 28 0; #X connect 15 0 18 0; #X connect 17 0 16 0; #X connect 18 0 23 0; #X connect 18 0 26 0; #X connect 22 0 14 0; #X connect 22 0 14 0; #X connect 23 0 17 0; #X connect 23 1 28 0; #X connect 26 0 23 1; #X connect 28 0 27 0; iem_utils-v0.0.20180206/iem_dp/min__-help.pd0000644000175000017500000000255212630366345020471 0ustar zmoelnigzmoelnig#N canvas 223 169 932 536 10; #X symbolatom 167 326 25 0 0 0 - - -; #X text 104 453 IEM KUG; #X text 88 441 musil; #X text 125 441 @; #X text 134 441 iem.at; #X text 87 463 Graz \, Austria; #X text 147 415 @; #X text 156 415 iem.at; #X text 88 415 zmoelnig; #X floatatom 251 245 11 0 0 0 - - -; #X floatatom 227 273 11 0 0 0 - - -; #X text 337 244 difference; #X text 311 272 float casted; #X text 349 326 product displayed via a symbol; #X text 258 73 = symbol selector of an anything; #X text 248 62 double precision number beginning with a "double quote" =; #X text 479 109 = symbol selector of an anything; #X text 469 98 double precision number beginning with a "double quote" =; #X obj 166 303 dptosym; #X msg 163 61 "1.111111112; #X msg 385 98 "1.111111113; #X text 14 12 min__; #X text 14 34 min''; #X obj 165 209 min__ 0 0; #X obj 246 211 min'' 0 0; #X text 90 342 should be "1.111111112; #X text 55 13 double precision comparsion \, output the less value ; #X text 419 12 15 digits accurate; #X text 39 402 (c) IOhannes m zmoelnig 1999 - 2013; #X text 39 430 (c) Thomas Musil 2000 - 2013; #X obj 164 86 symtodp; #X obj 385 120 symtodp; #X connect 18 0 0 0; #X connect 19 0 30 0; #X connect 20 0 31 0; #X connect 23 0 10 0; #X connect 23 0 18 0; #X connect 23 1 9 0; #X connect 23 1 18 1; #X connect 30 0 23 0; #X connect 30 1 23 1; #X connect 31 0 23 2; #X connect 31 1 23 3; iem_utils-v0.0.20180206/iem_dp/add__-help.pd0000644000175000017500000000257512630366345020443 0ustar zmoelnigzmoelnig#N canvas 291 113 932 536 10; #X symbolatom 167 326 25 0 0 0 - - -; #X text 104 453 IEM KUG; #X text 88 441 musil; #X text 125 441 @; #X text 134 441 iem.at; #X text 87 463 Graz \, Austria; #X text 147 415 @; #X text 156 415 iem.at; #X text 88 415 zmoelnig; #X floatatom 251 245 11 0 0 0 - - -; #X floatatom 227 273 11 0 0 0 - - -; #X text 337 244 difference; #X text 311 272 float casted; #X text 14 12 +__; #X text 70 13 double precision addition; #X text 359 326 sum displayed via a symbol; #X obj 165 209 +__ 0 0; #X text 201 83 = symbol selector of an anything; #X text 191 72 double precision number beginning with a "double quote" =; #X text 425 120 = symbol selector of an anything; #X text 415 109 double precision number beginning with a "double quote" =; #X msg 292 108 "8.7654321234567; #X msg 70 71 "1.2345678765432; #X text 90 342 should be "9.9999999999999; #X obj 166 303 dptosym; #X text 14 32 add__; #X text 14 57 +''; #X obj 239 209 add__ 0 0; #X obj 316 209 +'' 0 0; #X text 294 13 15 digits accurate; #X text 39 402 (c) IOhannes m zmoelnig 1999 - 2013; #X text 39 430 (c) Thomas Musil 2000 - 2013; #X obj 71 94 symtodp; #X obj 291 130 symtodp; #X connect 16 0 10 0; #X connect 16 0 24 0; #X connect 16 1 9 0; #X connect 16 1 24 1; #X connect 21 0 33 0; #X connect 22 0 32 0; #X connect 24 0 0 0; #X connect 32 0 16 0; #X connect 32 1 16 1; #X connect 33 0 16 2; #X connect 33 1 16 3; iem_utils-v0.0.20180206/iem_dp/sub~~-help.pd0000644000175000017500000000511612630366345020574 0ustar zmoelnigzmoelnig#N canvas 291 113 856 539 10; #X symbolatom 196 376 25 0 0 0 - - -; #X text 133 473 IEM KUG; #X text 117 461 musil; #X text 154 461 @; #X text 163 461 iem.at; #X text 116 483 Graz \, Austria; #X text 176 435 @; #X text 185 435 iem.at; #X text 117 435 zmoelnig; #X obj 139 97 sig~; #X obj 99 97 sig~; #X obj 360 144 sig~; #X obj 320 144 sig~; #X msg 11 91 \; pd dsp \$1; #X obj 11 71 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 0 1 ; #N canvas 0 22 330 356 sunsig~~ 0; #X obj 22 195 snapshot~; #X obj 47 103 metro 300; #X obj 46 81 loadbang; #X obj 22 18 inlet~; #X obj 122 18 inlet~; #X obj 122 195 snapshot~; #X obj 47 136 t b b; #X obj 36 277 outlet; #X obj 35 248 dptosym; #X connect 0 0 8 0; #X connect 1 0 6 0; #X connect 2 0 1 0; #X connect 3 0 0 0; #X connect 4 0 5 0; #X connect 5 0 8 1; #X connect 6 0 0 0; #X connect 6 1 5 0; #X connect 8 0 7 0; #X restore 195 260 pd sunsig~~; #X text 14 12 -~~; #X text 70 13 double precision signal subtraction; #X obj 194 202 -~~ #######; #X text 383 376 difference displayed via a symbol; #X text 119 391 should be "1.2345678765432; #X msg 99 48 "9.9999999999999; #X msg 320 94 "8.7654321234567; #X text 452 105 = symbol selector of an anything; #X text 442 94 double precision number beginning with a "double quote" =; #X text 231 60 = symbol selector of an anything; #X text 221 49 double precision number beginning with a "double quote" =; #X text 14 34 sub~~; #X obj 282 202 sub~~; #X text 355 12 15 digits accurate; #X text 68 422 (c) IOhannes m zmoelnig 1999 - 2013; #X text 68 450 (c) Thomas Musil 2000 - 2013; #X obj 99 72 symtodp; #X obj 319 115 symtodp; #X symbolatom 439 307 25 0 0 0 - - -; #N canvas 0 22 330 356 sunsig~~ 0; #X obj 22 195 snapshot~; #X obj 47 103 metro 300; #X obj 46 81 loadbang; #X obj 22 18 inlet~; #X obj 122 18 inlet~; #X obj 122 195 snapshot~; #X obj 47 136 t b b; #X obj 36 277 outlet; #X obj 35 248 dptosym; #X connect 0 0 8 0; #X connect 1 0 6 0; #X connect 2 0 1 0; #X connect 3 0 0 0; #X connect 4 0 5 0; #X connect 5 0 8 1; #X connect 6 0 0 0; #X connect 6 1 5 0; #X connect 8 0 7 0; #X restore 439 281 pd sunsig~~; #X obj 440 226 sig~; #X floatatom 439 206 5 0 0 0 - - -; #X obj 440 256 -~~ 100 0; #X obj 517 255 sub~~ 100 0; #X connect 9 0 18 1; #X connect 10 0 18 0; #X connect 11 0 18 3; #X connect 12 0 18 2; #X connect 14 0 13 0; #X connect 15 0 0 0; #X connect 18 0 15 0; #X connect 18 1 15 1; #X connect 21 0 32 0; #X connect 22 0 33 0; #X connect 32 0 10 0; #X connect 32 1 9 0; #X connect 33 0 12 0; #X connect 33 1 11 0; #X connect 35 0 34 0; #X connect 36 0 38 0; #X connect 37 0 36 0; #X connect 38 0 35 0; #X connect 38 1 35 1; iem_utils-v0.0.20180206/iem_dp/min~~-help.pd0000644000175000017500000000510612630366345020565 0ustar zmoelnigzmoelnig#N canvas 291 113 860 543 10; #X symbolatom 196 386 25 0 0 0 - - -; #X text 133 483 IEM KUG; #X text 117 471 musil; #X text 154 471 @; #X text 163 471 iem.at; #X text 116 493 Graz \, Austria; #X text 176 445 @; #X text 185 445 iem.at; #X text 117 445 zmoelnig; #X text 388 386 sum displayed via a symbol; #X obj 139 97 sig~; #X obj 99 97 sig~; #X obj 360 144 sig~; #X obj 320 144 sig~; #X msg 11 91 \; pd dsp \$1; #X obj 11 71 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 1 1 ; #N canvas 0 22 330 356 sunsig~~ 0; #X obj 22 195 snapshot~; #X obj 47 103 metro 300; #X obj 46 81 loadbang; #X obj 22 18 inlet~; #X obj 122 18 inlet~; #X obj 122 195 snapshot~; #X obj 47 136 t b b; #X obj 36 277 outlet; #X obj 35 248 dptosym; #X connect 0 0 8 0; #X connect 1 0 6 0; #X connect 2 0 1 0; #X connect 3 0 0 0; #X connect 4 0 5 0; #X connect 5 0 8 1; #X connect 6 0 0 0; #X connect 6 1 5 0; #X connect 8 0 7 0; #X restore 195 260 pd sunsig~~; #X text 452 106 = symbol selector of an anything; #X text 442 95 double precision number beginning with a "double quote" =; #X text 230 60 = symbol selector of an anything; #X text 220 49 double precision number beginning with a "double quote" =; #X msg 99 48 "1.111111112; #X msg 320 94 "1.111111113; #X text 14 11 min~~; #X text 70 13 double precision comparsion \, output the less value ; #X obj 194 203 min~~ ######; #X text 132 402 should be "1.111111112; #X text 450 14 15 digits accurate; #X text 68 432 (c) IOhannes m zmoelnig 1999 - 2013; #X text 68 460 (c) Thomas Musil 2000 - 2013; #X obj 99 72 symtodp; #X obj 320 115 symtodp; #X obj 462 220 sig~; #N canvas 0 22 330 356 sunsig~~ 0; #X obj 22 195 snapshot~; #X obj 47 103 metro 300; #X obj 46 81 loadbang; #X obj 22 18 inlet~; #X obj 122 18 inlet~; #X obj 122 195 snapshot~; #X obj 47 136 t b b; #X obj 36 277 outlet; #X obj 35 248 dptosym; #X connect 0 0 8 0; #X connect 1 0 6 0; #X connect 2 0 1 0; #X connect 3 0 0 0; #X connect 4 0 5 0; #X connect 5 0 8 1; #X connect 6 0 0 0; #X connect 6 1 5 0; #X connect 8 0 7 0; #X restore 462 274 pd sunsig~~; #X symbolatom 462 299 25 0 0 0 - - -; #X floatatom 462 199 5 0 0 0 - - -; #X floatatom 523 199 5 0 0 0 - - -; #X obj 462 246 min~~ 10 0; #X connect 10 0 25 1; #X connect 11 0 25 0; #X connect 12 0 25 3; #X connect 13 0 25 2; #X connect 15 0 14 0; #X connect 16 0 0 0; #X connect 21 0 30 0; #X connect 22 0 31 0; #X connect 25 0 16 0; #X connect 25 1 16 1; #X connect 30 0 11 0; #X connect 30 1 10 0; #X connect 31 0 13 0; #X connect 31 1 12 0; #X connect 32 0 37 0; #X connect 33 0 34 0; #X connect 35 0 32 0; #X connect 36 0 37 2; #X connect 37 0 33 0; #X connect 37 1 33 1; iem_utils-v0.0.20180206/iem_dp/tabread4~~-help.pd0000644000175000017500000000751112630366345021472 0ustar zmoelnigzmoelnig#N canvas 78 22 892 632 10; #X obj 28 14 tgl 15 0 empty empty empty 20 8 0 10 -262144 -1 -1 0 1 ; #X floatatom 28 81 5 0 0 0 - - -; #X floatatom 44 59 3 0 0 0 - - -; #X obj 28 36 dsp; #X obj 468 27 loadbang; #X text 425 251 see also:; #X obj 493 251 tabread4~; #N canvas 0 22 450 300 (subpatch) 0; #X array array99 13 float 0; #X coords 0 5.5 12 -5.5 250 200 1; #X restore 121 44 graph; #X text 116 -15 4-point-interpolating table lookup; #X obj 41 523 snapshot~; #X obj 194 489 metro 200; #X obj 40 426 sig~; #X floatatom 41 549 0 0 0 0 - - -; #X text 42 272 Tabread4~ is used to build samplers and other table lookup algorithms. The interpolation scheme is 4-point polynomial. ; #X text 13 -15 tabread4~~; #X obj 41 488 tabread4~~ array99; #X obj 194 444 loadbang; #X obj 194 468 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 158 10 table array98 1.7e+07; #X obj 294 530 snapshot~; #X obj 293 454 sig~; #X floatatom 294 556 0 0 0 0 - - -; #X obj 293 491 tabread4~ array99; #X floatatom 155 356 0 0 0 0 - - -; #X obj 145 430 sig~; #N canvas 0 22 470 320 copy_99_into_98 0; #X obj 55 199 tabwrite~ array98; #X msg 80 105 start 1.698e+07; #X obj 55 128 tabplay~ array99; #X obj 55 62 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X msg 146 150 stop; #X obj 55 83 t b b; #X obj 55 24 inlet; #X connect 1 0 0 0; #X connect 2 0 0 0; #X connect 2 1 4 0; #X connect 3 0 5 0; #X connect 4 0 0 0; #X connect 5 0 2 0; #X connect 5 1 1 0; #X connect 6 0 3 0; #X restore 408 222 pd copy_99_into_98; #X obj 408 50 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 293 432 + 0; #X obj 408 69 t b b; #X obj 158 337 hsl 101 15 1 11 0 0 empty empty empty -2 -6 0 8 -262144 -1 -1 6000 1; #X obj 306 412 r \$0_offset; #X obj 145 408 r \$0_offset; #X obj 334 467 r \$0_which_table; #X obj 47 461 r \$0_which_table; #X msg 433 92 \; array98 const 0 \; array99 resize 13 \; array99 0 -5 -5 -4 -3 -2 -1 0 1 2 3 4 5 5 \; array99 bounds 0 5.5 12 -5.5 \; array99 xticks 0 1 2 \; array99 yticks 0 0.5 5 \; array99 xlabel -6 0 2 4 6 8 10 12 \; array99 ylabel -0.4 -5 -4 -3 -2 -1 0 1 2 3 4 5; #N canvas 0 22 470 320 select_table 0; #X obj 55 24 inlet; #X msg 55 112 0; #X msg 109 180 1.698e+07; #X obj 55 90 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 109 158 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 55 133 s \$0_offset; #X obj 109 201 s \$0_offset; #X obj 186 200 s \$0_which_table; #X msg 186 178 set array98; #X obj 127 133 s \$0_which_table; #X msg 127 111 set array99; #X obj 55 47 sel 0 1; #X connect 0 0 11 0; #X connect 1 0 5 0; #X connect 2 0 6 0; #X connect 3 0 10 0; #X connect 3 0 1 0; #X connect 4 0 2 0; #X connect 4 0 8 0; #X connect 8 0 7 0; #X connect 10 0 9 0; #X connect 11 0 3 0; #X connect 11 1 4 0; #X restore 275 370 pd select_table; #X obj 275 336 vradio 15 1 0 2 empty empty empty 0 -6 0 8 -262144 -1 -1 1; #X text 294 334 array99 offset=0; #X text 293 349 array98 offset=1.698e+07; #X text 604 546 IEM KUG; #X text 588 534 musil; #X text 625 534 @; #X text 634 534 iem.at; #X text 587 556 Graz \, Austria; #X text 647 508 @; #X text 656 508 iem.at; #X text 588 508 zmoelnig; #X obj 408 29 sel 1; #X text 539 495 (c) IOhannes m zmoelnig 1999 - 2013; #X text 539 523 (c) Thomas Musil 2000 - 2013; #X connect 0 0 3 0; #X connect 0 0 47 0; #X connect 3 0 1 0; #X connect 3 1 2 0; #X connect 4 0 26 0; #X connect 9 0 12 0; #X connect 10 0 9 0; #X connect 10 0 19 0; #X connect 11 0 15 0; #X connect 15 0 9 0; #X connect 16 0 17 0; #X connect 17 0 10 0; #X connect 19 0 21 0; #X connect 20 0 22 0; #X connect 22 0 19 0; #X connect 23 0 11 0; #X connect 23 0 27 0; #X connect 24 0 15 1; #X connect 26 0 28 0; #X connect 27 0 20 0; #X connect 28 0 25 0; #X connect 28 1 34 0; #X connect 29 0 23 0; #X connect 30 0 27 1; #X connect 31 0 24 0; #X connect 32 0 22 0; #X connect 33 0 15 0; #X connect 36 0 35 0; #X connect 47 0 26 0; iem_utils-v0.0.20180206/iem_dp/random__-help.pd0000644000175000017500000000244112630366345021163 0ustar zmoelnigzmoelnig#N canvas 88 232 932 536 10; #X symbolatom 167 326 25 0 0 0 - - -; #X text 104 453 IEM KUG; #X text 88 441 musil; #X text 125 441 @; #X text 134 441 iem.at; #X text 87 463 Graz \, Austria; #X text 39 430 (c) Thomas Musil 2000 - 2007; #X text 39 402 (c) IOhannes m zmoelnig 1999 - 2007; #X text 147 415 @; #X text 156 415 iem.at; #X text 88 415 zmoelnig; #X floatatom 251 245 11 0 0 0 - - -; #X floatatom 227 273 11 0 0 0 - - -; #X text 337 244 difference; #X text 311 272 float casted; #X text 359 326 difference displayed via a symbol; #X text 203 83 = symbol selector of an anything; #X text 294 13 14 digits accurate; #X msg 292 108 "8.7654321234567; #X text 193 72 double precision number beginning with a "double quote" =; #X text 422 119 = symbol selector of an anything; #X text 412 108 double precision number beginning with a "double quote" =; #X obj 166 303 dptosym; #X obj 316 210 random'' 10 0; #X obj 165 209 random__ 10 0; #X msg 90 106 bang; #X msg 151 114 seed 20 0; #X text 97 13 double precision random; #X text 14 12 random__; #X text 14 32 random''; #X obj 292 130 symtodp; #X connect 18 0 30 0; #X connect 22 0 0 0; #X connect 24 0 12 0; #X connect 24 0 22 0; #X connect 24 1 11 0; #X connect 24 1 22 1; #X connect 25 0 24 0; #X connect 26 0 24 0; #X connect 30 0 24 1; #X connect 30 1 24 2; iem_utils-v0.0.20180206/iem_dp/mul~~-help.pd0000644000175000017500000000507712630366345020606 0ustar zmoelnigzmoelnig#N canvas 291 113 936 537 10; #X symbolatom 194 348 25 0 0 0 - - -; #X text 134 493 IEM KUG; #X text 118 481 musil; #X text 155 481 @; #X text 164 481 iem.at; #X text 117 503 Graz \, Austria; #X text 177 455 @; #X text 186 455 iem.at; #X text 118 455 zmoelnig; #X obj 139 97 sig~; #X obj 99 97 sig~; #X obj 360 144 sig~; #X obj 320 144 sig~; #X msg 11 91 \; pd dsp \$1; #X obj 11 71 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 0 1 ; #X text 14 12 *~~; #X text 70 13 double precision signal multiplication; #X obj 194 203 *~~ #######; #X text 386 348 product displayed via a symbol; #N canvas 0 22 330 356 sunsig~~ 0; #X obj 22 195 snapshot~; #X obj 47 103 metro 300; #X obj 46 81 loadbang; #X obj 22 18 inlet~; #X obj 122 18 inlet~; #X obj 122 195 snapshot~; #X obj 47 136 t b b; #X obj 36 277 outlet; #X obj 35 248 dptosym; #X connect 0 0 8 0; #X connect 1 0 6 0; #X connect 2 0 1 0; #X connect 3 0 0 0; #X connect 4 0 5 0; #X connect 5 0 8 1; #X connect 6 0 0 0; #X connect 6 1 5 0; #X connect 8 0 7 0; #X restore 195 260 pd sunsig~~; #X msg 320 94 "1.111111; #X msg 99 51 "1.111111; #X text 117 366 should be "1.234567654321; #X text 406 105 = symbol selector of an anything; #X text 396 94 double precision number beginning with a "double quote" =; #X text 183 62 = symbol selector of an anything; #X text 173 51 double precision number beginning with a "double quote" =; #X text 16 32 mul~~; #X obj 292 203 mul~~; #X text 374 13 15 digits accurate; #X text 69 442 (c) IOhannes m zmoelnig 1999 - 2013; #X text 69 470 (c) Thomas Musil 2000 - 2013; #X obj 99 74 symtodp; #X obj 320 115 symtodp; #X obj 440 256 *~~ 100 0; #X symbolatom 439 307 25 0 0 0 - - -; #N canvas 0 22 330 356 sunsig~~ 0; #X obj 22 195 snapshot~; #X obj 47 103 metro 300; #X obj 46 81 loadbang; #X obj 22 18 inlet~; #X obj 122 18 inlet~; #X obj 122 195 snapshot~; #X obj 47 136 t b b; #X obj 36 277 outlet; #X obj 35 248 dptosym; #X connect 0 0 8 0; #X connect 1 0 6 0; #X connect 2 0 1 0; #X connect 3 0 0 0; #X connect 4 0 5 0; #X connect 5 0 8 1; #X connect 6 0 0 0; #X connect 6 1 5 0; #X connect 8 0 7 0; #X restore 439 281 pd sunsig~~; #X obj 440 226 sig~; #X floatatom 439 206 5 0 0 0 - - -; #X obj 516 255 mul~~ 100 0; #X connect 9 0 17 1; #X connect 10 0 17 0; #X connect 11 0 17 3; #X connect 12 0 17 2; #X connect 14 0 13 0; #X connect 17 0 19 0; #X connect 17 1 19 1; #X connect 19 0 0 0; #X connect 20 0 33 0; #X connect 21 0 32 0; #X connect 32 0 10 0; #X connect 32 1 9 0; #X connect 33 0 12 0; #X connect 33 1 11 0; #X connect 34 0 36 0; #X connect 34 1 36 1; #X connect 36 0 35 0; #X connect 37 0 34 0; #X connect 38 0 37 0; iem_utils-v0.0.20180206/iem_dp/tabwrite__-help.pd0000644000175000017500000000314112630366345021522 0ustar zmoelnigzmoelnig#N canvas 41 42 639 550 10; #X text 334 93 see also:; #X obj 128 82 table array98 1.7e+07; #X text 206 462 IEM KUG; #X text 190 450 musil; #X text 227 450 @; #X text 236 450 iem.at; #X text 189 472 Graz \, Austria; #X text 249 424 @; #X text 258 424 iem.at; #X text 190 424 zmoelnig; #X obj 403 92 tabwrite; #X floatatom 121 191 5 0 0 0 - - -; #X obj 199 240 t f b f; #X msg 218 271 1.698e+07; #X obj 121 219 t f f; #X msg 49 283 1.698e+07; #X obj 49 254 t b f; #X floatatom 49 331 0 0 0 0 - - -; #X obj 49 307 tabread__ array98; #X obj 166 307 tabwrite__ array98; #X floatatom 393 173 5 0 0 0 - - -; #X obj 393 201 t f f; #X msg 312 282 1.698e+07; #X obj 312 253 t b f; #X floatatom 312 330 0 0 0 0 - - -; #X obj 475 225 t f b f; #X msg 493 251 1.698e+07; #X obj 499 273 +; #X obj 129 107 table array99 1.7e+07; #X obj 312 307 tabread__ array99; #X obj 435 307 tabwrite array99; #X text 13 11 tabwrite__; #X text 14 27 tabwrite''; #X text 116 10 write number in a lookup table with double precision index (15 digits accurate); #X text 141 411 (c) IOhannes m zmoelnig 1999 - 2013; #X text 141 439 (c) Thomas Musil 2000 - 2013; #X connect 11 0 14 0; #X connect 12 0 19 0; #X connect 12 1 13 0; #X connect 12 2 19 2; #X connect 13 0 19 1; #X connect 14 0 16 0; #X connect 14 1 12 0; #X connect 15 0 18 0; #X connect 16 0 15 0; #X connect 16 1 18 1; #X connect 18 0 17 0; #X connect 20 0 21 0; #X connect 21 0 23 0; #X connect 21 1 25 0; #X connect 22 0 29 0; #X connect 23 0 22 0; #X connect 23 1 29 1; #X connect 25 0 30 0; #X connect 25 1 26 0; #X connect 25 2 27 1; #X connect 26 0 27 0; #X connect 27 0 30 1; #X connect 29 0 24 0; iem_utils-v0.0.20180206/iem_dp/tabread4__-help.pd0000644000175000017500000000523712630366345021377 0ustar zmoelnigzmoelnig#N canvas 95 60 892 632 10; #X obj 406 74 loadbang; #X text 425 271 see also:; #N canvas 0 22 450 300 (subpatch) 0; #X array array99 13 float 0; #X coords 0 5.5 12 -5.5 250 200 1; #X restore 121 64 graph; #X floatatom 41 537 0 0 0 0 - - -; #X obj 497 55 table array98 1.7e+07; #X floatatom 293 537 0 0 0 0 - - -; #X floatatom 155 376 0 0 0 0 - - -; #X obj 293 452 + 0; #X obj 158 357 hsl 101 15 1 11 0 0 empty empty empty -2 -6 0 8 -262144 -1 -1 3500 1; #X obj 306 432 r \$0_offset; #X obj 145 428 r \$0_offset; #X obj 312 485 r \$0_which_table; #X obj 40 467 r \$0_which_table; #N canvas 0 22 470 320 select_table 0; #X obj 55 24 inlet; #X msg 55 112 0; #X msg 109 180 1.698e+07; #X obj 55 90 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 109 158 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 55 133 s \$0_offset; #X obj 109 201 s \$0_offset; #X obj 186 200 s \$0_which_table; #X msg 186 178 set array98; #X obj 127 133 s \$0_which_table; #X msg 127 111 set array99; #X obj 55 47 sel 0 1; #X connect 0 0 11 0; #X connect 1 0 5 0; #X connect 2 0 6 0; #X connect 3 0 10 0; #X connect 3 0 1 0; #X connect 4 0 2 0; #X connect 4 0 8 0; #X connect 8 0 7 0; #X connect 10 0 9 0; #X connect 11 0 3 0; #X connect 11 1 4 0; #X restore 275 390 pd select_table; #X obj 275 356 vradio 15 1 0 2 empty empty empty 0 -6 0 8 -262144 -1 -1 1; #X text 294 354 array99 offset=0; #X text 293 369 array98 offset=1.698e+07; #X text 604 566 IEM KUG; #X text 588 554 musil; #X text 625 554 @; #X text 634 554 iem.at; #X text 587 576 Graz \, Austria; #X text 647 528 @; #X text 656 528 iem.at; #X text 588 528 zmoelnig; #X text 13 11 tabread4__; #X obj 493 271 tabread4; #X msg 406 95 \; array98 const 0 \; array99 resize 13 \; array99 0 -5 -5 -4 -3 -2 -1 0 1 2 3 4 5 5 \; array99 bounds 0 5.5 12 -5.5 \; array99 xticks 0 1 2 \; array99 yticks 0 0.5 5 \; array99 xlabel -6 0 2 4 6 8 10 12 \; array99 ylabel -0.4 -5 -4 -3 -2 -1 0 1 2 3 4 5 \; array98 1.698e+07 -5 -5 -4 -3 -2 -1 0 1 2 3 4 5 5; #X obj 293 511 tabread4 array99; #X obj 41 508 tabread4__ array99; #X obj 77 533 tabread4'' array99; #X text 14 26 tabread4''; #X text 41 292 tabread4 is used to build samplers and other table lookup algorithms. The interpolation scheme is 4-point polynomial.; #X text 539 515 (c) IOhannes m zmoelnig 1999 - 2013; #X text 539 543 (c) Thomas Musil 2000 - 2013; #X text 116 10 4-point-interpolating table lookup with double precision index (15 digits accurate); #X connect 0 0 27 0; #X connect 6 0 7 0; #X connect 6 0 29 0; #X connect 7 0 28 0; #X connect 8 0 6 0; #X connect 9 0 7 1; #X connect 10 0 29 1; #X connect 11 0 28 0; #X connect 12 0 29 0; #X connect 14 0 13 0; #X connect 28 0 5 0; #X connect 29 0 3 0; iem_utils-v0.0.20180206/iem_dp/dptosym-help.pd0000644000175000017500000000415312630366345021106 0ustar zmoelnigzmoelnig#N canvas 502 22 781 599 10; #X symbolatom 525 160 25 0 0 0 - - -; #X obj 525 103 + 3.1415; #X msg 525 79 9.26536e-05; #X text 574 135 7-8 digits accurate; #X text 169 289 output is a symbol of sum of both double casted inputs ; #X text 361 15 (only for help and debugging purpose); #X symbolatom 109 353 25 0 0 0 - - -; #X text 149 467 IEM KUG; #X text 133 455 musil; #X text 170 455 @; #X text 179 455 iem.at; #X text 132 477 Graz \, Austria; #X text 192 429 @; #X text 201 429 iem.at; #X text 133 429 zmoelnig; #X text 46 369 should be "1.2345678765432; #X floatatom 88 102 11 0 0 0 - - -; #X floatatom 65 129 11 0 0 0 - - -; #X text 168 235 the inputs are two floats \, left one is the float-casted value of a double value \, the right one is the float difference between double value and the float-casted.; #X text 149 128 float-casted; #X text 174 101 difference to double; #X obj 110 288 dptosym; #X obj 525 134 dptosym; #X symbolatom 557 349 25 0 0 0 - - -; #X msg 596 293 9.26536e-05; #X text 606 324 7-8 digits accurate; #X obj 557 323 dptosym; #X msg 559 267 3.1415; #X obj 568 238 t b b; #X obj 568 215 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144 -1 -1; #X symbolatom 552 485 25 0 0 0 - - -; #X obj 558 438 dptosym; #X msg 32 46 "1.234567890123456789; #X msg 558 388 "3.1415926535897932; #X obj 577 462 symbol; #X obj 558 413 symtodp; #X obj 32 71 symtodp; #X text 84 416 (c) IOhannes m zmoelnig 1999 - 2013; #X text 84 444 (c) Thomas Musil 2000 - 2013; #X text 14 12 dptosym; #X text 81 12 double precision to symbol converter; #X symbolatom 147 332 25 0 0 0 - - -; #X obj 147 311 symbol; #X text 195 311 and a symbol number with a leading double quotes; #X connect 1 0 22 0; #X connect 2 0 1 0; #X connect 21 0 6 0; #X connect 21 1 42 0; #X connect 22 0 0 0; #X connect 24 0 26 1; #X connect 26 0 23 0; #X connect 27 0 26 0; #X connect 28 0 27 0; #X connect 28 1 24 0; #X connect 29 0 28 0; #X connect 31 1 34 0; #X connect 32 0 36 0; #X connect 33 0 35 0; #X connect 34 0 30 0; #X connect 35 0 31 0; #X connect 35 1 31 1; #X connect 36 0 17 0; #X connect 36 0 21 0; #X connect 36 1 16 0; #X connect 36 1 21 1; #X connect 42 0 41 0; iem_utils-v0.0.20180206/iem_dp/tabwrite~~-help.pd0000644000175000017500000000241412630366345021622 0ustar zmoelnigzmoelnig#N canvas 78 22 863 399 10; #X obj 28 14 tgl 15 0 empty empty empty 20 8 0 10 -262144 -1 -1 0 1 ; #X floatatom 28 81 5 0 0 0 - - -; #X floatatom 44 59 3 0 0 0 - - -; #X obj 28 36 dsp; #X text 420 277 see also:; #X text 658 295 IEM KUG; #X text 642 283 musil; #X text 679 283 @; #X text 688 283 iem.at; #X text 641 305 Graz \, Austria; #X text 701 257 @; #X text 710 257 iem.at; #X text 642 257 zmoelnig; #X obj 479 276 tabwrite~; #X msg 47 210 bang; #N canvas 0 22 450 300 (subpatch) 0; #X array array99 1000 float 0; #X coords 0 1 999 -1 200 100 1; #X restore 390 77 graph; #X text 190 318 creation argument initializes array name; #X msg 45 288 set array99; #X msg 48 260 stop; #X text 153 261 stop recording; #X text 175 234 start in middle of table; #X obj 27 187 phasor~ 200; #X text 148 209 start recording; #X text 149 286 set destination array; #X text 15 -11 tabwrite~~; #X obj 28 318 tabwrite~~ array99; #X msg 47 236 start 500 5; #X text 593 244 (c) IOhannes m zmoelnig 1999 - 2013; #X text 593 272 (c) Thomas Musil 2000 - 2013; #X text 109 -12 - write a signal in an array with a double precision start onset; #X connect 0 0 3 0; #X connect 3 0 1 0; #X connect 3 1 2 0; #X connect 14 0 25 0; #X connect 17 0 25 0; #X connect 18 0 25 0; #X connect 21 0 25 0; #X connect 26 0 25 0; iem_utils-v0.0.20180206/iem_dp/phasor~~-help.pd0000644000175000017500000000311612630366345021275 0ustar zmoelnigzmoelnig#N canvas 50 82 859 466 10; #X obj 28 14 tgl 15 0 empty empty empty 20 8 0 10 -262144 -1 -1 0 1 ; #X floatatom 28 81 5 0 0 0 - - -; #X floatatom 44 59 3 0 0 0 - - -; #X obj 28 36 dsp; #X text 639 34 see also:; #X text 592 211 IEM KUG; #X text 576 199 musil; #X text 613 199 @; #X text 622 199 iem.at; #X text 575 221 Graz \, Austria; #X text 635 173 @; #X text 644 173 iem.at; #X text 576 173 zmoelnig; #X text 13 -11 phasor~~; #X obj 719 35 phasor~; #N canvas 0 22 450 300 (subpatch) 0; #X array array99 100 float 0; #X coords 0 1 100 -1 200 100 1; #X restore 413 12 graph; #X obj 54 382 metro 500; #X floatatom 39 117 0 0 0 0 - - -; #X obj 39 141 sig~ 890; #X text 91 114 <-- specify frequency; #X text 106 140 <-- convert it to audio signal; #X text 177 404 <-- graph the output; #X text 149 195 <-- right inlet resets phase; #X obj 38 406 tabwrite~ array99; #X obj 54 357 loadbang; #X obj 120 357 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144 -1 -1; #X obj 39 226 phasor~~; #X floatatom 90 199 5 0 0 0 - - -; #X floatatom 91 285 0 0 0 0 - - -; #X obj 91 262 unsig~; #X text 97 246 fine out; #X text 45 325 coarse out; #X msg 91 179 0.5; #X text 80 -10 - sawtooth generator with double precision output; #X text 527 160 (c) IOhannes m zmoelnig 1999 - 2013; #X text 527 188 (c) Thomas Musil 2000 - 2013; #X connect 0 0 3 0; #X connect 3 0 1 0; #X connect 3 1 2 0; #X connect 16 0 23 0; #X connect 17 0 18 0; #X connect 18 0 26 0; #X connect 24 0 16 0; #X connect 24 0 16 0; #X connect 25 0 16 0; #X connect 26 0 23 0; #X connect 26 1 29 0; #X connect 27 0 26 1; #X connect 29 0 28 0; #X connect 32 0 27 0; iem_utils-v0.0.20180206/iem_dp/div__-help.pd0000644000175000017500000000437412630366345020474 0ustar zmoelnigzmoelnig#N canvas 291 113 1057 750 10; #X symbolatom 167 326 25 0 0 0 - - -; #X text 104 453 IEM KUG; #X text 88 441 musil; #X text 125 441 @; #X text 134 441 iem.at; #X text 87 463 Graz \, Austria; #X text 147 415 @; #X text 156 415 iem.at; #X text 88 415 zmoelnig; #X floatatom 251 245 11 0 0 0 - - -; #X floatatom 227 273 11 0 0 0 - - -; #X text 337 244 difference; #X text 311 272 float casted; #X text 14 12 /__; #X text 70 13 double precision division; #X obj 165 209 /__ 0 0; #X text 359 326 quotient displayed via a symbol; #X text 470 109 = symbol selector of an anything; #X text 460 98 double precision number beginning with a "double quote" =; #X text 288 72 = symbol selector of an anything; #X text 278 61 double precision number beginning with a "double quote" =; #X text 90 342 should be "1.111111; #X msg 385 98 "1.111111; #X msg 163 61 "1.234567654321; #X obj 166 303 dptosym; #X text 13 31 div__; #X symbolatom 409 641 25 0 0 0 - - -; #X floatatom 493 560 11 0 0 0 - - -; #X floatatom 469 588 11 0 0 0 - - -; #X text 579 559 difference; #X text 553 587 float casted; #X text 601 641 quotient displayed via a symbol; #X text 712 424 = symbol selector of an anything; #X text 702 413 double precision number beginning with a "double quote" =; #X text 530 387 = symbol selector of an anything; #X text 520 376 double precision number beginning with a "double quote" =; #X text 332 657 should be "1.111111; #X msg 627 413 "1.111111; #X msg 405 376 "1.234567654321; #X obj 408 618 dptosym; #X obj 407 524 div__ 0 0; #X text 14 57 /''; #X obj 239 209 div__ 0 0; #X obj 316 209 /'' 0 0; #X text 294 13 15 digits accurate; #X text 39 402 (c) IOhannes m zmoelnig 1999 - 2013; #X text 39 430 (c) Thomas Musil 2000 - 2013; #X obj 164 87 symtodp; #X obj 385 120 symtodp; #X obj 406 402 symtodp; #X obj 627 435 symtodp; #X connect 15 0 10 0; #X connect 15 0 24 0; #X connect 15 1 9 0; #X connect 15 1 24 1; #X connect 22 0 48 0; #X connect 23 0 47 0; #X connect 24 0 0 0; #X connect 37 0 50 0; #X connect 38 0 49 0; #X connect 39 0 26 0; #X connect 40 0 28 0; #X connect 40 0 39 0; #X connect 40 1 27 0; #X connect 40 1 39 1; #X connect 47 0 15 0; #X connect 47 1 15 1; #X connect 48 0 15 2; #X connect 48 1 15 3; #X connect 49 0 40 0; #X connect 49 1 40 1; #X connect 50 0 40 2; #X connect 50 1 40 3; iem_utils-v0.0.20180206/iem_dp/delwrite~~-help.pd0000644000175000017500000000166212630366345021624 0ustar zmoelnigzmoelnig#N canvas 248 216 633 323 10; #X obj 32 25 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 0 1 ; #X msg 33 48 \; pd dsp \$1; #X obj 175 65 sig~; #X floatatom 174 40 5 0 0 0 - - -; #X obj 178 197 delread~~ abc 1234 0; #X obj 178 224 unsig~; #X floatatom 178 248 5 0 0 0 - - -; #X obj 176 91 delwrite~~ abc 9876 0; #X msg 221 166 2345 0; #X msg 242 145 3456 0; #X floatatom 163 148 5 0 0 0 - - -; #X floatatom 310 144 5 0 0 0 - - -; #X obj 390 226 unsig~; #X floatatom 390 250 5 0 0 0 - - -; #X floatatom 382 122 5 0 0 0 - - -; #X floatatom 437 122 5 0 0 0 - - -; #X obj 390 199 vd~~ abc; #X obj 382 141 sig~; #X obj 436 144 sig~; #X connect 0 0 1 0; #X connect 2 0 7 0; #X connect 3 0 2 0; #X connect 4 0 5 0; #X connect 5 0 6 0; #X connect 8 0 4 0; #X connect 9 0 4 0; #X connect 10 0 4 0; #X connect 11 0 4 1; #X connect 12 0 13 0; #X connect 14 0 17 0; #X connect 15 0 18 0; #X connect 16 0 12 0; #X connect 17 0 16 0; #X connect 18 0 16 1; iem_utils-v0.0.20180206/iem_dp/add~~-help.pd0000644000175000017500000000510612630366345020532 0ustar zmoelnigzmoelnig#N canvas 291 113 860 543 10; #X symbolatom 196 376 25 0 0 0 - - -; #X text 133 473 IEM KUG; #X text 117 461 musil; #X text 154 461 @; #X text 163 461 iem.at; #X text 116 483 Graz \, Austria; #X text 176 435 @; #X text 185 435 iem.at; #X text 117 435 zmoelnig; #X text 388 376 sum displayed via a symbol; #X text 14 12 +~~; #X text 70 13 double precision signal addition; #X obj 139 97 sig~; #X obj 99 97 sig~; #X obj 360 144 sig~; #X obj 320 144 sig~; #X obj 194 203 +~~ #######; #X msg 11 91 \; pd dsp \$1; #X obj 11 71 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 1 1 ; #N canvas 0 22 330 356 sunsig~~ 0; #X obj 22 195 snapshot~; #X obj 47 103 metro 300; #X obj 46 81 loadbang; #X obj 22 18 inlet~; #X obj 122 18 inlet~; #X obj 122 195 snapshot~; #X obj 47 136 t b b; #X obj 36 277 outlet; #X obj 35 248 dptosym; #X connect 0 0 8 0; #X connect 1 0 6 0; #X connect 2 0 1 0; #X connect 3 0 0 0; #X connect 4 0 5 0; #X connect 5 0 8 1; #X connect 6 0 0 0; #X connect 6 1 5 0; #X connect 8 0 7 0; #X restore 195 260 pd sunsig~~; #X text 452 106 = symbol selector of an anything; #X text 442 95 double precision number beginning with a "double quote" =; #X text 230 60 = symbol selector of an anything; #X text 220 49 double precision number beginning with a "double quote" =; #X msg 99 48 "1.2345678765432; #X msg 320 94 "8.7654321234567; #X text 119 392 should be "9.9999999999999; #X text 14 34 add~~; #X obj 287 201 add~~; #X text 68 422 (c) IOhannes m zmoelnig 1999 - 2013; #X text 68 450 (c) Thomas Musil 2000 - 2013; #X text 314 13 15 digits accurate; #X obj 99 72 symtodp; #X obj 320 115 symtodp; #X symbolatom 439 307 25 0 0 0 - - -; #N canvas 0 22 330 356 sunsig~~ 0; #X obj 22 195 snapshot~; #X obj 47 103 metro 300; #X obj 46 81 loadbang; #X obj 22 18 inlet~; #X obj 122 18 inlet~; #X obj 122 195 snapshot~; #X obj 47 136 t b b; #X obj 36 277 outlet; #X obj 35 248 dptosym; #X connect 0 0 8 0; #X connect 1 0 6 0; #X connect 2 0 1 0; #X connect 3 0 0 0; #X connect 4 0 5 0; #X connect 5 0 8 1; #X connect 6 0 0 0; #X connect 6 1 5 0; #X connect 8 0 7 0; #X restore 439 281 pd sunsig~~; #X obj 440 226 sig~; #X floatatom 439 206 5 0 0 0 - - -; #X obj 440 256 +~~ 100 0; #X obj 516 255 add~~ 100 0; #X connect 12 0 16 1; #X connect 13 0 16 0; #X connect 14 0 16 3; #X connect 15 0 16 2; #X connect 16 0 19 0; #X connect 16 1 19 1; #X connect 18 0 17 0; #X connect 19 0 0 0; #X connect 24 0 32 0; #X connect 25 0 33 0; #X connect 32 0 13 0; #X connect 32 1 12 0; #X connect 33 0 15 0; #X connect 33 1 14 0; #X connect 35 0 34 0; #X connect 36 0 38 0; #X connect 37 0 36 0; #X connect 38 0 35 0; #X connect 38 1 35 1; iem_utils-v0.0.20180206/iem_dp/symtodp-help.pd0000644000175000017500000000410212630366345021100 0ustar zmoelnigzmoelnig#N canvas 175 36 767 494 10; #X text 169 289 output is a symbol of sum of both double casted inputs ; #X text 294 13 (only for help and debugging purpose); #X symbolatom 110 346 25 0 0 0 - - -; #X text 147 461 IEM KUG; #X text 131 449 musil; #X text 168 449 @; #X text 177 449 iem.at; #X text 130 471 Graz \, Austria; #X text 191 388 @; #X text 200 388 iem.at; #X text 131 423 zmoelnig; #X text 33 365 should be "1.2345678765432; #X floatatom 166 184 11 0 0 0 - - -; #X floatatom 143 211 11 0 0 0 - - -; #X text 168 235 the inputs are two floats \, left one is the float-casted value of a double value \, the right one is the float difference between double value and the float-casted.; #X text 227 210 float-casted; #X text 252 183 difference to double; #X obj 110 288 dptosym; #X text 81 13 symbol to double converter; #X text 14 12 symtodp; #X obj 61 157 symtodp; #X obj 61 86 makefilename %g67890; #X text 82 410 (c) IOhannes m zmoelnig 1999 - 2013; #X text 82 438 (c) Thomas Musil 2000 - 2013; #X text 59 47 symbol; #X msg 168 58 "1.234567890123456; #X msg 61 64 123.45; #X obj 61 109 makefilename %s123456; #X text 165 40 double quotes number selector; #X msg 620 78 1e+11; #X msg 619 102 1e+12; #X msg 378 103 1 0 0 0 0 0 0 0 0 0 0 0; #X msg 381 131 1 0 0 0 0 0 0 0 0 0 0 0 0; #X msg 379 77 3.14 15 926 535 89 79; #X obj 345 70 t l; #X text 378 44 space separated number list; #X text 619 51 float; #X obj 573 74 t f; #X text 403 57 (list of floats); #X text 386 152 the input needs a list of floats and integers \, which present a human readable double precision float; #X text 385 189 the outputs are two floats \, left one is the float-truncated value of internal double value \, the right one is the difference between internal value and left output.; #X connect 17 0 2 0; #X connect 20 0 13 0; #X connect 20 0 17 0; #X connect 20 1 12 0; #X connect 20 1 17 1; #X connect 21 0 27 0; #X connect 25 0 20 0; #X connect 26 0 21 0; #X connect 27 0 20 0; #X connect 29 0 37 0; #X connect 30 0 37 0; #X connect 31 0 34 0; #X connect 32 0 34 0; #X connect 33 0 34 0; #X connect 34 0 20 0; #X connect 37 0 20 0; iem_utils-v0.0.20180206/iem_dp/div~~-help.pd0000644000175000017500000000510012630366345020556 0ustar zmoelnigzmoelnig#N canvas 291 113 944 545 10; #X symbolatom 194 388 25 0 0 0 - - -; #X text 134 493 IEM KUG; #X text 118 481 musil; #X text 155 481 @; #X text 164 481 iem.at; #X text 117 503 Graz \, Austria; #X text 177 455 @; #X text 186 455 iem.at; #X text 118 455 zmoelnig; #X obj 139 97 sig~; #X obj 99 97 sig~; #X obj 360 144 sig~; #X obj 320 144 sig~; #X msg 13 84 \; pd dsp \$1; #X obj 13 64 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 0 1 ; #X text 70 13 double precision signal multiplication; #N canvas 0 22 330 356 sunsig~~ 0; #X obj 22 195 snapshot~; #X obj 47 103 metro 300; #X obj 46 81 loadbang; #X obj 22 18 inlet~; #X obj 122 18 inlet~; #X obj 122 195 snapshot~; #X obj 47 136 t b b; #X obj 36 277 outlet; #X obj 35 248 dptosym; #X connect 0 0 8 0; #X connect 1 0 6 0; #X connect 2 0 1 0; #X connect 3 0 0 0; #X connect 4 0 5 0; #X connect 5 0 8 1; #X connect 6 0 0 0; #X connect 6 1 5 0; #X connect 8 0 7 0; #X restore 195 260 pd sunsig~~; #X text 14 12 /~~; #X obj 194 203 /~~ #######; #X text 117 406 should be "1.111111; #X text 406 105 = symbol selector of an anything; #X text 396 94 double precision number beginning with a "double quote" =; #X text 225 63 = symbol selector of an anything; #X text 215 52 double precision number beginning with a "double quote" =; #X msg 320 94 "1.111111; #X msg 99 51 "1.234567654321; #X text 386 388 quotient displayed via a symbol; #X text 13 38 div~~; #X obj 297 203 div~~; #X text 374 13 15 digits accurate; #X text 69 442 (c) IOhannes m zmoelnig 1999 - 2013; #X text 69 470 (c) Thomas Musil 2000 - 2013; #X obj 99 72 symtodp; #X obj 320 115 symtodp; #X symbolatom 439 307 25 0 0 0 - - -; #N canvas 0 22 330 356 sunsig~~ 0; #X obj 22 195 snapshot~; #X obj 47 103 metro 300; #X obj 46 81 loadbang; #X obj 22 18 inlet~; #X obj 122 18 inlet~; #X obj 122 195 snapshot~; #X obj 47 136 t b b; #X obj 36 277 outlet; #X obj 35 248 dptosym; #X connect 0 0 8 0; #X connect 1 0 6 0; #X connect 2 0 1 0; #X connect 3 0 0 0; #X connect 4 0 5 0; #X connect 5 0 8 1; #X connect 6 0 0 0; #X connect 6 1 5 0; #X connect 8 0 7 0; #X restore 439 281 pd sunsig~~; #X obj 440 226 sig~; #X floatatom 439 206 5 0 0 0 - - -; #X obj 440 256 /~~ 100 0; #X obj 516 255 div~~ 100 0; #X connect 9 0 18 1; #X connect 10 0 18 0; #X connect 11 0 18 3; #X connect 12 0 18 2; #X connect 14 0 13 0; #X connect 16 0 0 0; #X connect 18 0 16 0; #X connect 18 1 16 1; #X connect 24 0 33 0; #X connect 25 0 32 0; #X connect 32 0 10 0; #X connect 32 1 9 0; #X connect 33 0 12 0; #X connect 33 1 11 0; #X connect 35 0 34 0; #X connect 36 0 38 0; #X connect 37 0 36 0; #X connect 38 0 35 0; #X connect 38 1 35 1; iem_utils-v0.0.20180206/iem_dp/delread~~-help.pd0000644000175000017500000000166212630366345021405 0ustar zmoelnigzmoelnig#N canvas 248 216 633 323 10; #X obj 32 25 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 0 1 ; #X msg 33 48 \; pd dsp \$1; #X obj 175 65 sig~; #X floatatom 174 40 5 0 0 0 - - -; #X obj 178 197 delread~~ abc 1234 0; #X obj 178 224 unsig~; #X floatatom 178 248 5 0 0 0 - - -; #X obj 176 91 delwrite~~ abc 9876 0; #X msg 221 166 2345 0; #X msg 242 145 3456 0; #X floatatom 163 148 5 0 0 0 - - -; #X floatatom 310 144 5 0 0 0 - - -; #X obj 390 226 unsig~; #X floatatom 390 250 5 0 0 0 - - -; #X floatatom 382 122 5 0 0 0 - - -; #X floatatom 437 122 5 0 0 0 - - -; #X obj 390 199 vd~~ abc; #X obj 382 141 sig~; #X obj 436 144 sig~; #X connect 0 0 1 0; #X connect 2 0 7 0; #X connect 3 0 2 0; #X connect 4 0 5 0; #X connect 5 0 6 0; #X connect 8 0 4 0; #X connect 9 0 4 0; #X connect 10 0 4 0; #X connect 11 0 4 1; #X connect 12 0 13 0; #X connect 14 0 17 0; #X connect 15 0 18 0; #X connect 16 0 12 0; #X connect 17 0 16 0; #X connect 18 0 16 1; iem_utils-v0.0.20180206/iem_dp/mul__-help.pd0000644000175000017500000000257012630366345020503 0ustar zmoelnigzmoelnig#N canvas 223 169 932 536 10; #X symbolatom 167 326 25 0 0 0 - - -; #X text 104 453 IEM KUG; #X text 88 441 musil; #X text 125 441 @; #X text 134 441 iem.at; #X text 87 463 Graz \, Austria; #X text 147 415 @; #X text 156 415 iem.at; #X text 88 415 zmoelnig; #X floatatom 251 245 11 0 0 0 - - -; #X floatatom 227 273 11 0 0 0 - - -; #X text 337 244 difference; #X text 55 13 double precision multiplication; #X text 311 272 float casted; #X text 14 12 *__; #X text 349 326 product displayed via a symbol; #X obj 165 209 *__ 0 0; #X text 90 342 should be "1.234567654321; #X msg 163 61 "1.111111; #X msg 385 98 "1.111111; #X text 250 73 = symbol selector of an anything; #X text 240 62 double precision number beginning with a "double quote" =; #X text 471 109 = symbol selector of an anything; #X text 461 98 double precision number beginning with a "double quote" =; #X obj 166 303 dptosym; #X obj 239 209 mul__ 0 0; #X obj 316 209 *'' 0 0; #X text 14 32 mul__; #X text 14 57 *''; #X text 294 13 15 digits accurate; #X text 39 402 (c) IOhannes m zmoelnig 1999 - 2013; #X text 39 430 (c) Thomas Musil 2000 - 2013; #X obj 164 87 symtodp; #X obj 385 120 symtodp; #X connect 16 0 10 0; #X connect 16 0 24 0; #X connect 16 1 9 0; #X connect 16 1 24 1; #X connect 18 0 32 0; #X connect 19 0 33 0; #X connect 24 0 0 0; #X connect 32 0 16 0; #X connect 32 1 16 1; #X connect 33 0 16 2; #X connect 33 1 16 3; iem_utils-v0.0.20180206/iem_dp/tabread~~-help.pd0000644000175000017500000000376512630366345021415 0ustar zmoelnigzmoelnig#N canvas 78 22 896 636 10; #X obj 28 14 tgl 15 0 empty empty empty 20 8 0 10 -262144 -1 -1 0 1 ; #X floatatom 28 81 5 0 0 0 - - -; #X floatatom 44 59 3 0 0 0 - - -; #X obj 28 36 dsp; #X obj 408 27 loadbang; #X text 417 231 see also:; #N canvas 0 22 450 300 (subpatch) 0; #X array array99 13 float 0; #X coords 0 5.5 12 -5.5 250 200 1; #X restore 121 44 graph; #X obj 41 523 snapshot~; #X obj 176 507 metro 200; #X obj 40 408 sig~; #X floatatom 41 549 0 0 0 0 - - -; #X obj 176 462 loadbang; #X obj 176 486 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X floatatom 40 369 0 0 0 0 - - -; #X obj 408 50 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 43 350 hsl 101 15 1 11 0 0 empty empty empty -2 -6 0 8 -262144 -1 -1 0 1; #X text 498 548 IEM KUG; #X text 482 536 musil; #X text 519 536 @; #X text 528 536 iem.at; #X text 481 558 Graz \, Austria; #X text 541 510 @; #X text 550 510 iem.at; #X text 482 510 zmoelnig; #X msg 408 72 \; array99 resize 13 \; array99 0 -5 -5 -4 -3 -2 -1 0 1 2 3 4 5 5 \; array99 bounds 0 5.5 12 -5.5 \; array99 xticks 0 1 2 \; array99 yticks 0 0.5 5 \; array99 xlabel -6 0 2 4 6 8 10 12 \; array99 ylabel -0.4 -5 -4 -3 -2 -1 0 1 2 3 4 5; #X obj 484 230 tabread~; #X obj 41 488 tabread~~ array99; #X obj 84 427 sig~; #X text 71 408 first part of float inlet sum; #X text 113 426 second part of float inlet sum; #X text 13 -15 tabread~~; #X text 434 497 (c) IOhannes m zmoelnig 1999 - 2013; #X text 433 525 (c) Thomas Musil 2000 - 2013; #X text 117 -13 non-interpolating table lookup with double precision index (15 digits accurate); #X text 118 -37; #X text 44 272 tabread is used to build samplers and other table lookup algorithms. The interpolation scheme is rounding down integer.; #X connect 0 0 3 0; #X connect 3 0 1 0; #X connect 3 1 2 0; #X connect 4 0 14 0; #X connect 7 0 10 0; #X connect 8 0 7 0; #X connect 9 0 26 0; #X connect 11 0 12 0; #X connect 12 0 8 0; #X connect 13 0 9 0; #X connect 14 0 24 0; #X connect 15 0 13 0; #X connect 26 0 7 0; #X connect 27 0 26 1; iem_utils-v0.0.20180206/iem_dp/GnuGPL.txt0000644000175000017500000004311012630366345017765 0ustar zmoelnigzmoelnig GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License. iem_utils-v0.0.20180206/iem_dp/tabread__-help.pd0000644000175000017500000000522612630366345021311 0ustar zmoelnigzmoelnig#N canvas 460 141 892 632 10; #X obj 406 74 loadbang; #X text 425 271 see also:; #N canvas 0 22 450 300 (subpatch) 0; #X array array99 13 float 0; #X coords 0 5.5 12 -5.5 250 200 1; #X restore 121 64 graph; #X floatatom 41 537 0 0 0 0 - - -; #X obj 497 55 table array98 1.7e+07; #X floatatom 293 537 0 0 0 0 - - -; #X floatatom 155 376 0 0 0 0 - - -; #X obj 293 452 + 0; #X obj 158 357 hsl 101 15 1 11 0 0 empty empty empty -2 -6 0 8 -262144 -1 -1 0 1; #X obj 306 432 r \$0_offset; #X obj 145 428 r \$0_offset; #X obj 312 485 r \$0_which_table; #X obj 40 467 r \$0_which_table; #N canvas 0 22 470 320 select_table 0; #X obj 55 24 inlet; #X msg 55 112 0; #X msg 109 180 1.698e+07; #X obj 55 90 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 109 158 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 55 133 s \$0_offset; #X obj 109 201 s \$0_offset; #X obj 186 200 s \$0_which_table; #X msg 186 178 set array98; #X obj 127 133 s \$0_which_table; #X msg 127 111 set array99; #X obj 55 47 sel 0 1; #X connect 0 0 11 0; #X connect 1 0 5 0; #X connect 2 0 6 0; #X connect 3 0 10 0; #X connect 3 0 1 0; #X connect 4 0 2 0; #X connect 4 0 8 0; #X connect 8 0 7 0; #X connect 10 0 9 0; #X connect 11 0 3 0; #X connect 11 1 4 0; #X restore 275 390 pd select_table; #X obj 275 356 vradio 15 1 0 2 empty empty empty 0 -6 0 8 -262144 -1 -1 0; #X text 294 354 array99 offset=0; #X text 293 369 array98 offset=1.698e+07; #X text 604 566 IEM KUG; #X text 588 554 musil; #X text 625 554 @; #X text 634 554 iem.at; #X text 587 576 Graz \, Austria; #X text 647 528 @; #X text 656 528 iem.at; #X text 588 528 zmoelnig; #X msg 406 95 \; array98 const 0 \; array99 resize 13 \; array99 0 -5 -5 -4 -3 -2 -1 0 1 2 3 4 5 5 \; array99 bounds 0 5.5 12 -5.5 \; array99 xticks 0 1 2 \; array99 yticks 0 0.5 5 \; array99 xlabel -6 0 2 4 6 8 10 12 \; array99 ylabel -0.4 -5 -4 -3 -2 -1 0 1 2 3 4 5 \; array98 1.698e+07 -5 -5 -4 -3 -2 -1 0 1 2 3 4 5 5; #X text 13 11 tabread__; #X text 14 27 tabread''; #X obj 41 508 tabread__ array99; #X obj 77 533 tabread'' array99; #X obj 293 511 tabread array99; #X obj 493 271 tabread; #X text 41 291 tabread is used to build samplers and other table lookup algorithms. The interpolation scheme is rounding down integer.; #X text 539 515 (c) IOhannes m zmoelnig 1999 - 2013; #X text 539 543 (c) Thomas Musil 2000 - 2013; #X text 116 10 non-interpolating table lookup with double precision index (15 digits accurate); #X connect 0 0 25 0; #X connect 6 0 7 0; #X connect 6 0 28 0; #X connect 7 0 30 0; #X connect 8 0 6 0; #X connect 9 0 7 1; #X connect 10 0 28 1; #X connect 11 0 30 0; #X connect 12 0 28 0; #X connect 14 0 13 0; #X connect 28 0 3 0; #X connect 30 0 5 0; iem_utils-v0.0.20180206/iem_dp/README.txt0000644000175000017500000000207512630366345017633 0ustar zmoelnigzmoelnigiem_dp is a double precision library written by Thomas Musil and IOhannes Zmoelnig The goal of this library is to allow more than 24 bit accurate access to arrays and delay-lines. That means: with 32-bit IEEE floatingpoint we have a 23 bit mantissa with a resolution of 1 to 8388608. If you want to access to an array ( size greater than 8388608 ) by tabread4, you get a staircase-shaped output. The objects of this library work internal with double or 32-bit integer instead 24-bit mantissa of 32-bit float. To connect this higher resolution, we need 2 signal or 2 message cords. One for the float casted number and one for the difference to the higher resolution number. ftohex symtodp dptosym dptohex vline~~ samphold~~ wrap~~ phasor~~ print~~ add__ , +__ , +'' sub__ , -__ , -'' mul__ , *__ , *'' div__ , /__ , /'' add~~ , +~~ sub~~ , -~~ mul~~ , *~~ div~~ , /~~ tabwrite__ , tabwrite'' tabread__ , tabread'' tabread4__ , tabread4'' tabwrite~~ tabread~~ tabread4~~ max__ , max'' min__ , min'' max~~ min~~ random__ , random'' delwrite~~ delread~~ vd~~iem_utils-v0.0.20180206/iem_dp/vline~~-help.pd0000644000175000017500000000573512630366345021127 0ustar zmoelnigzmoelnig#N canvas 84 36 1151 705 10; #X obj 30 19 tgl 15 0 empty empty empty 20 8 0 10 -262144 -1 -1 0 1 ; #X floatatom 30 86 5 0 0 0 - - -; #X floatatom 46 64 3 0 0 0 - - -; #X obj 30 41 dsp; #X text 416 24 see also:; #X text 381 117 IEM KUG; #X text 365 105 musil; #X text 402 105 @; #X text 411 105 iem.at; #X text 364 127 Graz \, Austria; #X text 424 79 @; #X text 433 79 iem.at; #X text 365 79 zmoelnig; #X obj 489 25 vline~; #X text 15 -10 vline~~; #X obj 35 579 snapshot~; #X floatatom 35 602 5 0 0 0 - - -; #X obj 45 552 metro 100; #X msg 87 477 stop; #X text 189 185 ramp up; #X text 198 204 ramp down; #X text 115 148 jump down; #X text 130 476 "stop" message freezes vline~ at its current value ; #X obj 45 527 loadbang; #X msg 66 149 0 0.1; #X obj 35 504 vline~~ #####; #X msg 60 130 1 0.1; #X text 109 129 jump up; #X text 275 290 delayed ramp up; #X text 284 309 delayed ramp down; #X msg 81 185 1 0.1 2000 20; #X msg 89 204 0 0.1 2000 20; #X msg 114 290 1 0.1 2000 20 1000 10; #X msg 122 309 0 0.1 2000 20 1000 10; #X text 242 238 delayed jump up; #X text 251 257 delayed jump down; #X msg 123 258 0 0.1 0 0 1000 10; #X text 133 330 ramp up \, stay at top \, jump down \, ramp up again \, stay top \, ramp down; #X msg 115 238 1 0.1 0 0 1000 10; #X msg 130 358 1 0.1 2000 20 0 0 \, 0 0.1 0 0 2500 25 \, 1 0.1 2000 20 2500 25 \, 0 0.1 2000 20 5000 50; #X msg 136 422 1 0.1 2000 20 0 0 \, 0 0.1 0 0 2000 20 \, 1 0.1 2000 20 2000 20 \, 0 0.1 2000 20 4000 40; #X text 135 402 ramp up \, jump down \, ramp up again \, ramp down ; #X obj 1002 61 loadbang; #N canvas 0 22 450 300 (subpatch) 0; #X array array99 200 float 0; #X coords 0 1.1 199 -0.1 250 200 1; #X restore 664 35 graph; #X obj 691 422 vline~~; #X obj 657 455 tabwrite~ array99; #X obj 656 325 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144 -1 -1; #X obj 656 349 t b b; #X msg 690 396 \$1 0 \$2 0 \$3 0; #X msg 689 372 1 1 0 \, 0 0 1.3 \, 1 1 1.6 \, 0 1 2.8; #X text 800 397 add to each parameter the fine offset of zero; #X msg 1001 84 \; array99 const 0 \; array99 resize 200 \; array99 bounds 0 1.1 199 -0.1 \; array99 xticks 0 5 4 \; array99 yticks 0 0.1 1 \; array99 xlabel -0.15 0 20 40 60 80 100 120 140 160 180 200 \; array99 ylabel -9 0 0.2 0.4 0.6 0.8 1; #X text 82 -11 - double precision audio ramp generator; #X text 316 67 (c) IOhannes m zmoelnig 1999 - 2013; #X text 316 94 (c) Thomas Musil 2000 - 2013; #X obj 139 579 snapshot~; #X floatatom 139 602 9 0 0 0 - - -; #X connect 0 0 3 0; #X connect 3 0 1 0; #X connect 3 1 2 0; #X connect 15 0 16 0; #X connect 17 0 15 0; #X connect 18 0 25 0; #X connect 23 0 17 0; #X connect 24 0 25 0; #X connect 25 0 15 0; #X connect 25 1 55 0; #X connect 26 0 25 0; #X connect 30 0 25 0; #X connect 31 0 25 0; #X connect 32 0 25 0; #X connect 33 0 25 0; #X connect 36 0 25 0; #X connect 38 0 25 0; #X connect 39 0 25 0; #X connect 40 0 25 0; #X connect 42 0 51 0; #X connect 44 0 45 0; #X connect 46 0 47 0; #X connect 47 0 45 0; #X connect 47 1 49 0; #X connect 48 0 44 0; #X connect 49 0 48 0; #X connect 55 0 56 0; iem_utils-v0.0.20180206/iem_dp/samphold~~-help.pd0000644000175000017500000000340312630366345021607 0ustar zmoelnigzmoelnig#N canvas 404 97 682 587 10; #X obj 30 19 tgl 15 0 empty empty empty 20 8 0 10 -262144 -1 -1 0 1 ; #X floatatom 30 86 5 0 0 0 - - -; #X floatatom 46 64 3 0 0 0 - - -; #X obj 30 41 dsp; #X text 516 25 see also:; #X text 468 119 IEM KUG; #X text 452 107 musil; #X text 489 107 @; #X text 498 107 iem.at; #X text 451 129 Graz \, Austria; #X text 511 81 @; #X text 520 81 iem.at; #X text 452 81 zmoelnig; #X obj 30 518 snapshot~; #X floatatom 30 541 5 0 0 0 - - -; #X obj 40 467 metro 100; #X obj 40 442 loadbang; #X text 11 -2 samphold~~; #X obj 588 25 samphold~; #X obj 30 419 samphold~~; #X obj 96 308 sig~; #X obj 259 311 sig~; #X floatatom 96 283 3 0 0 0 - - -; #X floatatom 259 286 3 0 0 0 - - -; #X msg 48 232 reset; #X text 127 162 set output to a number; #X text 134 283 sample signal; #X text 302 284 control signal; #X text 161 187 reset previous value; #X text 111 243 to force the next sample; #X text 160 201 for control inlet; #X text 110 229 reset to default 1e+20; #X msg 35 163 set 34 0.34; #X msg 43 195 reset 10 0.1; #X obj 108 335 *~ 0.01; #X obj 271 339 *~ 0.01; #X text 107 -1 - double precision sample and hold unit; #X text 403 68 (c) IOhannes m zmoelnig 1999 - 2013; #X text 403 96 (c) Thomas Musil 2000 - 2013; #X obj 64 494 t b b; #X obj 129 520 snapshot~; #X floatatom 129 543 9 0 0 0 - - -; #X connect 0 0 3 0; #X connect 3 0 1 0; #X connect 3 1 2 0; #X connect 13 0 14 0; #X connect 15 0 39 0; #X connect 16 0 15 0; #X connect 19 0 13 0; #X connect 19 1 40 0; #X connect 20 0 34 0; #X connect 20 0 19 0; #X connect 21 0 35 0; #X connect 21 0 19 2; #X connect 22 0 20 0; #X connect 23 0 21 0; #X connect 24 0 19 0; #X connect 32 0 19 0; #X connect 33 0 19 0; #X connect 34 0 19 1; #X connect 35 0 19 3; #X connect 39 0 13 0; #X connect 39 1 40 0; #X connect 40 0 41 0; iem_utils-v0.0.20180206/iem_dp/max__-help.pd0000644000175000017500000000255612630366345020477 0ustar zmoelnigzmoelnig#N canvas 223 169 932 536 10; #X symbolatom 167 326 25 0 0 0 - - -; #X text 104 453 IEM KUG; #X text 88 441 musil; #X text 125 441 @; #X text 134 441 iem.at; #X text 87 463 Graz \, Austria; #X text 147 415 @; #X text 156 415 iem.at; #X text 88 415 zmoelnig; #X floatatom 251 245 11 0 0 0 - - -; #X floatatom 227 273 11 0 0 0 - - -; #X text 337 244 difference; #X text 311 272 float casted; #X text 349 326 product displayed via a symbol; #X text 258 73 = symbol selector of an anything; #X text 248 62 double precision number beginning with a "double quote" =; #X text 479 109 = symbol selector of an anything; #X text 469 98 double precision number beginning with a "double quote" =; #X obj 166 303 dptosym; #X text 14 12 max__; #X text 14 34 max''; #X obj 165 209 max__ 0 0; #X obj 246 211 max'' 0 0; #X msg 163 61 "1.111111112; #X msg 385 98 "1.111111113; #X text 102 341 should be "1.111111113; #X text 55 13 double precision comparsion \, output the greater value ; #X text 419 12 15 digits accurate; #X text 39 402 (c) IOhannes m zmoelnig 1999 - 2013; #X text 39 430 (c) Thomas Musil 2000 - 2013; #X obj 164 87 symtodp; #X obj 385 120 symtodp; #X connect 18 0 0 0; #X connect 21 0 10 0; #X connect 21 0 18 0; #X connect 21 1 9 0; #X connect 21 1 18 1; #X connect 23 0 30 0; #X connect 24 0 31 0; #X connect 30 0 21 0; #X connect 30 1 21 1; #X connect 31 0 21 2; #X connect 31 1 21 3; iem_utils-v0.0.20180206/iem_roomsim/0000755000175000017500000000000013236306220017200 5ustar zmoelnigzmoelnigiem_utils-v0.0.20180206/iem_roomsim/LICENSE.txt0000644000175000017500000000207712630366346021045 0ustar zmoelnigzmoelnigiem_roomsim - dynamic library for pd; 2 mirror source method rendering objects Copyright (C) 2000-2006 Thomas MUSIL [musil_at_iem.at] IEM - Institute of Electronic Music and Acoustics, Graz Inffeldgasse 10/3, 8010 Graz, Austria http://iem.at This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details ( GnuGPL.txt ). (e.g. http://www.gnu.org/copyleft/gpl.html) You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Graz, 15 Nov. 2006 Thomas Musiliem_utils-v0.0.20180206/iem_roomsim/src/0000755000175000017500000000000013236306220017767 5ustar zmoelnigzmoelnigiem_utils-v0.0.20180206/iem_roomsim/src/makefile_d_ppc0000644000175000017500000000143112630366346022647 0ustar zmoelnigzmoelnigcurrent: all .SUFFIXES: .d_ppc PD_INSTALL_PATH = "/Applications/Pd.app/Contents/Resources" INCLUDE = -I. -I$(PD_INSTALL_PATH)/src CFLAGS =-DPD -O2 -Wall -W -Wshadow -Wstrict-prototypes \ -Wno-unused -Wno-parentheses -Wno-switch LFLAGS = -bundle -undefined suppress -flat_namespace # the sources SRC = early_reflections_3d.c \ early_reflections_2d.c \ cart2del_damp_2d.c \ cart2del_damp_3d.c \ iem_roomsim.c TARGET = iem_roomsim.d_ppc OBJ = $(SRC:.c=.o) # # ------------------ targets ------------------------------------ # clean: rm ../$(TARGET) rm *.o all: $(OBJ) @echo :: $(OBJ) $(CC) $(LFLAGS) -o $(TARGET) *.o strip -S -x $(TARGET) mv $(TARGET) .. $(OBJ) : %.o : %.c touch $*.c $(CC) $(CFLAGS) $(INCLUDE) -c -o $*.o $*.c iem_utils-v0.0.20180206/iem_roomsim/src/makefile_vc9proj0000644000175000017500000000176112630366346023164 0ustar zmoelnigzmoelnigTARGET = iem_roomsim all: ..\$(TARGET).dll VIS_CPP_PATH = "C:\Program Files\Microsoft Visual Studio 9.0\VC" VIS_SDK_PATH = "C:\Program Files\Microsoft SDKs\Windows\v6.0A" PD_INST_PATH = "C:\Program Files\pd-0.43.0" PD_WIN_INCLUDE_PATH = /I. /I$(PD_INST_PATH)\src /I$(VIS_CPP_PATH)\include PD_WIN_C_FLAGS = /nologo /W3 /WX /DMSW /DNT /DPD /DWIN32 /DWINDOWS /Ox -D_CRT_SECURE_NO_WARNINGS PD_WIN_L_FLAGS = /nologo PD_WIN_LIB = /NODEFAULTLIB:libcmt /NODEFAULTLIB:oldnames /NODEFAULTLIB:kernel32 \ $(VIS_CPP_PATH)\lib\libcmt.lib \ $(VIS_CPP_PATH)\lib\oldnames.lib \ $(VIS_SDK_PATH)\lib\kernel32.lib \ $(PD_INST_PATH)\bin\pd.lib SRC = early_reflections_3d.c \ early_reflections_2d.c \ cart2del_damp_2d.c \ cart2del_damp_3d.c \ iem_roomsim.c OBJ = $(SRC:.c=.obj) .c.obj: cl $(PD_WIN_C_FLAGS) $(PD_WIN_INCLUDE_PATH) /c $*.c ..\$(TARGET).dll: $(OBJ) link $(PD_WIN_L_FLAGS) /dll /export:$(TARGET)_setup \ /out:..\$(TARGET).dll $(OBJ) $(PD_WIN_LIB) clean: del *.obj iem_utils-v0.0.20180206/iem_roomsim/src/iem_roomsim.dsp0000644000175000017500000000505112630366346023033 0ustar zmoelnigzmoelnig# Microsoft Developer Studio Project File - Name="iem_roomsim" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** NICHT BEARBEITEN ** # TARGTYPE "Win32 (x86) External Target" 0x0106 CFG=iem_roomsim - Win32 Debug !MESSAGE Dies ist kein gültiges Makefile. Zum Erstellen dieses Projekts mit NMAKE !MESSAGE verwenden Sie den Befehl "Makefile exportieren" und führen Sie den Befehl !MESSAGE !MESSAGE NMAKE /f "iem_roomsim.mak". !MESSAGE !MESSAGE Sie können beim Ausführen von NMAKE eine Konfiguration angeben !MESSAGE durch Definieren des Makros CFG in der Befehlszeile. Zum Beispiel: !MESSAGE !MESSAGE NMAKE /f "iem_roomsim.mak" CFG="iem_roomsim - Win32 Debug" !MESSAGE !MESSAGE Für die Konfiguration stehen zur Auswahl: !MESSAGE !MESSAGE "iem_roomsim - Win32 Release" (basierend auf "Win32 (x86) External Target") !MESSAGE "iem_roomsim - Win32 Debug" (basierend auf "Win32 (x86) External Target") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" !IF "$(CFG)" == "iem_roomsim - Win32 Release" # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "Release" # PROP BASE Intermediate_Dir "Release" # PROP BASE Cmd_Line "NMAKE /f makefile_win" # PROP BASE Rebuild_Opt "/a" # PROP BASE Target_File "makefile_win.exe" # PROP BASE Bsc_Name "makefile_win.bsc" # PROP BASE Target_Dir "" # PROP Use_Debug_Libraries 0 # PROP Output_Dir "Release" # PROP Intermediate_Dir "Release" # PROP Cmd_Line "NMAKE /f makefile_win" # PROP Rebuild_Opt "/a" # PROP Target_File "iem_roomsim.exe" # PROP Bsc_Name "iem_roomsim.bsc" # PROP Target_Dir "" !ELSEIF "$(CFG)" == "iem_roomsim - Win32 Debug" # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "Debug" # PROP BASE Intermediate_Dir "Debug" # PROP BASE Cmd_Line "NMAKE /f makefile_win" # PROP BASE Rebuild_Opt "/a" # PROP BASE Target_File "makefile_win.exe" # PROP BASE Bsc_Name "makefile_win.bsc" # PROP BASE Target_Dir "" # PROP Use_Debug_Libraries 1 # PROP Output_Dir "Debug" # PROP Intermediate_Dir "Debug" # PROP Cmd_Line "NMAKE /f makefile_win" # PROP Rebuild_Opt "/a" # PROP Target_File "iem_roomsim.exe" # PROP Bsc_Name "iem_roomsim.bsc" # PROP Target_Dir "" !ENDIF # Begin Target # Name "iem_roomsim - Win32 Release" # Name "iem_roomsim - Win32 Debug" !IF "$(CFG)" == "iem_roomsim - Win32 Release" !ELSEIF "$(CFG)" == "iem_roomsim - Win32 Debug" !ENDIF # Begin Source File SOURCE=.\makefile_win # End Source File # End Target # End Project iem_utils-v0.0.20180206/iem_roomsim/src/VC7/0000755000175000017500000000000012630366346020402 5ustar zmoelnigzmoelnigiem_utils-v0.0.20180206/iem_roomsim/src/VC7/iem_roomsim.vcproj0000644000175000017500000000244112630366346024147 0ustar zmoelnigzmoelnig iem_utils-v0.0.20180206/iem_roomsim/src/VC7/makefile_vc7proj0000644000175000017500000000200312630366346023547 0ustar zmoelnigzmoelnigTARGET = iem_roomsim all: ..\$(TARGET).dll VIS_CPP_PATH = "C:\Programme\Microsoft Visual Studio .NET 2003\Vc7" VIS_SDK_PATH = "C:\Programme\Microsoft Visual Studio .NET 2003\Vc7\PlatformSDK" PD_INST_PATH = "C:\Programme\pd-0.42-5" PD_WIN_INCLUDE_PATH = /I. /I$(PD_INST_PATH)\src /I$(VIS_CPP_PATH)\include PD_WIN_C_FLAGS = /nologo /W3 /WX /DMSW /DNT /DPD /DWIN32 /DWINDOWS /Ox -D_CRT_SECURE_NO_WARNINGS PD_WIN_L_FLAGS = /nologo PD_WIN_LIB = /NODEFAULTLIB:libcmt /NODEFAULTLIB:oldnames /NODEFAULTLIB:kernel32 \ $(VIS_CPP_PATH)\lib\libcmt.lib \ $(VIS_CPP_PATH)\lib\oldnames.lib \ $(VIS_SDK_PATH)\lib\kernel32.lib \ $(PD_INST_PATH)\bin\pd.lib SRC = early_reflections_3d.c \ early_reflections_2d.c \ cart2del_damp_2d.c \ cart2del_damp_3d.c \ iem_roomsim.c OBJ = $(SRC:.c=.obj) .c.obj: cl $(PD_WIN_C_FLAGS) $(PD_WIN_INCLUDE_PATH) /c $*.c ..\$(TARGET).dll: $(OBJ) link $(PD_WIN_L_FLAGS) /dll /export:$(TARGET)_setup \ /out:..\$(TARGET).dll $(OBJ) $(PD_WIN_LIB) clean: del *.obj iem_utils-v0.0.20180206/iem_roomsim/src/makefile_linux0000644000175000017500000000153512630366346022726 0ustar zmoelnigzmoelnigcurrent: all .SUFFIXES: .pd_linux INCLUDE = -I. -I/usr/local/src/pd/src LDFLAGS = -export-dynamic -shared LIB = -ldl -lm -lpthread #select either the DBG and OPT compiler flags below: CFLAGS = -DPD -DUNIX -W -Werror -Wno-unused \ -Wno-parentheses -Wno-switch -O6 -funroll-loops -fomit-frame-pointer -fno-strict-aliasing \ -DDL_OPEN -fPIC SYSTEM = $(shell uname -m) # the sources SRC = early_reflections_3d.c \ early_reflections_2d.c \ cart2del_damp_2d.c \ cart2del_damp_3d.c \ iem_roomsim.c TARGET = iem_roomsim.pd_linux OBJ = $(SRC:.c=.o) # # ------------------ targets ------------------------------------ # clean: rm ..\$(TARGET) rm *.o all: $(OBJ) @echo :: $(OBJ) $(LD) $(LDFLAGS) -o $(TARGET) *.o $(LIB) strip --strip-unneeded $(TARGET) mv $(TARGET) .. $(OBJ) : %.o : %.c $(CC) $(CFLAGS) $(INCLUDE) -c -o $*.o $*.c iem_utils-v0.0.20180206/iem_roomsim/src/VC6/0000755000175000017500000000000012630366346020401 5ustar zmoelnigzmoelnigiem_utils-v0.0.20180206/iem_roomsim/src/VC6/iem_roomsim.dsp0000644000175000017500000000505112630366346023431 0ustar zmoelnigzmoelnig# Microsoft Developer Studio Project File - Name="iem_roomsim" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** NICHT BEARBEITEN ** # TARGTYPE "Win32 (x86) External Target" 0x0106 CFG=iem_roomsim - Win32 Debug !MESSAGE Dies ist kein gültiges Makefile. Zum Erstellen dieses Projekts mit NMAKE !MESSAGE verwenden Sie den Befehl "Makefile exportieren" und führen Sie den Befehl !MESSAGE !MESSAGE NMAKE /f "iem_roomsim.mak". !MESSAGE !MESSAGE Sie können beim Ausführen von NMAKE eine Konfiguration angeben !MESSAGE durch Definieren des Makros CFG in der Befehlszeile. Zum Beispiel: !MESSAGE !MESSAGE NMAKE /f "iem_roomsim.mak" CFG="iem_roomsim - Win32 Debug" !MESSAGE !MESSAGE Für die Konfiguration stehen zur Auswahl: !MESSAGE !MESSAGE "iem_roomsim - Win32 Release" (basierend auf "Win32 (x86) External Target") !MESSAGE "iem_roomsim - Win32 Debug" (basierend auf "Win32 (x86) External Target") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" !IF "$(CFG)" == "iem_roomsim - Win32 Release" # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "Release" # PROP BASE Intermediate_Dir "Release" # PROP BASE Cmd_Line "NMAKE /f makefile_win" # PROP BASE Rebuild_Opt "/a" # PROP BASE Target_File "makefile_win.exe" # PROP BASE Bsc_Name "makefile_win.bsc" # PROP BASE Target_Dir "" # PROP Use_Debug_Libraries 0 # PROP Output_Dir "Release" # PROP Intermediate_Dir "Release" # PROP Cmd_Line "NMAKE /f makefile_win" # PROP Rebuild_Opt "/a" # PROP Target_File "iem_roomsim.exe" # PROP Bsc_Name "iem_roomsim.bsc" # PROP Target_Dir "" !ELSEIF "$(CFG)" == "iem_roomsim - Win32 Debug" # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "Debug" # PROP BASE Intermediate_Dir "Debug" # PROP BASE Cmd_Line "NMAKE /f makefile_win" # PROP BASE Rebuild_Opt "/a" # PROP BASE Target_File "makefile_win.exe" # PROP BASE Bsc_Name "makefile_win.bsc" # PROP BASE Target_Dir "" # PROP Use_Debug_Libraries 1 # PROP Output_Dir "Debug" # PROP Intermediate_Dir "Debug" # PROP Cmd_Line "NMAKE /f makefile_win" # PROP Rebuild_Opt "/a" # PROP Target_File "iem_roomsim.exe" # PROP Bsc_Name "iem_roomsim.bsc" # PROP Target_Dir "" !ENDIF # Begin Target # Name "iem_roomsim - Win32 Release" # Name "iem_roomsim - Win32 Debug" !IF "$(CFG)" == "iem_roomsim - Win32 Release" !ELSEIF "$(CFG)" == "iem_roomsim - Win32 Debug" !ENDIF # Begin Source File SOURCE=.\makefile_win # End Source File # End Target # End Project iem_utils-v0.0.20180206/iem_roomsim/src/VC6/iem_roomsim.dsw0000644000175000017500000000107512630366346023442 0ustar zmoelnigzmoelnigMicrosoft Developer Studio Workspace File, Format Version 6.00 # WARNUNG: DIESE ARBEITSBEREICHSDATEI DARF NICHT BEARBEITET ODER GELÖSCHT WERDEN! ############################################################################### Project: "iem_roomsim"=.\iem_roomsim.dsp - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ }}} ############################################################################### Global: Package=<5> {{{ }}} Package=<3> {{{ }}} ############################################################################### iem_utils-v0.0.20180206/iem_roomsim/src/VC6/makefile_win0000644000175000017500000000202012630366346022750 0ustar zmoelnigzmoelnig all: ..\iem_roomsim.dll VIS_CPP_PATH = "C:\Programme\Microsoft Visual Studio\Vc98" PD_INST_PATH = "C:\Programme\pd" PD_WIN_INCLUDE_PATH = /I. /I$(PD_INST_PATH)\src /I$(VIS_CPP_PATH)\include PD_WIN_C_FLAGS = /nologo /W3 /WX /DMSW /DNT /DPD /DWIN32 /DWINDOWS /Ox -DPA_LITTLE_ENDIAN PD_WIN_L_FLAGS = /nologo PD_WIN_LIB = /NODEFAULTLIB:libc /NODEFAULTLIB:oldnames /NODEFAULTLIB:kernel /NODEFAULTLIB:uuid \ $(VIS_CPP_PATH)\lib\libc.lib \ $(VIS_CPP_PATH)\lib\oldnames.lib \ $(VIS_CPP_PATH)\lib\kernel32.lib \ $(VIS_CPP_PATH)\lib\wsock32.lib \ $(VIS_CPP_PATH)\lib\winmm.lib \ $(PD_INST_PATH)\bin\pthreadVC.lib \ $(PD_INST_PATH)\bin\pd.lib SRC = early_reflections_3d.c \ early_reflections_2d.c \ cart2del_damp_2d.c \ cart2del_damp_3d.c \ iem_roomsim.c OBJ = $(SRC:.c=.obj) .c.obj: cl $(PD_WIN_C_FLAGS) $(PD_WIN_INCLUDE_PATH) /c $*.c ..\iem_roomsim.dll: $(OBJ) link $(PD_WIN_L_FLAGS) /dll /export:iem_roomsim_setup \ /out:..\iem_roomsim.dll $(OBJ) $(PD_WIN_LIB) clean: del *.obj iem_utils-v0.0.20180206/iem_roomsim/src/iemlib.h0000644000175000017500000000762412630366346021426 0ustar zmoelnigzmoelnig/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iemlib written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2012 */ #ifndef __IEMLIB_H__ #define __IEMLIB_H__ #define IS_A_NULL(atom,index) ((atom+index)->a_type == A_NULL) #define IS_A_POINTER(atom,index) ((atom+index)->a_type == A_POINTER) #define IS_A_FLOAT(atom,index) ((atom+index)->a_type == A_FLOAT) #define IS_A_SYMBOL(atom,index) ((atom+index)->a_type == A_SYMBOL) #define IS_A_DOLLAR(atom,index) ((atom+index)->a_type == A_DOLLAR) #define IS_A_DOLLSYM(atom,index) ((atom+index)->a_type == A_DOLLSYM) #define IS_A_SEMI(atom,index) ((atom+index)->a_type == A_SEMI) #define IS_A_COMMA(atom,index) ((atom+index)->a_type == A_COMMA) #define SETNULL(atom) ((atom)->a_type = A_NULL) /* now miller's code starts : for 4 point interpolation for lookup tables for denormal floats */ #ifdef MSW int sys_noloadbang; //t_symbol *iemgui_key_sym=0; #include #else extern int sys_noloadbang; //extern t_symbol *iemgui_key_sym; #include #endif #define DEFDELVS 64 #define XTRASAMPS 4 #define SAMPBLK 4 #define UNITBIT32 1572864. /* 3*2^19; bit 32 has place value 1 */ /* machine-dependent definitions. These ifdefs really should have been by CPU type and not by operating system! */ #ifdef IRIX /* big-endian. Most significant byte is at low address in memory */ #define HIOFFSET 0 /* word offset to find MSB */ #define LOWOFFSET 1 /* word offset to find LSB */ #define int32 long /* a data type that has 32 bits */ #endif /* IRIX */ #ifdef MSW /* little-endian; most significant byte is at highest address */ #define HIOFFSET 1 #define LOWOFFSET 0 #define int32 long #endif /* MSW */ #if defined(__FreeBSD__) || defined(__APPLE__) || defined(__FreeBSD_kernel__) #include #endif #if defined(__linux__) || defined(__CYGWIN__) || defined(__GNU__) || defined(ANDROID) #include #endif #if defined(__unix__) || defined(__APPLE__) #if !defined(BYTE_ORDER) || !defined(LITTLE_ENDIAN) #error No byte order defined #endif #if BYTE_ORDER == LITTLE_ENDIAN #define HIOFFSET 1 #define LOWOFFSET 0 #else #define HIOFFSET 0 /* word offset to find MSB */ #define LOWOFFSET 1 /* word offset to find LSB */ #endif /* __BYTE_ORDER */ #include #define int32 int32_t #endif /* __unix__ or __APPLE__*/ union tabfudge_d { double tf_d; int32 tf_i[2]; }; union tabfudge_f { float tf_f; long tf_l; }; #if defined __i386__ || defined __x86_64__ #define IEM_DENORMAL(f) ((((*(unsigned int*)&(f))&0x60000000)==0) || \ (((*(unsigned int*)&(f))&0x60000000)==0x60000000)) /* more stringent test: anything not between 1e-19 and 1e19 in absolute val */ #else #define IEM_DENORMAL(f) 0 #endif /* on 64bit systems we cannot use garray_getfloatarray... */ #if ((defined PD_MAJOR_VERSION && defined PD_MINOR_VERSION) && (PD_MAJOR_VERSION > 0 || PD_MINOR_VERSION > 40)) # define iemarray_t t_word # define iemarray_getarray garray_getfloatwords # define iemarray_getfloat(pointer, index) (pointer[index].w_float) # define iemarray_setfloat(pointer, index, fvalue) (pointer[index].w_float = fvalue) #else # define iemarray_t t_float # define iemarray_getarray garray_getfloatarray # define iemarray_getfloat(pointer, index) (pointer[index]) # define iemarray_setfloat(pointer, index, fvalue) (pointer[index] = fvalue) #endif #endif iem_utils-v0.0.20180206/iem_roomsim/src/iem_roomsim.vcproj0000644000175000017500000000360512630366346023553 0ustar zmoelnigzmoelnig iem_utils-v0.0.20180206/iem_roomsim/src/early_reflections_2d.c0000644000175000017500000003454512630366346024260 0ustar zmoelnigzmoelnig/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_roomsim written by Thomas Musil (c) IEM KUG Graz Austria 2002 - 2006 */ #include "m_pd.h" #include "iemlib.h" #include /* -------------------------- early_reflections_2d ------------------------------ */ /* ** pos. x-Richtung Nase ** pos. y-Richtung Linke Hand ** pos. z-Richtung Scheitel ** Kartesischer Koordinaten-Ursprung liegt in der Mitte des Raums am Boden aenderungen: src-index von 1 .. n auf 0 .. (n-1) aenderungen: azimuth von rad auf degree */ /* Reihenfolge der bundle-sektoren: index phi: 1 0 2 45 3 90 4 135 5 180 6 225 7 270 8 315 1. und 2. reflexionen: +x 5 9 1 11 +y 6 2 0 4 8 12 3 10 7 */ typedef struct _early_reflections_2d { t_object x_obj; t_atom x_para_at[27]; void *x_direct_out; void *x_early_out; void *x_rev_out; t_symbol *x_s_del0; t_symbol *x_s_del1; t_symbol *x_s_del2; t_symbol *x_s_damp; t_symbol *x_s_index_phi; t_symbol *x_s_bundle; t_float x_azimuth_denominator; t_float x_azimuth_offset; t_float x_room_x; t_float x_room_y; t_float x_head_x; t_float x_head_y; int x_n_src; int x_bundle; t_float x_src_x[30]; t_float x_src_y[30]; t_float x_r_ambi; t_float x_speed; t_float x_180_over_pi; } t_early_reflections_2d; static t_class *early_reflections_2d_class; static t_float early_reflections_2d_calc_radius(t_floatarg r_ambi, t_floatarg dx, t_floatarg dy) { t_float r = (t_float)sqrt(dx*dx + dy*dy); if(r < r_ambi) return(r_ambi); else return(r); } static t_float early_reflections_2d_calc_azimuth(t_floatarg x_180_over_pi, t_floatarg dx, t_floatarg dy)/*changes*/ { if(dx == 0.0f) { if(dy < 0.0f) return(270.0f); else return(90.0f); } else if(dx < 0.0f) { return(180.0f + x_180_over_pi * (t_float)atan(dy / dx)); } else { if(dy < 0.0f) return(360.0f + x_180_over_pi * (t_float)atan(dy / dx)); else return(x_180_over_pi * (t_float)atan(dy / dx)); } } static t_float early_reflections_2d_calc_bundle_index(t_floatarg phi)/*changes*/ { phi += 22.5f; if(phi >= 360.0f) phi -= 360.0f; if(phi <= 180.0f) { if(phi <= 90.0f) { if(phi <= 45.0f)/* 0 .. 45 */ return(1.0f); else return(2.0f); } else { if(phi <= 135.0f) return(3.0f); else return(4.0f); } } else { if(phi <= 270.0f) { if(phi <= 225.0f) return(5.0f); else return(6.0f); } else { if(phi <= 315.0f)/* 270 .. 315 */ return(7.0f); else return(8.0f);/* 315 .. 360 */ } } } static void early_reflections_2d_doit(t_early_reflections_2d *x) { t_atom *at; t_float diff_x, diff_y; t_float sum_x, sum_y; t_float lx, wy; t_float x0, y0_; t_float xp1, yp1; t_float xn1, yn1; t_float xp2, yp2; t_float xn2, yn2; t_float m2ms = 1000.0f / x->x_speed; t_float x_180_over_pi=x->x_180_over_pi; t_float r_ambi = x->x_r_ambi; t_float phi[50]; t_float rad[50]; int n_src=x->x_n_src; int i; lx = x->x_room_x; wy = x->x_room_y; SETFLOAT(x->x_para_at, early_reflections_2d_calc_radius(r_ambi, lx, wy)*m2ms); outlet_anything(x->x_rev_out, x->x_s_del0, 1, x->x_para_at); for(i=0; ix_src_x[i] - x->x_head_x; diff_y = x->x_src_y[i] - x->x_head_y; sum_x = x->x_src_x[i] + x->x_head_x; sum_y = x->x_src_y[i] + x->x_head_y; x0 = diff_x; y0_ = diff_y; xp1 = lx - sum_x; yp1 = wy - sum_y; xn1 = -lx - sum_x; yn1 = -wy - sum_y; xp2 = 2.0f*lx + diff_x; yp2 = 2.0f*wy + diff_y; xn2 = -2.0f*lx + diff_x; yn2 = -2.0f*wy + diff_y; rad[0] = early_reflections_2d_calc_radius(r_ambi, x0, y0_); rad[1] = early_reflections_2d_calc_radius(r_ambi, xp1, y0_); rad[2] = early_reflections_2d_calc_radius(r_ambi, x0, yp1); rad[3] = early_reflections_2d_calc_radius(r_ambi, xn1, y0_); rad[4] = early_reflections_2d_calc_radius(r_ambi, x0, yn1); rad[5] = early_reflections_2d_calc_radius(r_ambi, xp2, y0_); rad[6] = early_reflections_2d_calc_radius(r_ambi, x0, yp2); rad[7] = early_reflections_2d_calc_radius(r_ambi, xn2, y0_); rad[8] = early_reflections_2d_calc_radius(r_ambi, x0, yn2); rad[9] = early_reflections_2d_calc_radius(r_ambi, xp1, yp1); rad[10] = early_reflections_2d_calc_radius(r_ambi, xn1, yn1); rad[11] = early_reflections_2d_calc_radius(r_ambi, xp1, yn1); rad[12] = early_reflections_2d_calc_radius(r_ambi, xn1, yp1); /* delay-reihenfolge: 0, +1x, +1y, -1x, -1y +2x, +2y, -2x, -2y +1x+1y, -1x-1y +1x-1y, -1x+1y */ at = x->x_para_at; SETFLOAT(at, (t_float)(i+1));/*changes*/ at++; SETFLOAT(at, rad[0] * m2ms); outlet_anything(x->x_direct_out, x->x_s_del0, 2, x->x_para_at); at = x->x_para_at+1; SETFLOAT(at, rad[1] *m2ms); at++; SETFLOAT(at, rad[2] *m2ms); at++; SETFLOAT(at, rad[3] *m2ms); at++; SETFLOAT(at, rad[4] *m2ms); outlet_anything(x->x_early_out, x->x_s_del1, 5, x->x_para_at); at = x->x_para_at+1; SETFLOAT(at, rad[5] *m2ms); at++; SETFLOAT(at, rad[6] *m2ms); at++; SETFLOAT(at, rad[7] *m2ms); at++; SETFLOAT(at, rad[8] *m2ms); at++; SETFLOAT(at, rad[9] *m2ms); at++; SETFLOAT(at, rad[10] *m2ms); at++; SETFLOAT(at, rad[11] *m2ms); at++; SETFLOAT(at, rad[12] *m2ms); outlet_anything(x->x_early_out, x->x_s_del2, 9, x->x_para_at); /* daempfungs-reihenfolge: 0, +1x, +1y, -1x, -1y +2x, +2y, -2x, -2y +1x+1y, -1x-1y +1x-1y, -1x+1y */ at = x->x_para_at+1; SETFLOAT(at, r_ambi / rad[0]); outlet_anything(x->x_direct_out, x->x_s_damp, 2, x->x_para_at); at = x->x_para_at+1; SETFLOAT(at, r_ambi / rad[1]); at++; SETFLOAT(at, r_ambi / rad[2]); at++; SETFLOAT(at, r_ambi / rad[3]); at++; SETFLOAT(at, r_ambi / rad[4]); at++; SETFLOAT(at, r_ambi / rad[5]); at++; SETFLOAT(at, r_ambi / rad[6]); at++; SETFLOAT(at, r_ambi / rad[7]); at++; SETFLOAT(at, r_ambi / rad[8]); at++; SETFLOAT(at, r_ambi / rad[9]); at++; SETFLOAT(at, r_ambi / rad[10]); at++; SETFLOAT(at, r_ambi / rad[11]); at++; SETFLOAT(at, r_ambi / rad[12]); outlet_anything(x->x_early_out, x->x_s_damp, 13, x->x_para_at); /* encoder-winkel-reihenfolge: index delta phi 0, +1x, +1y, -1x, -1y +2x, +2y, -2x, -2y +1x+1y, -1x-1y +1x-1y, -1x+1y */ at = x->x_para_at+1; SETFLOAT(at, early_reflections_2d_calc_azimuth(x_180_over_pi, x0, y0_)); outlet_anything(x->x_direct_out, x->x_s_index_phi, 2, x->x_para_at); /* encoder-winkel-reihenfolge: bundle 0, +1x, +1y, -1x, -1y +2x, +2y, -2x, -2y +1x+1y, -1x-1y +1x-1y, -1x+1y */ phi[0] = early_reflections_2d_calc_azimuth(x_180_over_pi, xp1, y0_); phi[1] = early_reflections_2d_calc_azimuth(x_180_over_pi, x0, yp1); phi[2] = early_reflections_2d_calc_azimuth(x_180_over_pi, xn1, y0_); phi[3] = early_reflections_2d_calc_azimuth(x_180_over_pi, x0, yn1); phi[4] = early_reflections_2d_calc_azimuth(x_180_over_pi, xp2, y0_); phi[5] = early_reflections_2d_calc_azimuth(x_180_over_pi, x0, yp2); phi[6] = early_reflections_2d_calc_azimuth(x_180_over_pi, xn2, y0_); phi[7] = early_reflections_2d_calc_azimuth(x_180_over_pi, x0, yn2); phi[8] = early_reflections_2d_calc_azimuth(x_180_over_pi, xp1, yp1); phi[9] = early_reflections_2d_calc_azimuth(x_180_over_pi, xn1, yn1); phi[10] = early_reflections_2d_calc_azimuth(x_180_over_pi, xp1, yn1); phi[11] = early_reflections_2d_calc_azimuth(x_180_over_pi, xn1, yp1); if(x->x_bundle) { at = x->x_para_at+1; SETFLOAT(at, early_reflections_2d_calc_bundle_index(phi[0])); at++; SETFLOAT(at, early_reflections_2d_calc_bundle_index(phi[1])); at++; SETFLOAT(at, early_reflections_2d_calc_bundle_index(phi[2])); at++; SETFLOAT(at, early_reflections_2d_calc_bundle_index(phi[3])); at++; SETFLOAT(at, early_reflections_2d_calc_bundle_index(phi[4])); at++; SETFLOAT(at, early_reflections_2d_calc_bundle_index(phi[5])); at++; SETFLOAT(at, early_reflections_2d_calc_bundle_index(phi[6])); at++; SETFLOAT(at, early_reflections_2d_calc_bundle_index(phi[7])); at++; SETFLOAT(at, early_reflections_2d_calc_bundle_index(phi[8])); at++; SETFLOAT(at, early_reflections_2d_calc_bundle_index(phi[9])); at++; SETFLOAT(at, early_reflections_2d_calc_bundle_index(phi[10])); at++; SETFLOAT(at, early_reflections_2d_calc_bundle_index(phi[11])); outlet_anything(x->x_early_out, x->x_s_bundle, 13, x->x_para_at); } at = x->x_para_at+1; SETFLOAT(at, 1.0f); at++; SETFLOAT(at, phi[0]); outlet_anything(x->x_early_out, x->x_s_index_phi, 3, x->x_para_at); at = x->x_para_at+1; SETFLOAT(at, 2.0f); at++; SETFLOAT(at, phi[1]); outlet_anything(x->x_early_out, x->x_s_index_phi, 3, x->x_para_at); at = x->x_para_at+1; SETFLOAT(at, 3.0f); at++; SETFLOAT(at, phi[2]); outlet_anything(x->x_early_out, x->x_s_index_phi, 3, x->x_para_at); at = x->x_para_at+1; SETFLOAT(at, 4.0f); at++; SETFLOAT(at, phi[3]); outlet_anything(x->x_early_out, x->x_s_index_phi, 3, x->x_para_at); at = x->x_para_at+1; SETFLOAT(at, 5.0f); at++; SETFLOAT(at, phi[4]); outlet_anything(x->x_early_out, x->x_s_index_phi, 3, x->x_para_at); at = x->x_para_at+1; SETFLOAT(at, 6.0f); at++; SETFLOAT(at, phi[5]); outlet_anything(x->x_early_out, x->x_s_index_phi, 3, x->x_para_at); at = x->x_para_at+1; SETFLOAT(at, 7.0f); at++; SETFLOAT(at, phi[6]); outlet_anything(x->x_early_out, x->x_s_index_phi, 3, x->x_para_at); at = x->x_para_at+1; SETFLOAT(at, 8.0f); at++; SETFLOAT(at, phi[7]); outlet_anything(x->x_early_out, x->x_s_index_phi, 3, x->x_para_at); at = x->x_para_at+1; SETFLOAT(at, 9.0f); at++; SETFLOAT(at, phi[8]); outlet_anything(x->x_early_out, x->x_s_index_phi, 3, x->x_para_at); at = x->x_para_at+1; SETFLOAT(at, 10.0f); at++; SETFLOAT(at, phi[9]); outlet_anything(x->x_early_out, x->x_s_index_phi, 3, x->x_para_at); at = x->x_para_at+1; SETFLOAT(at, 11.0f); at++; SETFLOAT(at, phi[10]); outlet_anything(x->x_early_out, x->x_s_index_phi, 3, x->x_para_at); at = x->x_para_at+1; SETFLOAT(at, 12.0f); at++; SETFLOAT(at, phi[11]); outlet_anything(x->x_early_out, x->x_s_index_phi, 3, x->x_para_at); } } static void early_reflections_2d_dump_para(t_early_reflections_2d *x) { int i, n=x->x_n_src; post("*******************************************************************************"); post("room-dimensions: L_x = %.3f, W_y = %.3f", x->x_room_x, x->x_room_y); post("hear-position: x_hear = %.3f, y_hear = %.3f", x->x_head_x, x->x_head_y); for(i=0; ix_src_x[i], i+1, x->x_src_y[i]); post("ambisonic-radius: %f", x->x_r_ambi); post("sonic-speed: %.3f", x->x_speed); post("order of outputs: direct early rev"); post("*******************************************************************************"); } static void early_reflections_2d_para(t_early_reflections_2d *x, t_symbol *s, int argc, t_atom *argv) { int i, n=x->x_n_src*2 + 5;/* r_ambi + 2*room + 2*head */ if(argc != n) { post("early_reflections_2d ERROR: para needs 1 r_ambi + 2*room + 2*head +n*2*src"); return; } x->x_r_ambi = atom_getfloat(argv++); x->x_room_x = atom_getfloat(argv++); x->x_room_y = atom_getfloat(argv++); x->x_head_x = atom_getfloat(argv++); x->x_head_y = atom_getfloat(argv++); n = x->x_n_src; for(i=0; ix_src_x[i] = atom_getfloat(argv++); x->x_src_y[i] = atom_getfloat(argv++); } early_reflections_2d_doit(x); } static void early_reflections_2d_sonic_speed(t_early_reflections_2d *x, t_floatarg speed) { if(speed < 300.0f) speed = 300.0f; if(speed > 400.0f) speed = 400.0f; x->x_speed = speed; } static void early_reflections_2d_bundle(t_early_reflections_2d *x, t_floatarg bundle) { if(bundle == 0.0f) x->x_bundle = 0; else x->x_bundle = 1; } static void early_reflections_2d_free(t_early_reflections_2d *x) { } static void *early_reflections_2d_new(t_floatarg fn_src) { int i, n; t_early_reflections_2d *x = (t_early_reflections_2d *)pd_new(early_reflections_2d_class); n = (int)fn_src; if(n < 1) n = 1; if(n > 30) n = 30; x->x_n_src = n; x->x_room_x = 12.0f; x->x_room_y = 8.0f; x->x_head_x = 0.0f; x->x_head_y = 0.0f; for(i=0; ix_src_x[i] = 3.0f; x->x_src_y[i] = 0.5f; } x->x_r_ambi = 1.4f; x->x_speed = 340.0f; x->x_s_del0 = gensym("del0"); x->x_s_del1 = gensym("del1"); x->x_s_del2 = gensym("del2"); x->x_s_damp = gensym("damp"); x->x_s_index_phi = gensym("index_phi"); x->x_s_bundle = gensym("bundle"); x->x_direct_out = outlet_new(&x->x_obj, &s_list); x->x_early_out = outlet_new(&x->x_obj, &s_list); x->x_rev_out = outlet_new(&x->x_obj, &s_list); x->x_180_over_pi = (t_float)(180.0 / (4.0 * atan(1.0))); x->x_bundle = 0; return (x); } void early_reflections_2d_setup(void) { early_reflections_2d_class = class_new(gensym("early_reflections_2d"), (t_newmethod)early_reflections_2d_new, (t_method)early_reflections_2d_free, sizeof(t_early_reflections_2d), 0, A_DEFFLOAT, 0); class_addmethod(early_reflections_2d_class, (t_method)early_reflections_2d_para, gensym("para"), A_GIMME, 0); class_addmethod(early_reflections_2d_class, (t_method)early_reflections_2d_sonic_speed, gensym("sonic_speed"), A_FLOAT, 0); class_addmethod(early_reflections_2d_class, (t_method)early_reflections_2d_bundle, gensym("bundle"), A_FLOAT, 0); class_addmethod(early_reflections_2d_class, (t_method)early_reflections_2d_dump_para, gensym("dump_para"), 0); // class_sethelpsymbol(early_reflections_2d_class, gensym("iemhelp2/early_reflections_2d-help")); } iem_utils-v0.0.20180206/iem_roomsim/src/makefile_d_fat0000644000175000017500000000146712630366346022650 0ustar zmoelnigzmoelnigcurrent: all .SUFFIXES: .d_fat PD_INSTALL_PATH ?= "/Applications/Pd.app/Contents/Resources" INCLUDE = -I. -I$(PD_INSTALL_PATH)/src CFLAGS =-DPD -O2 -Wall -W -Wshadow -Wstrict-prototypes \ -Wno-unused -Wno-parentheses -Wno-switch LFLAGS = -bundle -undefined suppress -flat_namespace # the sources SRC = early_reflections_3d.c \ early_reflections_2d.c \ cart2del_damp_2d.c \ cart2del_damp_3d.c \ iem_roomsim.c TARGET = iem_roomsim.d_fat OBJ = $(SRC:.c=.o) # # ------------------ targets ------------------------------------ # clean: rm ../$(TARGET) rm *.o all: $(OBJ) @echo :: $(OBJ) $(CC) -arch i386 -arch ppc $(LFLAGS) -o $(TARGET) *.o strip -S -x $(TARGET) mv $(TARGET) .. $(OBJ) : %.o : %.c $(CC) -arch i386 -arch ppc $(CFLAGS) $(INCLUDE) -c -o $*.o $*.c iem_utils-v0.0.20180206/iem_roomsim/src/VC9/0000755000175000017500000000000012630366346020404 5ustar zmoelnigzmoelnigiem_utils-v0.0.20180206/iem_roomsim/src/VC9/makefile_vc9proj0000644000175000017500000000176112630366346023565 0ustar zmoelnigzmoelnigTARGET = iem_roomsim all: ..\$(TARGET).dll VIS_CPP_PATH = "C:\Program Files\Microsoft Visual Studio 9.0\VC" VIS_SDK_PATH = "C:\Program Files\Microsoft SDKs\Windows\v6.0A" PD_INST_PATH = "C:\Program Files\pd-0.43.0" PD_WIN_INCLUDE_PATH = /I. /I$(PD_INST_PATH)\src /I$(VIS_CPP_PATH)\include PD_WIN_C_FLAGS = /nologo /W3 /WX /DMSW /DNT /DPD /DWIN32 /DWINDOWS /Ox -D_CRT_SECURE_NO_WARNINGS PD_WIN_L_FLAGS = /nologo PD_WIN_LIB = /NODEFAULTLIB:libcmt /NODEFAULTLIB:oldnames /NODEFAULTLIB:kernel32 \ $(VIS_CPP_PATH)\lib\libcmt.lib \ $(VIS_CPP_PATH)\lib\oldnames.lib \ $(VIS_SDK_PATH)\lib\kernel32.lib \ $(PD_INST_PATH)\bin\pd.lib SRC = early_reflections_3d.c \ early_reflections_2d.c \ cart2del_damp_2d.c \ cart2del_damp_3d.c \ iem_roomsim.c OBJ = $(SRC:.c=.obj) .c.obj: cl $(PD_WIN_C_FLAGS) $(PD_WIN_INCLUDE_PATH) /c $*.c ..\$(TARGET).dll: $(OBJ) link $(PD_WIN_L_FLAGS) /dll /export:$(TARGET)_setup \ /out:..\$(TARGET).dll $(OBJ) $(PD_WIN_LIB) clean: del *.obj iem_utils-v0.0.20180206/iem_roomsim/src/VC9/iem_roomsim.vcproj0000644000175000017500000000360512630366346024154 0ustar zmoelnigzmoelnig iem_utils-v0.0.20180206/iem_roomsim/src/VC9/iem_roomsim.sln0000644000175000017500000000156712630366346023452 0ustar zmoelnigzmoelnig Microsoft Visual Studio Solution File, Format Version 10.00 # Visual Studio 2008 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "iem_roomsim", "iem_roomsim.vcproj", "{6A44952F-0D55-44EE-9032-928368583BEC}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Win32 = Debug|Win32 Release|Win32 = Release|Win32 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {6A44952F-0D55-44EE-9032-928368583BEC}.Debug|Win32.ActiveCfg = Debug|Win32 {6A44952F-0D55-44EE-9032-928368583BEC}.Debug|Win32.Build.0 = Debug|Win32 {6A44952F-0D55-44EE-9032-928368583BEC}.Release|Win32.ActiveCfg = Release|Win32 {6A44952F-0D55-44EE-9032-928368583BEC}.Release|Win32.Build.0 = Release|Win32 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection EndGlobal iem_utils-v0.0.20180206/iem_roomsim/src/makefile_darwin0000644000175000017500000000165112630366346023052 0ustar zmoelnigzmoelnigcurrent: all .SUFFIXES: .pd_darwin PD_INSTALL_PATH = "/Applications/Pd.app/Contents/Resources" INCLUDE = -I. -I$(PD_INSTALL_PATH)/src LIB = -ldl -lm -lpthread CFLAGS = -DPD -DUNIX -g -Wall -W -Werror -Wno-unused \ -Wno-parentheses -Wno-switch -O2 -fno-strict-aliasing \ $(INCLUDE) $(UCFLAGS) $(AFLAGS) \ MACOSXLINKFLAGS = -bundle -bundle_loader $(PD_INSTALL_PATH)/bin/pd SYSTEM = $(shell uname -m) # the sources SRC = early_reflections_3d.c \ early_reflections_2d.c \ cart2del_damp_2d.c \ cart2del_damp_3d.c \ iem_roomsim.c TARGET = iem_roomsim.pd_darwin OBJ = $(SRC:.c=.o) # # ------------------ targets ------------------------------------ # clean: rm ../$(TARGET) rm *.o all: $(OBJ) @echo :: $(OBJ) $(CC) $(MACOSXLINKFLAGS) -o $(TARGET) *.o $(LIB) strip -S -x $(TARGET) mv $(TARGET) .. $(OBJ) : %.o : %.c touch $*.c $(CC) $(CFLAGS) -DPD $(INCLUDE) -c -o $*.o $*.c iem_utils-v0.0.20180206/iem_roomsim/src/iem_roomsim.dsw0000644000175000017500000000107512630366346023044 0ustar zmoelnigzmoelnigMicrosoft Developer Studio Workspace File, Format Version 6.00 # WARNUNG: DIESE ARBEITSBEREICHSDATEI DARF NICHT BEARBEITET ODER GELÖSCHT WERDEN! ############################################################################### Project: "iem_roomsim"=.\iem_roomsim.dsp - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ }}} ############################################################################### Global: Package=<5> {{{ }}} Package=<3> {{{ }}} ############################################################################### iem_utils-v0.0.20180206/iem_roomsim/src/iem_roomsim.c0000644000175000017500000000162012630366346022465 0ustar zmoelnigzmoelnig/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_roomsim written by Thomas Musil (c) IEM KUG Graz Austria 2002 - 2006 */ #include "m_pd.h" #include "iemlib.h" static t_class *iem_roomsim_class; static void *iem_roomsim_new(void) { t_object *x = (t_object *)pd_new(iem_roomsim_class); return (x); } void early_reflections_3d_setup(void); void early_reflections_2d_setup(void); void cart2del_damp_2d_setup(void); void cart2del_damp_3d_setup(void); /* ------------------------ setup routine ------------------------- */ void iem_roomsim_setup(void) { early_reflections_3d_setup(); early_reflections_2d_setup(); cart2del_damp_2d_setup(); cart2del_damp_3d_setup(); post("iem_roomsim (R-1.17) library loaded! (c) Thomas Musil 11.2006"); post(" musil%ciem.at iem KUG Graz Austria", '@'); } iem_utils-v0.0.20180206/iem_roomsim/src/cart2del_damp_2d.c0000644000175000017500000002541212630366346023241 0ustar zmoelnigzmoelnig/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_roomsim written by Thomas Musil (c) IEM KUG Graz Austria 2002 - 2006 */ #include "m_pd.h" #include "iemlib.h" #include /* -------------------------- cart2del_damp_2d ------------------------------ */ /* ** pos. x-Richtung Nase ** pos. y-Richtung Linke Hand ** pos. z-Richtung Scheitel ** Kartesischer Koordinaten-Ursprung liegt in der Mitte des Raums am Boden aenderungen: src-index von 1 .. n auf 0 .. (n-1) aenderungen: azimuth von rad auf degree */ /* Reihenfolge der bundle-sektoren: index phi: 1 0 2 45 3 90 4 135 5 180 6 225 7 270 8 315 1. und 2. reflexionen: +x 5 9 1 11 +y 6 2 0 4 8 12 3 10 7 */ typedef struct _cart2del_damp_2d { t_object x_obj; t_symbol *x_s_direct; t_symbol *x_s_early1; t_symbol *x_s_early2; t_symbol *x_s_del; t_symbol *x_s_damp; t_symbol *x_s_index_phi; t_float x_room_x; t_float x_room_y; t_float x_head_x; t_float x_head_y; t_float x_src_x; t_float x_src_y; t_float x_r_ambi; t_float x_speed; t_float x_180_over_pi; void *x_clock; } t_cart2del_damp_2d; static t_class *cart2del_damp_2d_class; static t_float cart2del_damp_2d_calc_radius(t_floatarg r_ambi, t_floatarg dx, t_floatarg dy) { t_float r = (t_float)sqrt(dx*dx + dy*dy); if(r < r_ambi) return(r_ambi); else return(r); } static t_float cart2del_damp_2d_calc_azimuth(t_floatarg x_180_over_pi, t_floatarg dx, t_floatarg dy)/*changes*/ { if(dx == 0.0f) { if(dy < 0.0f) return(270.0f); else return(90.0f); } else if(dx < 0.0f) { return(180.0f + x_180_over_pi * (t_float)atan(dy / dx)); } else { if(dy < 0.0f) return(360.0f + x_180_over_pi * (t_float)atan(dy / dx)); else return(x_180_over_pi * (t_float)atan(dy / dx)); } } static void cart2del_damp_2d_doit(t_cart2del_damp_2d *x) { t_float diff_x, diff_y; t_float sum_x, sum_y; t_float lx, wy; t_float x0, y0_; t_float xp1, yp1; t_float xn1, yn1; t_float xp2, yp2; t_float xn2, yn2; t_float m2ms = 1000.0f / x->x_speed; t_float x_180_over_pi=x->x_180_over_pi; t_float r_ambi = x->x_r_ambi; t_float rad[20]; t_atom at[20]; lx = x->x_room_x; wy = x->x_room_y; diff_x = x->x_src_x - x->x_head_x; diff_y = x->x_src_y - x->x_head_y; sum_x = x->x_src_x + x->x_head_x; sum_y = x->x_src_y + x->x_head_y; x0 = diff_x; y0_ = diff_y; xp1 = lx - sum_x; yp1 = wy - sum_y; xn1 = -lx - sum_x; yn1 = -wy - sum_y; xp2 = 2.0f*lx + diff_x; yp2 = 2.0f*wy + diff_y; xn2 = -2.0f*lx + diff_x; yn2 = -2.0f*wy + diff_y; rad[0] = cart2del_damp_2d_calc_radius(r_ambi, x0, y0_); rad[1] = cart2del_damp_2d_calc_radius(r_ambi, xp1, y0_); rad[2] = cart2del_damp_2d_calc_radius(r_ambi, x0, yp1); rad[3] = cart2del_damp_2d_calc_radius(r_ambi, xn1, y0_); rad[4] = cart2del_damp_2d_calc_radius(r_ambi, x0, yn1); rad[5] = cart2del_damp_2d_calc_radius(r_ambi, xp2, y0_); rad[6] = cart2del_damp_2d_calc_radius(r_ambi, x0, yp2); rad[7] = cart2del_damp_2d_calc_radius(r_ambi, xn2, y0_); rad[8] = cart2del_damp_2d_calc_radius(r_ambi, x0, yn2); rad[9] = cart2del_damp_2d_calc_radius(r_ambi, xp1, yp1); rad[10] = cart2del_damp_2d_calc_radius(r_ambi, xn1, yn1); rad[11] = cart2del_damp_2d_calc_radius(r_ambi, xp1, yn1); rad[12] = cart2del_damp_2d_calc_radius(r_ambi, xn1, yp1); /* delay-reihenfolge: 0, +1x, +1y, -1x, -1y +2x, +2y, -2x, -2y +1x+1y, -1x-1y +1x-1y, -1x+1y */ SETSYMBOL(at, x->x_s_del); SETFLOAT(at+1, rad[0] * m2ms); outlet_anything(x->x_obj.ob_outlet, x->x_s_direct, 2, at); SETFLOAT(at+1, rad[1] *m2ms); SETFLOAT(at+2, rad[2] *m2ms); SETFLOAT(at+3, rad[3] *m2ms); SETFLOAT(at+4, rad[4] *m2ms); outlet_anything(x->x_obj.ob_outlet, x->x_s_early1, 5, at); SETFLOAT(at+1, rad[5] *m2ms); SETFLOAT(at+2, rad[6] *m2ms); SETFLOAT(at+3, rad[7] *m2ms); SETFLOAT(at+4, rad[8] *m2ms); SETFLOAT(at+5, rad[9] *m2ms); SETFLOAT(at+6, rad[10] *m2ms); SETFLOAT(at+7, rad[11] *m2ms); SETFLOAT(at+8, rad[12] *m2ms); outlet_anything(x->x_obj.ob_outlet, x->x_s_early2, 9, at); /* daempfungs-reihenfolge: 0, +1x, +1y, -1x, -1y +2x, +2y, -2x, -2y +1x+1y, -1x-1y +1x-1y, -1x+1y */ SETSYMBOL(at, x->x_s_damp); SETFLOAT(at+1, r_ambi / rad[0]); outlet_anything(x->x_obj.ob_outlet, x->x_s_direct, 2, at); SETFLOAT(at+1, r_ambi / rad[1]); SETFLOAT(at+2, r_ambi / rad[2]); SETFLOAT(at+3, r_ambi / rad[3]); SETFLOAT(at+4, r_ambi / rad[4]); outlet_anything(x->x_obj.ob_outlet, x->x_s_early1, 5, at); SETFLOAT(at+1, r_ambi / rad[5]); SETFLOAT(at+2, r_ambi / rad[6]); SETFLOAT(at+3, r_ambi / rad[7]); SETFLOAT(at+4, r_ambi / rad[8]); SETFLOAT(at+5, r_ambi / rad[9]); SETFLOAT(at+6, r_ambi / rad[10]); SETFLOAT(at+7, r_ambi / rad[11]); SETFLOAT(at+8, r_ambi / rad[12]); outlet_anything(x->x_obj.ob_outlet, x->x_s_early2, 9, at); /* encoder-winkel-reihenfolge: index delta phi 0, +1x, +1y, -1x, -1y +2x, +2y, -2x, -2y +1x+1y, -1x-1y +1x-1y, -1x+1y */ SETSYMBOL(at, x->x_s_index_phi); SETFLOAT(at+1, 1.0f); SETFLOAT(at+2, cart2del_damp_2d_calc_azimuth(x_180_over_pi, x0, y0_)); outlet_anything(x->x_obj.ob_outlet, x->x_s_direct, 3, at); SETFLOAT(at+1, 1.0f); SETFLOAT(at+2, cart2del_damp_2d_calc_azimuth(x_180_over_pi, xp1, y0_)); outlet_anything(x->x_obj.ob_outlet, x->x_s_early1, 3, at); SETFLOAT(at+1, 2.0f); SETFLOAT(at+2, cart2del_damp_2d_calc_azimuth(x_180_over_pi, x0, yp1)); outlet_anything(x->x_obj.ob_outlet, x->x_s_early1, 3, at); SETFLOAT(at+1, 3.0f); SETFLOAT(at+2, cart2del_damp_2d_calc_azimuth(x_180_over_pi, xn1, y0_)); outlet_anything(x->x_obj.ob_outlet, x->x_s_early1, 3, at); SETFLOAT(at+1, 4.0f); SETFLOAT(at+2, cart2del_damp_2d_calc_azimuth(x_180_over_pi, x0, yn1)); outlet_anything(x->x_obj.ob_outlet, x->x_s_early1, 3, at); SETFLOAT(at+1, 1.0f); SETFLOAT(at+2, cart2del_damp_2d_calc_azimuth(x_180_over_pi, xp2, y0_)); outlet_anything(x->x_obj.ob_outlet, x->x_s_early2, 3, at); SETFLOAT(at+1, 2.0f); SETFLOAT(at+2, cart2del_damp_2d_calc_azimuth(x_180_over_pi, x0, yp2)); outlet_anything(x->x_obj.ob_outlet, x->x_s_early2, 3, at); SETFLOAT(at+1, 3.0f); SETFLOAT(at+2, cart2del_damp_2d_calc_azimuth(x_180_over_pi, xn2, y0_)); outlet_anything(x->x_obj.ob_outlet, x->x_s_early2, 3, at); SETFLOAT(at+1, 4.0f); SETFLOAT(at+2, cart2del_damp_2d_calc_azimuth(x_180_over_pi, x0, yn2)); outlet_anything(x->x_obj.ob_outlet, x->x_s_early2, 3, at); SETFLOAT(at+1, 5.0f); SETFLOAT(at+2, cart2del_damp_2d_calc_azimuth(x_180_over_pi, xp1, yp1)); outlet_anything(x->x_obj.ob_outlet, x->x_s_early2, 3, at); SETFLOAT(at+1, 6.0f); SETFLOAT(at+2, cart2del_damp_2d_calc_azimuth(x_180_over_pi, xn1, yn1)); outlet_anything(x->x_obj.ob_outlet, x->x_s_early2, 3, at); SETFLOAT(at+1, 7.0f); SETFLOAT(at+2, cart2del_damp_2d_calc_azimuth(x_180_over_pi, xp1, yn1)); outlet_anything(x->x_obj.ob_outlet, x->x_s_early2, 3, at); SETFLOAT(at+1, 8.0f); SETFLOAT(at+2, cart2del_damp_2d_calc_azimuth(x_180_over_pi, xn1, yp1)); outlet_anything(x->x_obj.ob_outlet, x->x_s_early2, 3, at); } static void cart2del_damp_2d_src_xy(t_cart2del_damp_2d *x, t_symbol *s, int argc, t_atom *argv) { if((argc >= 2)&&IS_A_FLOAT(argv, 0)&&IS_A_FLOAT(argv, 1)) { t_float xr2=0.5f*x->x_room_x, yr2=0.5f*x->x_room_y; x->x_src_x = atom_getfloat(argv++); x->x_src_y = atom_getfloat(argv); if(x->x_src_x > xr2) x->x_src_x = xr2; if(x->x_src_x < -xr2) x->x_src_x = -xr2; if(x->x_src_y > yr2) x->x_src_y = yr2; if(x->x_src_y < -yr2) x->x_src_y = -yr2; clock_delay(x->x_clock, 0.0f); } } static void cart2del_damp_2d_head_xy(t_cart2del_damp_2d *x, t_symbol *s, int argc, t_atom *argv) { if((argc >= 2)&&IS_A_FLOAT(argv, 0)&&IS_A_FLOAT(argv, 1)) { t_float xr2=0.5f*x->x_room_x, yr2=0.5f*x->x_room_y; x->x_head_x = atom_getfloat(argv++); x->x_head_y = atom_getfloat(argv); if(x->x_head_x > xr2) x->x_head_x = xr2; if(x->x_head_x < -xr2) x->x_head_x = -xr2; if(x->x_head_y > yr2) x->x_head_y = yr2; if(x->x_head_y < -yr2) x->x_head_y = -yr2; clock_delay(x->x_clock, 0.0f); } } static void cart2del_damp_2d_room_dim(t_cart2del_damp_2d *x, t_symbol *s, int argc, t_atom *argv) { if((argc >= 2)&&IS_A_FLOAT(argv, 0)&&IS_A_FLOAT(argv, 1)) { x->x_room_x = atom_getfloat(argv++); x->x_room_y = atom_getfloat(argv); if(x->x_room_x < 0.5f) x->x_room_x = 0.5f; if(x->x_room_y < 0.5f) x->x_room_y = 0.5f; clock_delay(x->x_clock, 0.0f); } } static void cart2del_damp_2d_r_ambi(t_cart2del_damp_2d *x, t_floatarg r_ambi) { if(r_ambi < 0.1f) r_ambi = 0.1f; x->x_r_ambi = r_ambi; clock_delay(x->x_clock, 0.0f); } static void cart2del_damp_2d_sonic_speed(t_cart2del_damp_2d *x, t_floatarg speed) { if(speed < 10.0f) speed = 10.0f; if(speed > 2000.0f) speed = 2000.0f; x->x_speed = speed; clock_delay(x->x_clock, 0.0f); } static void cart2del_damp_2d_free(t_cart2del_damp_2d *x) { clock_free(x->x_clock); } static void *cart2del_damp_2d_new(t_symbol *s, int argc, t_atom *argv) { t_cart2del_damp_2d *x = (t_cart2del_damp_2d *)pd_new(cart2del_damp_2d_class); x->x_room_x = 12.0f; x->x_room_y = 8.0f; x->x_head_x = 0.0f; x->x_head_y = 0.0f; x->x_src_x = 3.0f; x->x_src_y = 0.5f; x->x_r_ambi = 1.4f; x->x_speed = 340.0f; x->x_s_direct = gensym("direct"); x->x_s_early1 = gensym("early1"); x->x_s_early2 = gensym("early2"); x->x_s_damp = gensym("damp"); x->x_s_del = gensym("del"); x->x_s_index_phi = gensym("index_phi"); outlet_new(&x->x_obj, &s_list); x->x_clock = clock_new(x, (t_method)cart2del_damp_2d_doit); x->x_180_over_pi = (t_float)(180.0 / (4.0 * atan(1.0))); return (x); } void cart2del_damp_2d_setup(void) { cart2del_damp_2d_class = class_new(gensym("cart2del_damp_2d"), (t_newmethod)cart2del_damp_2d_new, (t_method)cart2del_damp_2d_free, sizeof(t_cart2del_damp_2d), 0, A_GIMME, 0); class_addmethod(cart2del_damp_2d_class, (t_method)cart2del_damp_2d_src_xy, gensym("src_xy"), A_GIMME, 0); class_addmethod(cart2del_damp_2d_class, (t_method)cart2del_damp_2d_head_xy, gensym("head_xy"), A_GIMME, 0); class_addmethod(cart2del_damp_2d_class, (t_method)cart2del_damp_2d_room_dim, gensym("room_dim"), A_GIMME, 0); class_addmethod(cart2del_damp_2d_class, (t_method)cart2del_damp_2d_sonic_speed, gensym("sonic_speed"), A_FLOAT, 0); class_addmethod(cart2del_damp_2d_class, (t_method)cart2del_damp_2d_r_ambi, gensym("r_ambi"), A_FLOAT, 0); // class_sethelpsymbol(cart2del_damp_2d_class, gensym("iemhelp2/cart2del_damp_2d-help")); } iem_utils-v0.0.20180206/iem_roomsim/src/makefile_win0000644000175000017500000000202012630366346022352 0ustar zmoelnigzmoelnig all: ..\iem_roomsim.dll VIS_CPP_PATH = "C:\Programme\Microsoft Visual Studio\Vc98" PD_INST_PATH = "C:\Programme\pd" PD_WIN_INCLUDE_PATH = /I. /I$(PD_INST_PATH)\src /I$(VIS_CPP_PATH)\include PD_WIN_C_FLAGS = /nologo /W3 /WX /DMSW /DNT /DPD /DWIN32 /DWINDOWS /Ox -DPA_LITTLE_ENDIAN PD_WIN_L_FLAGS = /nologo PD_WIN_LIB = /NODEFAULTLIB:libc /NODEFAULTLIB:oldnames /NODEFAULTLIB:kernel /NODEFAULTLIB:uuid \ $(VIS_CPP_PATH)\lib\libc.lib \ $(VIS_CPP_PATH)\lib\oldnames.lib \ $(VIS_CPP_PATH)\lib\kernel32.lib \ $(VIS_CPP_PATH)\lib\wsock32.lib \ $(VIS_CPP_PATH)\lib\winmm.lib \ $(PD_INST_PATH)\bin\pthreadVC.lib \ $(PD_INST_PATH)\bin\pd.lib SRC = early_reflections_3d.c \ early_reflections_2d.c \ cart2del_damp_2d.c \ cart2del_damp_3d.c \ iem_roomsim.c OBJ = $(SRC:.c=.obj) .c.obj: cl $(PD_WIN_C_FLAGS) $(PD_WIN_INCLUDE_PATH) /c $*.c ..\iem_roomsim.dll: $(OBJ) link $(PD_WIN_L_FLAGS) /dll /export:iem_roomsim_setup \ /out:..\iem_roomsim.dll $(OBJ) $(PD_WIN_LIB) clean: del *.obj iem_utils-v0.0.20180206/iem_roomsim/src/cart2del_damp_3d.c0000644000175000017500000004465712630366346023256 0ustar zmoelnigzmoelnig/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_roomsim written by Thomas Musil (c) IEM KUG Graz Austria 2002 - 2006 */ #include "m_pd.h" #include "iemlib.h" #include /* -------------------------- cart2del_damp_3d ------------------------------ */ /* ** pos. x-Richtung Nase ** pos. y-Richtung Linke Hand ** pos. z-Richtung Scheitel ** Kartesischer Koordinaten-Ursprung liegt in der Mitte des Raums am Boden */ /* Reihenfolge der bundle-sektoren: index delta phi: 1 90 0 2 45 45 3 45 135 4 45 225 5 45 315 6 0 0 7 0 45 8 0 90 9 0 135 10 0 180 11 0 225 12 0 270 13 0 315 14 -45 45 15 -45 135 16 -45 225 17 -45 315 top +x +y 9 +x 15 +y 23 3 14 24 +x 8 22 2 13 +y 10 4 0 1 7 16 5 19 11 +x 21 +y 17 6 20 18 +x +y 12 */ typedef struct _cart2del_damp_3d { t_object x_obj; t_symbol *x_s_direct; t_symbol *x_s_early1; t_symbol *x_s_early2; t_symbol *x_s_del; t_symbol *x_s_damp; t_symbol *x_s_index_theta_phi; t_float x_room_x; t_float x_room_y; t_float x_room_z; t_float x_head_x; t_float x_head_y; t_float x_head_z; t_float x_src_x; t_float x_src_y; t_float x_src_z; t_float x_r_ambi; t_float x_speed; t_float x_180_over_pi; void *x_clock; } t_cart2del_damp_3d; static t_class *cart2del_damp_3d_class; static t_float cart2del_damp_3d_calc_radius(t_floatarg r_ambi, t_floatarg dx, t_floatarg dy, t_floatarg dz) { t_float r = (t_float)sqrt(dx*dx + dy*dy + dz*dz); if(r < r_ambi) return(r_ambi); else return(r); } static t_float cart2del_damp_3d_calc_azimuth(t_floatarg x_180_over_pi, t_floatarg dx, t_floatarg dy, t_floatarg dz) { if(dx == 0.0f) { if(dy < 0.0f) return(270.0f); else return(90.0f); } else if(dx < 0.0f) { return(180.0f + x_180_over_pi * (t_float)atan(dy / dx)); } else { if(dy < 0.0f) return(360.0f + x_180_over_pi * (t_float)atan(dy / dx)); else return(x_180_over_pi * (t_float)atan(dy / dx)); } } static t_float cart2del_damp_3d_calc_elevation(t_floatarg x_180_over_pi, t_floatarg dx, t_floatarg dy, t_floatarg dz) { t_float dxy = sqrt(dx*dx + dy*dy); if(dxy == 0.0f) { if(dz < 0.0f) return(-90.0f); else return(90.0f); } else { return(x_180_over_pi * (t_float)atan(dz / dxy)); } } static void cart2del_damp_3d_doit(t_cart2del_damp_3d *x) { t_float diff_x, diff_y, diff_z; t_float sum_x, sum_y, sum_z; t_float lx, wy, hz; t_float x0, y0_, z0; t_float xp1, yp1, zp1; t_float xn1, yn1, zn1; t_float xp2, yp2, zp2; t_float xn2, yn2, zn2; t_float m2ms = 1000.0f / x->x_speed; t_float x_180_over_pi=x->x_180_over_pi; t_float r_ambi = x->x_r_ambi; t_float rad[30]; t_atom at[30]; lx = x->x_room_x; wy = x->x_room_y; hz = x->x_room_z; diff_x = x->x_src_x - x->x_head_x; diff_y = x->x_src_y - x->x_head_y; diff_z = x->x_src_z - x->x_head_z; sum_x = x->x_src_x + x->x_head_x; sum_y = x->x_src_y + x->x_head_y; sum_z = x->x_src_z + x->x_head_z - hz; x0 = diff_x; y0_ = diff_y; z0 = diff_z; xp1 = lx - sum_x; yp1 = wy - sum_y; zp1 = hz - sum_z; xn1 = -lx - sum_x; yn1 = -wy - sum_y; zn1 = -hz - sum_z; xp2 = 2.0f*lx + diff_x; yp2 = 2.0f*wy + diff_y; zp2 = 2.0f*hz + diff_z; xn2 = -2.0f*lx + diff_x; yn2 = -2.0f*wy + diff_y; zn2 = -2.0f*hz + diff_z; rad[0] = cart2del_damp_3d_calc_radius(r_ambi, x0, y0_, z0); rad[1] = cart2del_damp_3d_calc_radius(r_ambi, xp1, y0_, z0); rad[2] = cart2del_damp_3d_calc_radius(r_ambi, x0, yp1, z0); rad[3] = cart2del_damp_3d_calc_radius(r_ambi, x0, y0_, zp1); rad[4] = cart2del_damp_3d_calc_radius(r_ambi, xn1, y0_, z0); rad[5] = cart2del_damp_3d_calc_radius(r_ambi, x0, yn1, z0); rad[6] = cart2del_damp_3d_calc_radius(r_ambi, x0, y0_, zn1); rad[7] = cart2del_damp_3d_calc_radius(r_ambi, xp2, y0_, z0); rad[8] = cart2del_damp_3d_calc_radius(r_ambi, x0, yp2, z0); rad[9] = cart2del_damp_3d_calc_radius(r_ambi, x0, y0_, zp2); rad[10] = cart2del_damp_3d_calc_radius(r_ambi, xn2, y0_, z0); rad[11] = cart2del_damp_3d_calc_radius(r_ambi, x0, yn2, z0); rad[12] = cart2del_damp_3d_calc_radius(r_ambi, x0, y0_, zn2); rad[13] = cart2del_damp_3d_calc_radius(r_ambi, xp1, yp1, z0); rad[14] = cart2del_damp_3d_calc_radius(r_ambi, xp1, y0_, zp1); rad[15] = cart2del_damp_3d_calc_radius(r_ambi, x0, yp1, zp1); rad[16] = cart2del_damp_3d_calc_radius(r_ambi, xn1, yn1, z0); rad[17] = cart2del_damp_3d_calc_radius(r_ambi, xn1, y0_, zn1); rad[18] = cart2del_damp_3d_calc_radius(r_ambi, x0, yn1, zn1); rad[19] = cart2del_damp_3d_calc_radius(r_ambi, xp1, yn1, z0); rad[20] = cart2del_damp_3d_calc_radius(r_ambi, xp1, y0_, zn1); rad[21] = cart2del_damp_3d_calc_radius(r_ambi, x0, yp1, zn1); rad[22] = cart2del_damp_3d_calc_radius(r_ambi, xn1, yp1, z0); rad[23] = cart2del_damp_3d_calc_radius(r_ambi, xn1, y0_, zp1); rad[24] = cart2del_damp_3d_calc_radius(r_ambi, x0, yn1, zp1); /* delay-reihenfolge: 0 auslassen, +1x, +1y, +1z, -1x, -1y, -1z +2x, +2y, +2z, -2x, -2y, -2z +1x+1y, +1x+1z, +1y+1z -1x-1y, -1x-1z, -1y-1z +1x-1y, +1x-1z, +1y-1z -1x+1y, -1x+1z, -1y+1z */ SETSYMBOL(at, x->x_s_del); SETFLOAT(at+1, rad[0] * m2ms); outlet_anything(x->x_obj.ob_outlet, x->x_s_direct, 2, at); SETFLOAT(at+1, rad[1] *m2ms); SETFLOAT(at+2, rad[2] *m2ms); SETFLOAT(at+3, rad[3] *m2ms); SETFLOAT(at+4, rad[4] *m2ms); SETFLOAT(at+5, rad[5] *m2ms); SETFLOAT(at+6, rad[6] *m2ms); outlet_anything(x->x_obj.ob_outlet, x->x_s_early1, 7, at); SETFLOAT(at+1, rad[7] *m2ms); SETFLOAT(at+2, rad[8] *m2ms); SETFLOAT(at+3, rad[9] *m2ms); SETFLOAT(at+4, rad[10] *m2ms); SETFLOAT(at+5, rad[11] *m2ms); SETFLOAT(at+6, rad[12] *m2ms); SETFLOAT(at+7, rad[13] *m2ms); SETFLOAT(at+8, rad[14] *m2ms); SETFLOAT(at+9, rad[15] *m2ms); SETFLOAT(at+10, rad[16] *m2ms); SETFLOAT(at+11, rad[17] *m2ms); SETFLOAT(at+12, rad[18] *m2ms); SETFLOAT(at+13, rad[19] *m2ms); SETFLOAT(at+14, rad[20] *m2ms); SETFLOAT(at+15, rad[21] *m2ms); SETFLOAT(at+16, rad[22] *m2ms); SETFLOAT(at+17, rad[23] *m2ms); SETFLOAT(at+18, rad[24] *m2ms); outlet_anything(x->x_obj.ob_outlet, x->x_s_early2, 19, at); /* daempfungs-reihenfolge: 0, +1x, +1y, +1z, -1x, -1y, -1z +2x, +2y, +2z, -2x, -2y, -2z +1x+1y, +1x+1z, +1y+1z -1x-1y, -1x-1z, -1y-1z +1x-1y, +1x-1z, +1y-1z -1x+1y, -1x+1z, -1y+1z */ SETSYMBOL(at, x->x_s_damp); SETFLOAT(at+1, r_ambi / rad[0]); outlet_anything(x->x_obj.ob_outlet, x->x_s_direct, 2, at); SETFLOAT(at+1, r_ambi / rad[1]); SETFLOAT(at+2, r_ambi / rad[2]); SETFLOAT(at+3, r_ambi / rad[3]); SETFLOAT(at+4, r_ambi / rad[4]); SETFLOAT(at+5, r_ambi / rad[5]); SETFLOAT(at+6, r_ambi / rad[6]); outlet_anything(x->x_obj.ob_outlet, x->x_s_early1, 7, at); SETFLOAT(at+1, r_ambi / rad[7]); SETFLOAT(at+2, r_ambi / rad[8]); SETFLOAT(at+3, r_ambi / rad[9]); SETFLOAT(at+4, r_ambi / rad[10]); SETFLOAT(at+5, r_ambi / rad[11]); SETFLOAT(at+6, r_ambi / rad[12]); SETFLOAT(at+7, r_ambi / rad[13]); SETFLOAT(at+8, r_ambi / rad[14]); SETFLOAT(at+9, r_ambi / rad[15]); SETFLOAT(at+10, r_ambi / rad[16]); SETFLOAT(at+11, r_ambi / rad[17]); SETFLOAT(at+12, r_ambi / rad[18]); SETFLOAT(at+13, r_ambi / rad[19]); SETFLOAT(at+14, r_ambi / rad[20]); SETFLOAT(at+15, r_ambi / rad[21]); SETFLOAT(at+16, r_ambi / rad[22]); SETFLOAT(at+17, r_ambi / rad[23]); SETFLOAT(at+18, r_ambi / rad[24]); outlet_anything(x->x_obj.ob_outlet, x->x_s_early2, 19, at); /* encoder-winkel-reihenfolge: index delta phi 0, +1x, +1y, +1z, -1x, -1y, -1z +2x, +2y, +2z, -2x, -2y, -2z +1x+1y, +1x+1z, +1y+1z -1x-1y, -1x-1z, -1y-1z +1x-1y, +1x-1z, +1y-1z -1x+1y, -1x+1z, -1y+1z */ SETSYMBOL(at, x->x_s_index_theta_phi); SETFLOAT(at+1, 1.0f); SETFLOAT(at+2, cart2del_damp_3d_calc_elevation(x_180_over_pi, x0, y0_, z0)); SETFLOAT(at+3, cart2del_damp_3d_calc_azimuth(x_180_over_pi, x0, y0_, z0)); outlet_anything(x->x_obj.ob_outlet, x->x_s_direct, 4, at); SETFLOAT(at+1, 1.0f); SETFLOAT(at+2, cart2del_damp_3d_calc_elevation(x_180_over_pi, xp1, y0_, z0)); SETFLOAT(at+3, cart2del_damp_3d_calc_azimuth(x_180_over_pi, xp1, y0_, z0)); outlet_anything(x->x_obj.ob_outlet, x->x_s_early1, 4, at); SETFLOAT(at+1, 2.0f); SETFLOAT(at+2, cart2del_damp_3d_calc_elevation(x_180_over_pi, x0, yp1, z0)); SETFLOAT(at+3, cart2del_damp_3d_calc_azimuth(x_180_over_pi, x0, yp1, z0)); outlet_anything(x->x_obj.ob_outlet, x->x_s_early1, 4, at); SETFLOAT(at+1, 3.0f); SETFLOAT(at+2, cart2del_damp_3d_calc_elevation(x_180_over_pi, x0, y0_, zp1)); SETFLOAT(at+3, cart2del_damp_3d_calc_azimuth(x_180_over_pi, x0, y0_, zp1)); outlet_anything(x->x_obj.ob_outlet, x->x_s_early1, 4, at); SETFLOAT(at+1, 4.0f); SETFLOAT(at+2, cart2del_damp_3d_calc_elevation(x_180_over_pi, xn1, y0_, z0)); SETFLOAT(at+3, cart2del_damp_3d_calc_azimuth(x_180_over_pi, xn1, y0_, z0)); outlet_anything(x->x_obj.ob_outlet, x->x_s_early1, 4, at); SETFLOAT(at+1, 5.0f); SETFLOAT(at+2, cart2del_damp_3d_calc_elevation(x_180_over_pi, x0, yn1, z0)); SETFLOAT(at+3, cart2del_damp_3d_calc_azimuth(x_180_over_pi, x0, yn1, z0)); outlet_anything(x->x_obj.ob_outlet, x->x_s_early1, 4, at); SETFLOAT(at+1, 6.0f); SETFLOAT(at+2, cart2del_damp_3d_calc_elevation(x_180_over_pi, x0, y0_, zn1)); SETFLOAT(at+3, cart2del_damp_3d_calc_azimuth(x_180_over_pi, x0, y0_, zn1)); outlet_anything(x->x_obj.ob_outlet, x->x_s_early1, 4, at); SETFLOAT(at+1, 1.0f); SETFLOAT(at+2, cart2del_damp_3d_calc_elevation(x_180_over_pi, xp2, y0_, z0)); SETFLOAT(at+3, cart2del_damp_3d_calc_azimuth(x_180_over_pi, xp2, y0_, z0)); outlet_anything(x->x_obj.ob_outlet, x->x_s_early2, 4, at); SETFLOAT(at+1, 2.0f); SETFLOAT(at+2, cart2del_damp_3d_calc_elevation(x_180_over_pi, x0, yp2, z0)); SETFLOAT(at+3, cart2del_damp_3d_calc_azimuth(x_180_over_pi, x0, yp2, z0)); outlet_anything(x->x_obj.ob_outlet, x->x_s_early2, 4, at); SETFLOAT(at+1, 3.0f); SETFLOAT(at+2, cart2del_damp_3d_calc_elevation(x_180_over_pi, x0, y0_, zp2)); SETFLOAT(at+3, cart2del_damp_3d_calc_azimuth(x_180_over_pi, x0, y0_, zp2)); outlet_anything(x->x_obj.ob_outlet, x->x_s_early2, 4, at); SETFLOAT(at+1, 4.0f); SETFLOAT(at+2, cart2del_damp_3d_calc_elevation(x_180_over_pi, xn2, y0_, z0)); SETFLOAT(at+3, cart2del_damp_3d_calc_azimuth(x_180_over_pi, xn2, y0_, z0)); outlet_anything(x->x_obj.ob_outlet, x->x_s_early2, 4, at); SETFLOAT(at+1, 5.0f); SETFLOAT(at+2, cart2del_damp_3d_calc_elevation(x_180_over_pi, x0, yn2, z0)); SETFLOAT(at+3, cart2del_damp_3d_calc_azimuth(x_180_over_pi, x0, yn2, z0)); outlet_anything(x->x_obj.ob_outlet, x->x_s_early2, 4, at); SETFLOAT(at+1, 6.0f); SETFLOAT(at+2, cart2del_damp_3d_calc_elevation(x_180_over_pi, x0, y0_, zn2)); SETFLOAT(at+3, cart2del_damp_3d_calc_azimuth(x_180_over_pi, x0, y0_, zn2)); outlet_anything(x->x_obj.ob_outlet, x->x_s_early2, 4, at); SETFLOAT(at+1, 7.0f); SETFLOAT(at+2, cart2del_damp_3d_calc_elevation(x_180_over_pi, xp1, yp1, z0)); SETFLOAT(at+3, cart2del_damp_3d_calc_azimuth(x_180_over_pi, xp1, yp1, z0)); outlet_anything(x->x_obj.ob_outlet, x->x_s_early2, 4, at); SETFLOAT(at+1, 8.0f); SETFLOAT(at+2, cart2del_damp_3d_calc_elevation(x_180_over_pi, xp1, y0_, zp1)); SETFLOAT(at+3, cart2del_damp_3d_calc_azimuth(x_180_over_pi, xp1, y0_, zp1)); outlet_anything(x->x_obj.ob_outlet, x->x_s_early2, 4, at); SETFLOAT(at+1, 9.0f); SETFLOAT(at+2, cart2del_damp_3d_calc_elevation(x_180_over_pi, x0, yp1, zp1)); SETFLOAT(at+3, cart2del_damp_3d_calc_azimuth(x_180_over_pi, x0, yp1, zp1)); outlet_anything(x->x_obj.ob_outlet, x->x_s_early2, 4, at); SETFLOAT(at+1, 10.0f); SETFLOAT(at+2, cart2del_damp_3d_calc_elevation(x_180_over_pi, xn1, yn1, z0)); SETFLOAT(at+3, cart2del_damp_3d_calc_azimuth(x_180_over_pi, xn1, yn1, z0)); outlet_anything(x->x_obj.ob_outlet, x->x_s_early2, 4, at); SETFLOAT(at+1, 11.0f); SETFLOAT(at+2, cart2del_damp_3d_calc_elevation(x_180_over_pi, xn1, y0_, zn1)); SETFLOAT(at+3, cart2del_damp_3d_calc_azimuth(x_180_over_pi, xn1, y0_, zn1)); outlet_anything(x->x_obj.ob_outlet, x->x_s_early2, 4, at); SETFLOAT(at+1, 12.0f); SETFLOAT(at+2, cart2del_damp_3d_calc_elevation(x_180_over_pi, x0, yn1, zn1)); SETFLOAT(at+3, cart2del_damp_3d_calc_azimuth(x_180_over_pi, x0, yn1, zn1)); outlet_anything(x->x_obj.ob_outlet, x->x_s_early2, 4, at); SETFLOAT(at+1, 13.0f); SETFLOAT(at+2, cart2del_damp_3d_calc_elevation(x_180_over_pi, xp1, yn1, z0)); SETFLOAT(at+3, cart2del_damp_3d_calc_azimuth(x_180_over_pi, xp1, yn1, z0)); outlet_anything(x->x_obj.ob_outlet, x->x_s_early2, 4, at); SETFLOAT(at+1, 14.0f); SETFLOAT(at+2, cart2del_damp_3d_calc_elevation(x_180_over_pi, xp1, y0_, zn1)); SETFLOAT(at+3, cart2del_damp_3d_calc_azimuth(x_180_over_pi, xp1, y0_, zn1)); outlet_anything(x->x_obj.ob_outlet, x->x_s_early2, 4, at); SETFLOAT(at+1, 15.0f); SETFLOAT(at+2, cart2del_damp_3d_calc_elevation(x_180_over_pi, x0, yp1, zn1)); SETFLOAT(at+3, cart2del_damp_3d_calc_azimuth(x_180_over_pi, x0, yp1, zn1)); outlet_anything(x->x_obj.ob_outlet, x->x_s_early2, 4, at); SETFLOAT(at+1, 16.0f); SETFLOAT(at+2, cart2del_damp_3d_calc_elevation(x_180_over_pi, xn1, yp1, z0)); SETFLOAT(at+3, cart2del_damp_3d_calc_azimuth(x_180_over_pi, xn1, yp1, z0)); outlet_anything(x->x_obj.ob_outlet, x->x_s_early2, 4, at); SETFLOAT(at+1, 17.0f); SETFLOAT(at+2, cart2del_damp_3d_calc_elevation(x_180_over_pi, xn1, y0_, zp1)); SETFLOAT(at+3, cart2del_damp_3d_calc_azimuth(x_180_over_pi, xn1, y0_, zp1)); outlet_anything(x->x_obj.ob_outlet, x->x_s_early2, 4, at); SETFLOAT(at+1, 18.0f); SETFLOAT(at+2, cart2del_damp_3d_calc_elevation(x_180_over_pi, x0, yn1, zp1)); SETFLOAT(at+3, cart2del_damp_3d_calc_azimuth(x_180_over_pi, x0, yn1, zp1)); outlet_anything(x->x_obj.ob_outlet, x->x_s_early2, 4, at); } static void cart2del_damp_3d_src_xyz(t_cart2del_damp_3d *x, t_symbol *s, int argc, t_atom *argv) { if((argc >= 3)&&IS_A_FLOAT(argv, 0)&&IS_A_FLOAT(argv, 1)&&IS_A_FLOAT(argv, 2)) { t_float xr2=0.5f*x->x_room_x, yr2=0.5f*x->x_room_y; x->x_src_x = atom_getfloat(argv++); x->x_src_y = atom_getfloat(argv++); x->x_src_z = atom_getfloat(argv); if(x->x_src_x > xr2) x->x_src_x = xr2; if(x->x_src_x < -xr2) x->x_src_x = -xr2; if(x->x_src_y > yr2) x->x_src_y = yr2; if(x->x_src_y < -yr2) x->x_src_y = -yr2; if(x->x_src_z > x->x_room_z) x->x_src_z = x->x_room_z; if(x->x_src_z < 0.0f) x->x_src_z = 0.0f; clock_delay(x->x_clock, 0.0f); } } static void cart2del_damp_3d_head_xyz(t_cart2del_damp_3d *x, t_symbol *s, int argc, t_atom *argv) { if((argc >= 3)&&IS_A_FLOAT(argv, 0)&&IS_A_FLOAT(argv, 1)&&IS_A_FLOAT(argv, 2)) { t_float xr2=0.5f*x->x_room_x, yr2=0.5f*x->x_room_y; x->x_head_x = atom_getfloat(argv++); x->x_head_y = atom_getfloat(argv++); x->x_head_z = atom_getfloat(argv); if(x->x_head_x > xr2) x->x_head_x = xr2; if(x->x_head_x < -xr2) x->x_head_x = -xr2; if(x->x_head_y > yr2) x->x_head_y = yr2; if(x->x_head_y < -yr2) x->x_head_y = -yr2; if(x->x_head_z > x->x_room_z) x->x_head_z = x->x_room_z; if(x->x_head_z < 0.0f) x->x_head_z = 0.0f; clock_delay(x->x_clock, 0.0f); } } static void cart2del_damp_3d_room_dim(t_cart2del_damp_3d *x, t_symbol *s, int argc, t_atom *argv) { if((argc >= 3)&&IS_A_FLOAT(argv, 0)&&IS_A_FLOAT(argv, 1)&&IS_A_FLOAT(argv, 2)) { x->x_room_x = atom_getfloat(argv++); x->x_room_y = atom_getfloat(argv++); x->x_room_z = atom_getfloat(argv); if(x->x_room_x < 0.5f) x->x_room_x = 0.5f; if(x->x_room_y < 0.5f) x->x_room_y = 0.5f; if(x->x_room_z < 0.5f) x->x_room_z = 0.5f; clock_delay(x->x_clock, 0.0f); } } static void cart2del_damp_3d_r_ambi(t_cart2del_damp_3d *x, t_floatarg r_ambi) { if(r_ambi < 0.1f) r_ambi = 0.1f; x->x_r_ambi = r_ambi; clock_delay(x->x_clock, 0.0f); } static void cart2del_damp_3d_sonic_speed(t_cart2del_damp_3d *x, t_floatarg speed) { if(speed < 10.0f) speed = 10.0f; if(speed > 2000.0f) speed = 2000.0f; x->x_speed = speed; clock_delay(x->x_clock, 0.0f); } static void cart2del_damp_3d_free(t_cart2del_damp_3d *x) { clock_free(x->x_clock); } static void *cart2del_damp_3d_new(t_symbol *s, int argc, t_atom *argv) { t_cart2del_damp_3d *x = (t_cart2del_damp_3d *)pd_new(cart2del_damp_3d_class); x->x_room_x = 12.0f; x->x_room_y = 8.0f; x->x_room_z = 4.0f; x->x_head_x = 0.0f; x->x_head_y = 0.0f; x->x_head_z = 1.7f; x->x_src_x = 3.0f; x->x_src_y = 0.5f; x->x_src_z = 2.5f; x->x_r_ambi = 1.4f; x->x_speed = 340.0f; x->x_s_direct = gensym("direct"); x->x_s_early1 = gensym("early1"); x->x_s_early2 = gensym("early2"); x->x_s_del = gensym("del"); x->x_s_damp = gensym("damp"); x->x_s_index_theta_phi = gensym("index_theta_phi"); outlet_new(&x->x_obj, &s_list); x->x_clock = clock_new(x, (t_method)cart2del_damp_3d_doit); x->x_180_over_pi = (t_float)(180.0 / (4.0 * atan(1.0))); return (x); } void cart2del_damp_3d_setup(void) { cart2del_damp_3d_class = class_new(gensym("cart2del_damp_3d"), (t_newmethod)cart2del_damp_3d_new, (t_method)cart2del_damp_3d_free, sizeof(t_cart2del_damp_3d), 0, A_GIMME, 0); class_addmethod(cart2del_damp_3d_class, (t_method)cart2del_damp_3d_src_xyz, gensym("src_xyz"), A_GIMME, 0); class_addmethod(cart2del_damp_3d_class, (t_method)cart2del_damp_3d_head_xyz, gensym("head_xyz"), A_GIMME, 0); class_addmethod(cart2del_damp_3d_class, (t_method)cart2del_damp_3d_room_dim, gensym("room_dim"), A_GIMME, 0); class_addmethod(cart2del_damp_3d_class, (t_method)cart2del_damp_3d_sonic_speed, gensym("sonic_speed"), A_FLOAT, 0); class_addmethod(cart2del_damp_3d_class, (t_method)cart2del_damp_3d_r_ambi, gensym("r_ambi"), A_FLOAT, 0); // class_sethelpsymbol(cart2del_damp_3d_class, gensym("iemhelp2/cart2del_damp_3d-help")); } iem_utils-v0.0.20180206/iem_roomsim/src/makefile0000644000175000017500000000152512630366346021506 0ustar zmoelnigzmoelnigcurrent: all .SUFFIXES: .pd_linux INCLUDE = -I. -I/usr/local/src/pd/src LDFLAGS = -export-dynamic -shared LIB = -ldl -lm -lpthread #select either the DBG and OPT compiler flags below: CFLAGS = -DPD -DUNIX -W -Wno-unused \ -Wno-parentheses -Wno-switch -O6 -funroll-loops -fomit-frame-pointer -fno-strict-aliasing \ -DDL_OPEN -fPIC SYSTEM = $(shell uname -m) # the sources SRC = early_reflections_3d.c \ early_reflections_2d.c \ cart2del_damp_2d.c \ cart2del_damp_3d.c \ iem_roomsim.c TARGET = iem_roomsim.pd_linux OBJ = $(SRC:.c=.o) # # ------------------ targets ------------------------------------ # clean: rm ..\$(TARGET) rm *.o all: $(OBJ) @echo :: $(OBJ) $(LD) $(LDFLAGS) -o $(TARGET) *.o $(LIB) strip --strip-unneeded $(TARGET) mv $(TARGET) .. $(OBJ) : %.o : %.c $(CC) $(CFLAGS) $(INCLUDE) -c -o $*.o $*.c iem_utils-v0.0.20180206/iem_roomsim/src/iem_roomsim.sln0000644000175000017500000000156712630366346023051 0ustar zmoelnigzmoelnig Microsoft Visual Studio Solution File, Format Version 10.00 # Visual Studio 2008 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "iem_roomsim", "iem_roomsim.vcproj", "{6A44952F-0D55-44EE-9032-928368583BEC}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Win32 = Debug|Win32 Release|Win32 = Release|Win32 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {6A44952F-0D55-44EE-9032-928368583BEC}.Debug|Win32.ActiveCfg = Debug|Win32 {6A44952F-0D55-44EE-9032-928368583BEC}.Debug|Win32.Build.0 = Debug|Win32 {6A44952F-0D55-44EE-9032-928368583BEC}.Release|Win32.ActiveCfg = Release|Win32 {6A44952F-0D55-44EE-9032-928368583BEC}.Release|Win32.Build.0 = Release|Win32 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection EndGlobal iem_utils-v0.0.20180206/iem_roomsim/src/early_reflections_3d.c0000644000175000017500000006501712630366346024257 0ustar zmoelnigzmoelnig/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_roomsim written by Thomas Musil (c) IEM KUG Graz Austria 2002 - 2006 */ #include "m_pd.h" #include "iemlib.h" #include /* -------------------------- early_reflections_3d ------------------------------ */ /* ** pos. x-Richtung Nase ** pos. y-Richtung Linke Hand ** pos. z-Richtung Scheitel ** Kartesischer Koordinaten-Ursprung liegt in der Mitte des Raums am Boden */ /* Reihenfolge der bundle-sektoren: index delta phi: 1 90 0 2 45 45 3 45 135 4 45 225 5 45 315 6 0 0 7 0 45 8 0 90 9 0 135 10 0 180 11 0 225 12 0 270 13 0 315 14 -45 45 15 -45 135 16 -45 225 17 -45 315 top +x +y 9 +x 15 +y 23 3 14 24 +x 8 22 2 13 +y 10 4 0 1 7 16 5 19 11 +x 21 +y 17 6 20 18 +x +y 12 */ typedef struct _early_reflections_3d { t_object x_obj; t_atom x_para_at[27]; void *x_direct_out; void *x_early_out; void *x_rev_out; t_symbol *x_s_del0; t_symbol *x_s_del1; t_symbol *x_s_del2; t_symbol *x_s_damp; t_symbol *x_s_index_delta_phi; t_symbol *x_s_bundle; t_float x_room_x; t_float x_room_y; t_float x_room_z; t_float x_head_x; t_float x_head_y; t_float x_head_z; int x_n_src; int x_bundle; t_float x_src_x[30]; t_float x_src_y[30]; t_float x_src_z[30]; t_float x_r_ambi; t_float x_speed; t_float x_180_over_pi; } t_early_reflections_3d; static t_class *early_reflections_3d_class; static t_float early_reflections_3d_calc_radius(t_floatarg r_ambi, t_floatarg dx, t_floatarg dy, t_floatarg dz) { t_float r = (t_float)sqrt(dx*dx + dy*dy + dz*dz); if(r < r_ambi) return(r_ambi); else return(r); } static t_float early_reflections_3d_calc_azimuth(t_floatarg x_180_over_pi, t_floatarg dx, t_floatarg dy, t_floatarg dz) { if(dx == 0.0f) { if(dy < 0.0f) return(270.0f); else return(90.0f); } else if(dx < 0.0f) { return(180.0f + x_180_over_pi * (t_float)atan(dy / dx)); } else { if(dy < 0.0f) return(360.0f + x_180_over_pi * (t_float)atan(dy / dx)); else return(x_180_over_pi * (t_float)atan(dy / dx)); } } static t_float early_reflections_3d_calc_elevation(t_floatarg x_180_over_pi, t_floatarg dx, t_floatarg dy, t_floatarg dz)/*changes*/ { t_float dxy = sqrt(dx*dx + dy*dy); if(dxy == 0.0f) { if(dz < 0.0f) return(-90.0f); else return(90.0f); } else { return(x_180_over_pi * (t_float)atan(dz / dxy)); } } static t_float early_reflections_3d_calc_bundle_index(t_floatarg delta, t_floatarg phi)/*changes*/ { if(delta > 67.5f) return(1.0f); else if(delta > 22.5f) { if(phi <= 180.0f) { if(phi <= 90.0f) return(2.0f); else return(3.0f); } else { if(phi <= 270.0f) return(4.0f); else return(5.0f); } } else if(delta > -22.5f) { phi += 22.5f; if(phi >= 360.0f) phi -= 360.0f; if(phi <= 180.0f) { if(phi <= 90.0f) { if(phi <= 45.0f)/* 0 .. 45 */ return(6.0f); else return(7.0f); } else { if(phi <= 135.0f) return(8.0f); else return(9.0f); } } else { if(phi <= 270.0f) { if(phi <= 225.0f) return(10.0f); else return(11.0f); } else { if(phi <= 315.0f)/* 270 .. 315 */ return(12.0f); else return(13.0f);/* 315 .. 360 */ } } } else { if(phi <= 180.0f) { if(phi <= 90.0f) return(14.0f); else return(15.0f); } else { if(phi <= 270.0f) return(16.0f); else return(17.0f); } } } static void early_reflections_3d_doit(t_early_reflections_3d *x) { t_atom *at; t_float diff_x, diff_y, diff_z; t_float sum_x, sum_y, sum_z; t_float lx, wy, hz; t_float x0, y0_, z0; t_float xp1, yp1, zp1; t_float xn1, yn1, zn1; t_float xp2, yp2, zp2; t_float xn2, yn2, zn2; t_float m2ms = 1000.0f / x->x_speed; t_float x_180_over_pi=x->x_180_over_pi; t_float r_ambi = x->x_r_ambi; t_float rad[50], delta[50], phi[50]; int n_src=x->x_n_src; int i; /*t_float hz2 = 0.5f*x->x_room_z; diff_x = x->x_src_x - x->x_head_x; diff_y = x->x_src_y - x->x_head_y; diff_z = (x->x_src_z - hz2) - (x->x_head_z - hz2); sum_x = x->x_src_x + x->x_head_x; sum_y = x->x_src_y + x->x_head_y; sum_z = (x->x_src_z - hz2) + (x->x_head_z - hz2);*/ lx = x->x_room_x; wy = x->x_room_y; hz = x->x_room_z; SETFLOAT(x->x_para_at, early_reflections_3d_calc_radius(r_ambi, lx, wy, hz)*m2ms); outlet_anything(x->x_rev_out, x->x_s_del0, 1, x->x_para_at); for(i=0; ix_src_x[i] - x->x_head_x; diff_y = x->x_src_y[i] - x->x_head_y; diff_z = x->x_src_z[i] - x->x_head_z; sum_x = x->x_src_x[i] + x->x_head_x; sum_y = x->x_src_y[i] + x->x_head_y; sum_z = x->x_src_z[i] + x->x_head_z - hz; x0 = diff_x; y0_ = diff_y; z0 = diff_z; xp1 = lx - sum_x; yp1 = wy - sum_y; zp1 = hz - sum_z; xn1 = -lx - sum_x; yn1 = -wy - sum_y; zn1 = -hz - sum_z; xp2 = 2.0f*lx + diff_x; yp2 = 2.0f*wy + diff_y; zp2 = 2.0f*hz + diff_z; xn2 = -2.0f*lx + diff_x; yn2 = -2.0f*wy + diff_y; zn2 = -2.0f*hz + diff_z; rad[0] = early_reflections_3d_calc_radius(r_ambi, x0, y0_, z0); rad[1] = early_reflections_3d_calc_radius(r_ambi, xp1, y0_, z0); rad[2] = early_reflections_3d_calc_radius(r_ambi, x0, yp1, z0); rad[3] = early_reflections_3d_calc_radius(r_ambi, x0, y0_, zp1); rad[4] = early_reflections_3d_calc_radius(r_ambi, xn1, y0_, z0); rad[5] = early_reflections_3d_calc_radius(r_ambi, x0, yn1, z0); rad[6] = early_reflections_3d_calc_radius(r_ambi, x0, y0_, zn1); rad[7] = early_reflections_3d_calc_radius(r_ambi, xp2, y0_, z0); rad[8] = early_reflections_3d_calc_radius(r_ambi, x0, yp2, z0); rad[9] = early_reflections_3d_calc_radius(r_ambi, x0, y0_, zp2); rad[10] = early_reflections_3d_calc_radius(r_ambi, xn2, y0_, z0); rad[11] = early_reflections_3d_calc_radius(r_ambi, x0, yn2, z0); rad[12] = early_reflections_3d_calc_radius(r_ambi, x0, y0_, zn2); rad[13] = early_reflections_3d_calc_radius(r_ambi, xp1, yp1, z0); rad[14] = early_reflections_3d_calc_radius(r_ambi, xp1, y0_, zp1); rad[15] = early_reflections_3d_calc_radius(r_ambi, x0, yp1, zp1); rad[16] = early_reflections_3d_calc_radius(r_ambi, xn1, yn1, z0); rad[17] = early_reflections_3d_calc_radius(r_ambi, xn1, y0_, zn1); rad[18] = early_reflections_3d_calc_radius(r_ambi, x0, yn1, zn1); rad[19] = early_reflections_3d_calc_radius(r_ambi, xp1, yn1, z0); rad[20] = early_reflections_3d_calc_radius(r_ambi, xp1, y0_, zn1); rad[21] = early_reflections_3d_calc_radius(r_ambi, x0, yp1, zn1); rad[22] = early_reflections_3d_calc_radius(r_ambi, xn1, yp1, z0); rad[23] = early_reflections_3d_calc_radius(r_ambi, xn1, y0_, zp1); rad[24] = early_reflections_3d_calc_radius(r_ambi, x0, yn1, zp1); /* delay-reihenfolge: 0 auslassen, +1x, +1y, +1z, -1x, -1y, -1z +2x, +2y, +2z, -2x, -2y, -2z +1x+1y, +1x+1z, +1y+1z -1x-1y, -1x-1z, -1y-1z +1x-1y, +1x-1z, +1y-1z -1x+1y, -1x+1z, -1y+1z */ at = x->x_para_at; SETFLOAT(at, (t_float)(i+1));/*changes*/ at++; SETFLOAT(at, rad[0] * m2ms); outlet_anything(x->x_direct_out, x->x_s_del0, 2, x->x_para_at); at = x->x_para_at+1; SETFLOAT(at, rad[1] *m2ms); at++; SETFLOAT(at, rad[2] *m2ms); at++; SETFLOAT(at, rad[3] *m2ms); at++; SETFLOAT(at, rad[4] *m2ms); at++; SETFLOAT(at, rad[5] *m2ms); at++; SETFLOAT(at, rad[6] *m2ms); outlet_anything(x->x_early_out, x->x_s_del1, 7, x->x_para_at); at = x->x_para_at+1; SETFLOAT(at, rad[7] *m2ms); at++; SETFLOAT(at, rad[8] *m2ms); at++; SETFLOAT(at, rad[9] *m2ms); at++; SETFLOAT(at, rad[10] *m2ms); at++; SETFLOAT(at, rad[11] *m2ms); at++; SETFLOAT(at, rad[12] *m2ms); at++; SETFLOAT(at, rad[13] *m2ms); at++; SETFLOAT(at, rad[14] *m2ms); at++; SETFLOAT(at, rad[15] *m2ms); at++; SETFLOAT(at, rad[16] *m2ms); at++; SETFLOAT(at, rad[17] *m2ms); at++; SETFLOAT(at, rad[18] *m2ms); at++; SETFLOAT(at, rad[19] *m2ms); at++; SETFLOAT(at, rad[20] *m2ms); at++; SETFLOAT(at, rad[21] *m2ms); at++; SETFLOAT(at, rad[22] *m2ms); at++; SETFLOAT(at, rad[23] *m2ms); at++; SETFLOAT(at, rad[24] *m2ms); outlet_anything(x->x_early_out, x->x_s_del2, 19, x->x_para_at); /* daempfungs-reihenfolge: 0, +1x, +1y, +1z, -1x, -1y, -1z +2x, +2y, +2z, -2x, -2y, -2z +1x+1y, +1x+1z, +1y+1z -1x-1y, -1x-1z, -1y-1z +1x-1y, +1x-1z, +1y-1z -1x+1y, -1x+1z, -1y+1z */ at = x->x_para_at+1; SETFLOAT(at, r_ambi / rad[0]); outlet_anything(x->x_direct_out, x->x_s_damp, 2, x->x_para_at); at = x->x_para_at+1; SETFLOAT(at, r_ambi / rad[1]); at++; SETFLOAT(at, r_ambi / rad[2]); at++; SETFLOAT(at, r_ambi / rad[3]); at++; SETFLOAT(at, r_ambi / rad[4]); at++; SETFLOAT(at, r_ambi / rad[5]); at++; SETFLOAT(at, r_ambi / rad[6]); at++; SETFLOAT(at, r_ambi / rad[7]); at++; SETFLOAT(at, r_ambi / rad[8]); at++; SETFLOAT(at, r_ambi / rad[9]); at++; SETFLOAT(at, r_ambi / rad[10]); at++; SETFLOAT(at, r_ambi / rad[11]); at++; SETFLOAT(at, r_ambi / rad[12]); at++; SETFLOAT(at, r_ambi / rad[13]); at++; SETFLOAT(at, r_ambi / rad[14]); at++; SETFLOAT(at, r_ambi / rad[15]); at++; SETFLOAT(at, r_ambi / rad[16]); at++; SETFLOAT(at, r_ambi / rad[17]); at++; SETFLOAT(at, r_ambi / rad[18]); at++; SETFLOAT(at, r_ambi / rad[19]); at++; SETFLOAT(at, r_ambi / rad[20]); at++; SETFLOAT(at, r_ambi / rad[21]); at++; SETFLOAT(at, r_ambi / rad[22]); at++; SETFLOAT(at, r_ambi / rad[23]); at++; SETFLOAT(at, r_ambi / rad[24]); outlet_anything(x->x_early_out, x->x_s_damp, 25, x->x_para_at); /* encoder-winkel-reihenfolge: index delta phi 0, +1x, +1y, +1z, -1x, -1y, -1z +2x, +2y, +2z, -2x, -2y, -2z +1x+1y, +1x+1z, +1y+1z -1x-1y, -1x-1z, -1y-1z +1x-1y, +1x-1z, +1y-1z -1x+1y, -1x+1z, -1y+1z */ at = x->x_para_at+1; SETFLOAT(at, early_reflections_3d_calc_elevation(x_180_over_pi, x0, y0_, z0)); at++; SETFLOAT(at, early_reflections_3d_calc_azimuth(x_180_over_pi, x0, y0_, z0)); outlet_anything(x->x_direct_out, x->x_s_index_delta_phi, 3, x->x_para_at); /* encoder-winkel-reihenfolge: bundle 0, +1x, +1y, +1z, -1x, -1y, -1z +2x, +2y, +2z, -2x, -2y, -2z +1x+1y, +1x+1z, +1y+1z -1x-1y, -1x-1z, -1y-1z +1x-1y, +1x-1z, +1y-1z -1x+1y, -1x+1z, -1y+1z */ delta[0] = early_reflections_3d_calc_elevation(x_180_over_pi, xp1, y0_, z0); phi[0] = early_reflections_3d_calc_azimuth(x_180_over_pi, xp1, y0_, z0); delta[1] = early_reflections_3d_calc_elevation(x_180_over_pi, x0, yp1, z0); phi[1] = early_reflections_3d_calc_azimuth(x_180_over_pi, x0, yp1, z0); delta[2] = early_reflections_3d_calc_elevation(x_180_over_pi, x0, y0_, zp1); phi[2] = early_reflections_3d_calc_azimuth(x_180_over_pi, x0, y0_, zp1); delta[3] = early_reflections_3d_calc_elevation(x_180_over_pi, xn1, y0_, z0); phi[3] = early_reflections_3d_calc_azimuth(x_180_over_pi, xn1, y0_, z0); delta[4] = early_reflections_3d_calc_elevation(x_180_over_pi, x0, yn1, z0); phi[4] = early_reflections_3d_calc_azimuth(x_180_over_pi, x0, yn1, z0); delta[5] = early_reflections_3d_calc_elevation(x_180_over_pi, x0, y0_, zn1); phi[5] = early_reflections_3d_calc_azimuth(x_180_over_pi, x0, y0_, zn1); delta[6] = early_reflections_3d_calc_elevation(x_180_over_pi, xp2, y0_, z0); phi[6] = early_reflections_3d_calc_azimuth(x_180_over_pi, xp2, y0_, z0); delta[7] = early_reflections_3d_calc_elevation(x_180_over_pi, x0, yp2, z0); phi[7] = early_reflections_3d_calc_azimuth(x_180_over_pi, x0, yp2, z0); delta[8] = early_reflections_3d_calc_elevation(x_180_over_pi, x0, y0_, zp2); phi[8] = early_reflections_3d_calc_azimuth(x_180_over_pi, x0, y0_, zp2); delta[9] = early_reflections_3d_calc_elevation(x_180_over_pi, xn2, y0_, z0); phi[9] = early_reflections_3d_calc_azimuth(x_180_over_pi, xn2, y0_, z0); delta[10] = early_reflections_3d_calc_elevation(x_180_over_pi, x0, yn2, z0); phi[10] = early_reflections_3d_calc_azimuth(x_180_over_pi, x0, yn2, z0); delta[11] = early_reflections_3d_calc_elevation(x_180_over_pi, x0, y0_, zn2); phi[11] = early_reflections_3d_calc_azimuth(x_180_over_pi, x0, y0_, zn2); delta[12] = early_reflections_3d_calc_elevation(x_180_over_pi, xp1, yp1, z0); phi[12] = early_reflections_3d_calc_azimuth(x_180_over_pi, xp1, yp1, z0); delta[13] = early_reflections_3d_calc_elevation(x_180_over_pi, xp1, y0_, zp1); phi[13] = early_reflections_3d_calc_azimuth(x_180_over_pi, xp1, y0_, zp1); delta[14] = early_reflections_3d_calc_elevation(x_180_over_pi, x0, yp1, zp1); phi[14] = early_reflections_3d_calc_azimuth(x_180_over_pi, x0, yp1, zp1); delta[15] = early_reflections_3d_calc_elevation(x_180_over_pi, xn1, yn1, z0); phi[15] = early_reflections_3d_calc_azimuth(x_180_over_pi, xn1, yn1, z0); delta[16] = early_reflections_3d_calc_elevation(x_180_over_pi, xn1, y0_, zn1); phi[16] = early_reflections_3d_calc_azimuth(x_180_over_pi, xn1, y0_, zn1); delta[17] = early_reflections_3d_calc_elevation(x_180_over_pi, x0, yn1, zn1); phi[17] = early_reflections_3d_calc_azimuth(x_180_over_pi, x0, yn1, zn1); delta[18] = early_reflections_3d_calc_elevation(x_180_over_pi, xp1, yn1, z0); phi[18] = early_reflections_3d_calc_azimuth(x_180_over_pi, xp1, yn1, z0); delta[19] = early_reflections_3d_calc_elevation(x_180_over_pi, xp1, y0_, zn1); phi[19] = early_reflections_3d_calc_azimuth(x_180_over_pi, xp1, y0_, zn1); delta[20] = early_reflections_3d_calc_elevation(x_180_over_pi, x0, yp1, zn1); phi[20] = early_reflections_3d_calc_azimuth(x_180_over_pi, x0, yp1, zn1); delta[21] = early_reflections_3d_calc_elevation(x_180_over_pi, xn1, yp1, z0); phi[21] = early_reflections_3d_calc_azimuth(x_180_over_pi, xn1, yp1, z0); delta[22] = early_reflections_3d_calc_elevation(x_180_over_pi, xn1, y0_, zp1); phi[22] = early_reflections_3d_calc_azimuth(x_180_over_pi, xn1, y0_, zp1); delta[23] = early_reflections_3d_calc_elevation(x_180_over_pi, x0, yn1, zp1); phi[23] = early_reflections_3d_calc_azimuth(x_180_over_pi, x0, yn1, zp1); if(x->x_bundle) { at = x->x_para_at+1; SETFLOAT(at, early_reflections_3d_calc_bundle_index(delta[0], phi[0])); at++; SETFLOAT(at, early_reflections_3d_calc_bundle_index(delta[1], phi[1])); at++; SETFLOAT(at, early_reflections_3d_calc_bundle_index(delta[2], phi[2])); at++; SETFLOAT(at, early_reflections_3d_calc_bundle_index(delta[3], phi[3])); at++; SETFLOAT(at, early_reflections_3d_calc_bundle_index(delta[4], phi[4])); at++; SETFLOAT(at, early_reflections_3d_calc_bundle_index(delta[5], phi[5])); at++; SETFLOAT(at, early_reflections_3d_calc_bundle_index(delta[6], phi[6])); at++; SETFLOAT(at, early_reflections_3d_calc_bundle_index(delta[7], phi[7])); at++; SETFLOAT(at, early_reflections_3d_calc_bundle_index(delta[8], phi[8])); at++; SETFLOAT(at, early_reflections_3d_calc_bundle_index(delta[9], phi[9])); at++; SETFLOAT(at, early_reflections_3d_calc_bundle_index(delta[10], phi[10])); at++; SETFLOAT(at, early_reflections_3d_calc_bundle_index(delta[11], phi[11])); at++; SETFLOAT(at, early_reflections_3d_calc_bundle_index(delta[12], phi[12])); at++; SETFLOAT(at, early_reflections_3d_calc_bundle_index(delta[13], phi[13])); at++; SETFLOAT(at, early_reflections_3d_calc_bundle_index(delta[14], phi[14])); at++; SETFLOAT(at, early_reflections_3d_calc_bundle_index(delta[15], phi[15])); at++; SETFLOAT(at, early_reflections_3d_calc_bundle_index(delta[16], phi[16])); at++; SETFLOAT(at, early_reflections_3d_calc_bundle_index(delta[17], phi[17])); at++; SETFLOAT(at, early_reflections_3d_calc_bundle_index(delta[18], phi[18])); at++; SETFLOAT(at, early_reflections_3d_calc_bundle_index(delta[19], phi[19])); at++; SETFLOAT(at, early_reflections_3d_calc_bundle_index(delta[20], phi[20])); at++; SETFLOAT(at, early_reflections_3d_calc_bundle_index(delta[21], phi[21])); at++; SETFLOAT(at, early_reflections_3d_calc_bundle_index(delta[22], phi[22])); at++; SETFLOAT(at, early_reflections_3d_calc_bundle_index(delta[23], phi[23])); outlet_anything(x->x_early_out, x->x_s_bundle, 25, x->x_para_at); } at = x->x_para_at+1; SETFLOAT(at, 1.0f); at++; SETFLOAT(at, delta[0]); at++; SETFLOAT(at, phi[0]); outlet_anything(x->x_early_out, x->x_s_index_delta_phi, 4, x->x_para_at); at = x->x_para_at+1; SETFLOAT(at, 2.0f); at++; SETFLOAT(at, delta[1]); at++; SETFLOAT(at, phi[1]); outlet_anything(x->x_early_out, x->x_s_index_delta_phi, 4, x->x_para_at); at = x->x_para_at+1; SETFLOAT(at, 3.0f); at++; SETFLOAT(at, delta[2]); at++; SETFLOAT(at, phi[2]); outlet_anything(x->x_early_out, x->x_s_index_delta_phi, 4, x->x_para_at); at = x->x_para_at+1; SETFLOAT(at, 4.0f); at++; SETFLOAT(at, delta[3]); at++; SETFLOAT(at, phi[3]); outlet_anything(x->x_early_out, x->x_s_index_delta_phi, 4, x->x_para_at); at = x->x_para_at+1; SETFLOAT(at, 5.0f); at++; SETFLOAT(at, delta[4]); at++; SETFLOAT(at, phi[4]); outlet_anything(x->x_early_out, x->x_s_index_delta_phi, 4, x->x_para_at); at = x->x_para_at+1; SETFLOAT(at, 6.0f); at++; SETFLOAT(at, delta[5]); at++; SETFLOAT(at, phi[5]); outlet_anything(x->x_early_out, x->x_s_index_delta_phi, 4, x->x_para_at); at = x->x_para_at+1; SETFLOAT(at, 7.0f); at++; SETFLOAT(at, delta[6]); at++; SETFLOAT(at, phi[6]); outlet_anything(x->x_early_out, x->x_s_index_delta_phi, 4, x->x_para_at); at = x->x_para_at+1; SETFLOAT(at, 8.0f); at++; SETFLOAT(at, delta[7]); at++; SETFLOAT(at, phi[7]); outlet_anything(x->x_early_out, x->x_s_index_delta_phi, 4, x->x_para_at); at = x->x_para_at+1; SETFLOAT(at, 9.0f); at++; SETFLOAT(at, delta[8]); at++; SETFLOAT(at, phi[8]); outlet_anything(x->x_early_out, x->x_s_index_delta_phi, 4, x->x_para_at); at = x->x_para_at+1; SETFLOAT(at, 10.0f); at++; SETFLOAT(at, delta[9]); at++; SETFLOAT(at, phi[9]); outlet_anything(x->x_early_out, x->x_s_index_delta_phi, 4, x->x_para_at); at = x->x_para_at+1; SETFLOAT(at, 11.0f); at++; SETFLOAT(at, delta[10]); at++; SETFLOAT(at, phi[10]); outlet_anything(x->x_early_out, x->x_s_index_delta_phi, 4, x->x_para_at); at = x->x_para_at+1; SETFLOAT(at, 12.0f); at++; SETFLOAT(at, delta[11]); at++; SETFLOAT(at, phi[11]); outlet_anything(x->x_early_out, x->x_s_index_delta_phi, 4, x->x_para_at); at = x->x_para_at+1; SETFLOAT(at, 13.0f); at++; SETFLOAT(at, delta[12]); at++; SETFLOAT(at, phi[12]); outlet_anything(x->x_early_out, x->x_s_index_delta_phi, 4, x->x_para_at); at = x->x_para_at+1; SETFLOAT(at, 14.0f); at++; SETFLOAT(at, delta[13]); at++; SETFLOAT(at, phi[13]); outlet_anything(x->x_early_out, x->x_s_index_delta_phi, 4, x->x_para_at); at = x->x_para_at+1; SETFLOAT(at, 15.0f); at++; SETFLOAT(at, delta[14]); at++; SETFLOAT(at, phi[14]); outlet_anything(x->x_early_out, x->x_s_index_delta_phi, 4, x->x_para_at); at = x->x_para_at+1; SETFLOAT(at, 16.0f); at++; SETFLOAT(at, delta[15]); at++; SETFLOAT(at, phi[15]); outlet_anything(x->x_early_out, x->x_s_index_delta_phi, 4, x->x_para_at); at = x->x_para_at+1; SETFLOAT(at, 17.0f); at++; SETFLOAT(at, delta[16]); at++; SETFLOAT(at, phi[16]); outlet_anything(x->x_early_out, x->x_s_index_delta_phi, 4, x->x_para_at); at = x->x_para_at+1; SETFLOAT(at, 18.0f); at++; SETFLOAT(at, delta[17]); at++; SETFLOAT(at, phi[17]); outlet_anything(x->x_early_out, x->x_s_index_delta_phi, 4, x->x_para_at); at = x->x_para_at+1; SETFLOAT(at, 19.0f); at++; SETFLOAT(at, delta[18]); at++; SETFLOAT(at, phi[18]); outlet_anything(x->x_early_out, x->x_s_index_delta_phi, 4, x->x_para_at); at = x->x_para_at+1; SETFLOAT(at, 20.0f); at++; SETFLOAT(at, delta[19]); at++; SETFLOAT(at, phi[19]); outlet_anything(x->x_early_out, x->x_s_index_delta_phi, 4, x->x_para_at); at = x->x_para_at+1; SETFLOAT(at, 21.0f); at++; SETFLOAT(at, delta[20]); at++; SETFLOAT(at, phi[20]); outlet_anything(x->x_early_out, x->x_s_index_delta_phi, 4, x->x_para_at); at = x->x_para_at+1; SETFLOAT(at, 22.0f); at++; SETFLOAT(at, delta[21]); at++; SETFLOAT(at, phi[21]); outlet_anything(x->x_early_out, x->x_s_index_delta_phi, 4, x->x_para_at); at = x->x_para_at+1; SETFLOAT(at, 23.0f); at++; SETFLOAT(at, delta[22]); at++; SETFLOAT(at, phi[22]); outlet_anything(x->x_early_out, x->x_s_index_delta_phi, 4, x->x_para_at); at = x->x_para_at+1; SETFLOAT(at, 24.0f); at++; SETFLOAT(at, delta[23]); at++; SETFLOAT(at, phi[23]); outlet_anything(x->x_early_out, x->x_s_index_delta_phi, 4, x->x_para_at); } } static void early_reflections_3d_dump_para(t_early_reflections_3d *x) { int i, n=x->x_n_src; post("*******************************************************************************"); post("room-dimensions: L_x = %.3f, W_y = %.3f, H_z = %.3f", x->x_room_x, x->x_room_y, x->x_room_z); post("hear-position: x_hear = %.3f, y_hear = %.3f, z_hear = %.3f", x->x_head_x, x->x_head_y, x->x_head_z); for(i=0; ix_src_x[i], i+1, x->x_src_y[i], i+1, x->x_src_z[i], i+1); post("ambisonic-radius: %f", x->x_r_ambi); post("sonic-speed: %.3f", x->x_speed); post("order of outputs: direct early rev"); post("*******************************************************************************"); } static void early_reflections_3d_para(t_early_reflections_3d *x, t_symbol *s, int argc, t_atom *argv) { int i, n=x->x_n_src*3 + 7;/* r_ambi + 3*room + 3*head */ if(argc != n) { post("early_reflections_3d ERROR: para needs 1 r_ambi + 3*room + 3*head +n*3*src"); return; } x->x_r_ambi = atom_getfloat(argv++); x->x_room_x = atom_getfloat(argv++); x->x_room_y = atom_getfloat(argv++); x->x_room_z = atom_getfloat(argv++); x->x_head_x = atom_getfloat(argv++); x->x_head_y = atom_getfloat(argv++); x->x_head_z = atom_getfloat(argv++); n = x->x_n_src; for(i=0; ix_src_x[i] = atom_getfloat(argv++); x->x_src_y[i] = atom_getfloat(argv++); x->x_src_z[i] = atom_getfloat(argv++); } early_reflections_3d_doit(x); } static void early_reflections_3d_sonic_speed(t_early_reflections_3d *x, t_floatarg speed) { if(speed < 300.0f) speed = 300.0f; if(speed > 400.0f) speed = 400.0f; x->x_speed = speed; } static void early_reflections_3d_bundle(t_early_reflections_3d *x, t_floatarg bundle) { if(bundle == 0.0f) x->x_bundle = 0; else x->x_bundle = 1; } static void early_reflections_3d_free(t_early_reflections_3d *x) { } static void *early_reflections_3d_new(t_floatarg fn_src) { int i, n; t_early_reflections_3d *x = (t_early_reflections_3d *)pd_new(early_reflections_3d_class); n = (int)fn_src; if(n < 1) n = 1; if(n > 30) n = 30; x->x_n_src = n; x->x_room_x = 12.0f; x->x_room_y = 8.0f; x->x_room_z = 4.0f; x->x_head_x = 0.0f; x->x_head_y = 0.0f; x->x_head_z = 1.7f; for(i=0; ix_src_x[i] = 3.0f; x->x_src_y[i] = 0.5f; x->x_src_z[i] = 2.5f; } x->x_r_ambi = 1.4f; x->x_speed = 340.0f; x->x_s_del0 = gensym("del0"); x->x_s_del1 = gensym("del1"); x->x_s_del2 = gensym("del2"); x->x_s_damp = gensym("damp"); x->x_s_index_delta_phi = gensym("index_delta_phi"); x->x_s_bundle = gensym("bundle"); x->x_direct_out = outlet_new(&x->x_obj, &s_list); x->x_early_out = outlet_new(&x->x_obj, &s_list); x->x_rev_out = outlet_new(&x->x_obj, &s_list); x->x_180_over_pi = (t_float)(180.0 / (4.0 * atan(1.0))); x->x_bundle = 0; return (x); } void early_reflections_3d_setup(void) { early_reflections_3d_class = class_new(gensym("early_reflections_3d"), (t_newmethod)early_reflections_3d_new, (t_method)early_reflections_3d_free, sizeof(t_early_reflections_3d), 0, A_DEFFLOAT, 0); class_addmethod(early_reflections_3d_class, (t_method)early_reflections_3d_para, gensym("para"), A_GIMME, 0); class_addmethod(early_reflections_3d_class, (t_method)early_reflections_3d_sonic_speed, gensym("sonic_speed"), A_FLOAT, 0); class_addmethod(early_reflections_3d_class, (t_method)early_reflections_3d_bundle, gensym("bundle"), A_FLOAT, 0); class_addmethod(early_reflections_3d_class, (t_method)early_reflections_3d_dump_para, gensym("dump_para"), 0); // class_sethelpsymbol(early_reflections_3d_class, gensym("iemhelp2/early_reflections_3d-help")); } iem_utils-v0.0.20180206/iem_roomsim/READ_ME.txt0000644000175000017500000000111512630366346021047 0ustar zmoelnigzmoelnigThis library extends the performance of miller puckette's pure data (pd). iem_roomsim is written by Thomas Musil from IEM Graz Austria and it is compatible to miller puckette's pd-0.37-3 to pd-0.39-2. see also LICENCE.txt, GnuGPL.txt. iem_roomsim contains 2 objects: "cart2del_damp_2d" and "cart2del_damp_3d". this are 2 mirror source method rendering objects, they calculate the radius distance, the delay time and the spheric coordinates in case of 3D or the polar coordinates in case of 2D of all the first and second reflections between an subjekt and an object in a cuboid room. iem_utils-v0.0.20180206/iem_roomsim/GnuGPL.txt0000644000175000017500000004311012630366346021050 0ustar zmoelnigzmoelnig GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License. iem_utils-v0.0.20180206/iem_roomsim/cart2del_damp_2d-help.pd0000644000175000017500000002044512630366346023562 0ustar zmoelnigzmoelnig#N canvas 11 8 974 613 10; #X text 11 9 cart2del_damp_2d; #X obj 48 288 cart2del_damp_2d; #X msg 59 83 sonic_speed 340; #X msg 67 104 r_ambi 1.4; #X obj 105 154 pack; #X obj 139 154 t b f; #X floatatom 98 137 5 -20 20 0 - - -; #X floatatom 141 137 5 -20 20 0 - - -; #X text 183 136 m x m; #X obj 151 225 pack; #X obj 185 225 t b f; #X floatatom 144 208 5 -20 20 0 - - -; #X floatatom 187 208 5 -20 20 0 - - -; #X text 229 207 m x m; #X obj 48 313 print; #X msg 105 175 head_xy \$1 \$2; #X msg 151 246 src_xy \$1 \$2; #X obj 96 314 s xxx; #X obj 368 19 r xxx; #X obj 368 41 route direct early1 early2; #X obj 368 424 route del damp index_phi; #X floatatom 368 508 5 0 0 0 - - -; #X floatatom 414 485 5 0 0 0 - - -; #X floatatom 460 465 5 0 0 0 - - -; #X obj 418 241 route del damp index_phi; #X floatatom 510 290 5 0 0 0 - - -; #X floatatom 551 290 5 0 0 0 - - -; #X obj 418 358 unpack 0 0 0 0; #X floatatom 418 380 5 0 0 0 - - -; #X floatatom 460 380 5 0 0 0 - - -; #X floatatom 502 380 5 0 0 0 - - -; #X floatatom 545 380 5 0 0 0 - - -; #X obj 464 309 unpack 0 0 0 0; #X floatatom 464 339 5 0 0 0 - - -; #X floatatom 506 339 5 0 0 0 - - -; #X floatatom 548 339 5 0 0 0 - - -; #X floatatom 591 339 5 0 0 0 - - -; #X obj 460 444 route 1; #X obj 510 265 route 1 2 3 4; #X floatatom 592 290 5 0 0 0 - - -; #X floatatom 633 290 5 0 0 0 - - -; #X obj 468 62 route del damp index_phi; #X floatatom 560 112 5 0 0 0 - - -; #X floatatom 601 112 5 0 0 0 - - -; #X floatatom 468 204 5 0 0 0 - - -; #X floatatom 510 204 5 0 0 0 - - -; #X floatatom 552 204 5 0 0 0 - - -; #X floatatom 595 204 5 0 0 0 - - -; #X floatatom 642 112 5 0 0 0 - - -; #X floatatom 683 112 5 0 0 0 - - -; #X obj 560 87 route 1 2 3 4 5 6 7 8; #X floatatom 724 112 5 0 0 0 - - -; #X floatatom 765 112 5 0 0 0 - - -; #X floatatom 806 112 5 0 0 0 - - -; #X floatatom 847 112 5 0 0 0 - - -; #X text 673 290 degree; #X text 587 379 ms; #X text 499 466 degree; #X text 409 508 ms; #X text 808 204 ms; #X obj 468 181 unpack 0 0 0 0 0 0 0 0; #X floatatom 637 204 5 0 0 0 - - -; #X floatatom 679 204 5 0 0 0 - - -; #X floatatom 721 204 5 0 0 0 - - -; #X floatatom 764 204 5 0 0 0 - - -; #X floatatom 514 156 5 0 0 0 - - -; #X floatatom 556 156 5 0 0 0 - - -; #X floatatom 598 156 5 0 0 0 - - -; #X floatatom 641 156 5 0 0 0 - - -; #X obj 514 133 unpack 0 0 0 0 0 0 0 0; #X floatatom 683 156 5 0 0 0 - - -; #X floatatom 725 156 5 0 0 0 - - -; #X floatatom 767 156 5 0 0 0 - - -; #X floatatom 810 156 5 0 0 0 - - -; #X text 885 110 degree; #X text 78 385 IEM KUG; #X text 62 373 musil; #X text 92 373 @; #X text 98 373 iem.at; #X text 61 395 Graz \, Austria; #X text 13 362 (c) Thomas Musil 2000 - 2006; #X text 163 81 sonic speed in meter per second; #X text 148 105 minimum raduis in meter; #X text 149 64 room dimensions in meter; #X text 237 250 object coordinates; #X text 194 174 subject coordinates; #X text 847 156 linear rms; #X text 629 338 linear rms; #X text 452 483 linear rms; #X text 684 378 |; #X text 684 386 |; #X text 684 394 |; #X text 684 402 |; #X text 720 378 |; #X text 720 386 |; #X text 720 394 |; #X text 720 402 |; #X text 756 378 |; #X text 756 386 |; #X text 756 394 |; #X text 756 402 |; #X text 792 378 |; #X text 792 386 |; #X text 792 394 |; #X text 792 402 |; #X text 828 378 |; #X text 828 386 |; #X text 828 394 |; #X text 828 402 |; #X text 768 322 + y; #X text 671 371 --+-----+-----+-----+-----+-----+--; #X text 864 378 |; #X text 864 386 |; #X text 864 394 |; #X text 864 402 |; #X text 684 416 |; #X text 684 424 |; #X text 684 432 |; #X text 684 440 |; #X text 720 416 |; #X text 720 424 |; #X text 720 432 |; #X text 720 440 |; #X text 756 416 |; #X text 756 424 |; #X text 756 432 |; #X text 756 440 |; #X text 792 416 |; #X text 792 424 |; #X text 792 432 |; #X text 792 440 |; #X text 828 416 |; #X text 828 424 |; #X text 828 432 |; #X text 828 440 |; #X text 671 409 --+-----+-----+-----+-----+-----+--; #X text 864 416 |; #X text 864 424 |; #X text 864 432 |; #X text 864 440 |; #X text 684 454 |; #X text 684 462 |; #X text 684 470 |; #X text 684 478 |; #X text 720 454 |; #X text 720 462 |; #X text 720 470 |; #X text 720 478 |; #X text 756 454 |; #X text 756 462 |; #X text 756 470 |; #X text 756 478 |; #X text 792 454 |; #X text 792 462 |; #X text 792 470 |; #X text 792 478 |; #X text 828 454 |; #X text 828 462 |; #X text 828 470 |; #X text 828 478 |; #X text 671 447 --+-----+-----+-----+-----+-----+--; #X text 864 454 |; #X text 864 462 |; #X text 864 470 |; #X text 864 478 |; #X text 684 492 |; #X text 684 500 |; #X text 684 508 |; #X text 684 516 |; #X text 720 492 |; #X text 720 500 |; #X text 720 508 |; #X text 720 516 |; #X text 756 492 |; #X text 756 500 |; #X text 756 508 |; #X text 756 516 |; #X text 792 492 |; #X text 792 500 |; #X text 792 508 |; #X text 792 516 |; #X text 828 492 |; #X text 828 500 |; #X text 828 508 |; #X text 828 516 |; #X text 671 485 --+-----+-----+-----+-----+-----+--; #X text 864 492 |; #X text 864 500 |; #X text 864 508 |; #X text 864 516 |; #X text 684 530 |; #X text 684 538 |; #X text 684 546 |; #X text 684 554 |; #X text 720 530 |; #X text 720 538 |; #X text 720 546 |; #X text 720 554 |; #X text 756 530 |; #X text 756 538 |; #X text 756 546 |; #X text 756 554 |; #X text 792 530 |; #X text 792 538 |; #X text 792 546 |; #X text 792 554 |; #X text 828 530 |; #X text 828 538 |; #X text 828 546 |; #X text 828 554 |; #X text 671 523 --+-----+-----+-----+-----+-----+--; #X text 864 530 |; #X text 864 538 |; #X text 864 546 |; #X text 864 554 |; #X text 671 561 --+-----+-----+-----+-----+-----+--; #X text 750 461 ___________________________; #X text 911 466 > + x; #X text 774 338 |; #X text 774 345 |; #X text 774 352 |; #X text 774 359 |; #X text 774 366 |; #X text 774 373 |; #X text 774 380 |; #X text 774 387 |; #X text 774 394 |; #X text 774 401 |; #X text 774 408 |; #X text 774 415 |; #X text 774 414 |; #X text 774 421 |; #X text 774 428 |; #X text 774 435 |; #X text 774 441 |; #X text 774 448 |; #X text 774 455 |; #X text 774 462 |; #X text 774 469 |; #X text 774 476 |; #X text 774 483 |; #X text 774 490 |; #X text 774 334 ^; #X text 799 474 e1_1; #X text 762 429 e1_2; #X text 728 474 e1_3; #X text 763 507 e1_4; #X text 835 474 e2_1; #X text 762 389 e2_2; #X text 692 474 e2_3; #X text 763 543 e2_4; #X text 800 429 e2_5; #X text 728 429 e2_8; #X text 728 505 e2_6; #X text 800 505 e2_7; #X text 767 474 d_1; #X text 799 246 d .. direct; #X text 794 258 e1 .. early 1; #X text 794 270 e2 .. early 2; #X text 793 345 mirror source rooms; #X msg 48 63 room_dim 20 10; #X text 564 6 renders the delay time \, the damping and the direction of direct \, early_1 and early_2 reflections in a cuboid room model (2 dimensional); #X connect 1 0 14 0; #X connect 1 0 17 0; #X connect 2 0 1 0; #X connect 3 0 1 0; #X connect 4 0 15 0; #X connect 5 0 4 0; #X connect 5 1 4 1; #X connect 6 0 4 0; #X connect 7 0 5 0; #X connect 9 0 16 0; #X connect 10 0 9 0; #X connect 10 1 9 1; #X connect 11 0 9 0; #X connect 12 0 10 0; #X connect 15 0 1 0; #X connect 16 0 1 0; #X connect 18 0 19 0; #X connect 19 0 20 0; #X connect 19 1 24 0; #X connect 19 2 41 0; #X connect 20 0 21 0; #X connect 20 1 22 0; #X connect 20 2 37 0; #X connect 24 0 27 0; #X connect 24 1 32 0; #X connect 24 2 38 0; #X connect 27 0 28 0; #X connect 27 1 29 0; #X connect 27 2 30 0; #X connect 27 3 31 0; #X connect 32 0 33 0; #X connect 32 1 34 0; #X connect 32 2 35 0; #X connect 32 3 36 0; #X connect 37 0 23 0; #X connect 38 0 25 0; #X connect 38 1 26 0; #X connect 38 2 39 0; #X connect 38 3 40 0; #X connect 41 0 60 0; #X connect 41 1 69 0; #X connect 41 2 50 0; #X connect 50 0 42 0; #X connect 50 1 43 0; #X connect 50 2 48 0; #X connect 50 3 49 0; #X connect 50 4 51 0; #X connect 50 5 52 0; #X connect 50 6 53 0; #X connect 50 7 54 0; #X connect 60 0 44 0; #X connect 60 1 45 0; #X connect 60 2 46 0; #X connect 60 3 47 0; #X connect 60 4 61 0; #X connect 60 5 62 0; #X connect 60 6 63 0; #X connect 60 7 64 0; #X connect 69 0 65 0; #X connect 69 1 66 0; #X connect 69 2 67 0; #X connect 69 3 68 0; #X connect 69 4 70 0; #X connect 69 5 71 0; #X connect 69 6 72 0; #X connect 69 7 73 0; #X connect 260 0 1 0; iem_utils-v0.0.20180206/iem_roomsim/cart2del_damp_3d-help.pd0000644000175000017500000003571112630366346023565 0ustar zmoelnigzmoelnig#N canvas 65 59 947 553 10; #X msg 28 87 sonic_speed 340; #X msg 36 108 r_ambi 1.4; #X obj 17 339 print; #X obj 65 340 s xxx; #X obj 307 27 r xxx; #X obj 307 49 route direct early1 early2; #X floatatom 307 520 5 0 0 0 - - -; #X floatatom 365 504 5 0 0 0 - - -; #X floatatom 423 487 5 0 0 0 - - -; #X floatatom 535 493 5 0 0 0 - - -; #X floatatom 555 512 5 0 0 0 - - -; #X floatatom 576 493 5 0 0 0 - - -; #X floatatom 596 512 5 0 0 0 - - -; #X obj 423 466 route 1; #X floatatom 318 270 5 0 0 0 - - -; #X floatatom 332 287 5 0 0 0 - - -; #X floatatom 347 304 5 0 0 0 - - -; #X floatatom 361 270 5 0 0 0 - - -; #X text 873 514 degree; #X text 659 495 ms; #X text 462 488 degree; #X text 344 520 ms; #X text 603 304 ms; #X floatatom 376 287 5 0 0 0 - - -; #X floatatom 390 304 5 0 0 0 - - -; #X floatatom 405 270 5 0 0 0 - - -; #X floatatom 419 287 5 0 0 0 - - -; #X text 15 7 cart2del_damp_3d; #X obj 17 314 cart2del_damp_3d; #X obj 172 261 t b f; #X floatatom 81 244 5 -20 20 0 - - -; #X floatatom 174 244 5 -20 20 0 - - -; #X obj 88 261 pack 0 0 0; #X obj 222 261 t b f; #X floatatom 224 244 5 0 30 0 - - -; #X text 147 224 m x m x m; #X obj 143 179 t b f; #X floatatom 52 162 5 -20 20 0 - - -; #X floatatom 145 162 5 -20 20 0 - - -; #X obj 59 179 pack 0 0 0; #X obj 193 179 t b f; #X floatatom 195 162 5 0 30 0 - - -; #X text 108 140 m x m x m; #X msg 88 282 src_xyz \$1 \$2 \$3; #X msg 59 200 head_xyz \$1 \$2 \$3; #X msg 17 66 room_dim 20 10 5; #X obj 322 72 route del damp index_theta_phi; #X obj 535 351 route del damp index_theta_phi; #X obj 307 445 route del damp index_theta_phi; #X obj 535 472 unpack 0 0 0 0 0 0; #X floatatom 617 493 5 0 0 0 - - -; #X floatatom 638 512 5 0 0 0 - - -; #X obj 753 398 route 1 2 3 4 5 6; #X floatatom 434 304 5 0 0 0 - - -; #X floatatom 448 270 5 0 0 0 - - -; #X floatatom 463 287 5 0 0 0 - - -; #X floatatom 477 304 5 0 0 0 - - -; #X floatatom 492 270 5 0 0 0 - - -; #X floatatom 506 287 5 0 0 0 - - -; #X floatatom 521 304 5 0 0 0 - - -; #X floatatom 535 270 5 0 0 0 - - -; #X floatatom 550 287 5 0 0 0 - - -; #X floatatom 565 304 5 0 0 0 - - -; #X obj 318 247 unpack 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0; #X obj 378 102 route 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18; #X text 90 404 IEM KUG; #X text 74 392 musil; #X text 104 392 @; #X text 110 392 iem.at; #X text 73 414 Graz \, Austria; #X text 25 381 (c) Thomas Musil 2000 - 2006; #X text 127 87 sonic speed in meter per second; #X text 111 108 minimum raduis in meter; #X text 118 68 room dimensions in meter; #X text 194 281 object coordinates; #X text 171 199 subject coordinates; #X text 594 658 |; #X text 594 666 |; #X text 594 674 |; #X text 594 682 |; #X text 630 658 |; #X text 630 666 |; #X text 630 674 |; #X text 630 682 |; #X text 666 658 |; #X text 666 666 |; #X text 666 674 |; #X text 666 682 |; #X text 702 658 |; #X text 702 666 |; #X text 702 674 |; #X text 702 682 |; #X text 738 658 |; #X text 738 666 |; #X text 738 674 |; #X text 738 682 |; #X text 678 602 + y; #X text 581 651 --+-----+-----+-----+-----+-----+--; #X text 774 658 |; #X text 774 666 |; #X text 774 674 |; #X text 774 682 |; #X text 594 696 |; #X text 594 704 |; #X text 594 712 |; #X text 594 720 |; #X text 630 696 |; #X text 630 704 |; #X text 630 712 |; #X text 630 720 |; #X text 666 696 |; #X text 666 704 |; #X text 666 712 |; #X text 666 720 |; #X text 702 696 |; #X text 702 704 |; #X text 702 712 |; #X text 702 720 |; #X text 738 696 |; #X text 738 704 |; #X text 738 712 |; #X text 738 720 |; #X text 581 689 --+-----+-----+-----+-----+-----+--; #X text 774 696 |; #X text 774 704 |; #X text 774 712 |; #X text 774 720 |; #X text 594 734 |; #X text 594 742 |; #X text 594 750 |; #X text 594 758 |; #X text 630 734 |; #X text 630 742 |; #X text 630 750 |; #X text 630 758 |; #X text 666 734 |; #X text 666 742 |; #X text 666 750 |; #X text 666 758 |; #X text 702 734 |; #X text 702 742 |; #X text 702 750 |; #X text 702 758 |; #X text 738 734 |; #X text 738 742 |; #X text 738 750 |; #X text 738 758 |; #X text 581 727 --+-----+-----+-----+-----+-----+--; #X text 774 734 |; #X text 774 742 |; #X text 774 750 |; #X text 774 758 |; #X text 594 772 |; #X text 594 780 |; #X text 594 788 |; #X text 594 796 |; #X text 630 772 |; #X text 630 780 |; #X text 630 788 |; #X text 630 796 |; #X text 666 772 |; #X text 666 780 |; #X text 666 788 |; #X text 666 796 |; #X text 702 772 |; #X text 702 780 |; #X text 702 788 |; #X text 702 796 |; #X text 738 772 |; #X text 738 780 |; #X text 738 788 |; #X text 738 796 |; #X text 581 765 --+-----+-----+-----+-----+-----+--; #X text 774 772 |; #X text 774 780 |; #X text 774 788 |; #X text 774 796 |; #X text 594 810 |; #X text 594 818 |; #X text 594 826 |; #X text 594 834 |; #X text 630 810 |; #X text 630 818 |; #X text 630 826 |; #X text 630 834 |; #X text 666 810 |; #X text 666 818 |; #X text 666 826 |; #X text 666 834 |; #X text 702 810 |; #X text 702 818 |; #X text 702 826 |; #X text 702 834 |; #X text 738 810 |; #X text 738 818 |; #X text 738 826 |; #X text 738 834 |; #X text 581 803 --+-----+-----+-----+-----+-----+--; #X text 774 810 |; #X text 774 818 |; #X text 774 826 |; #X text 774 834 |; #X text 581 841 --+-----+-----+-----+-----+-----+--; #X text 660 741 ___________________________; #X text 821 746 > + x; #X text 684 618 |; #X text 684 625 |; #X text 684 632 |; #X text 684 639 |; #X text 684 646 |; #X text 684 653 |; #X text 684 660 |; #X text 684 667 |; #X text 684 674 |; #X text 684 681 |; #X text 684 688 |; #X text 684 695 |; #X text 684 694 |; #X text 684 701 |; #X text 684 708 |; #X text 684 715 |; #X text 684 721 |; #X text 684 728 |; #X text 684 735 |; #X text 684 742 |; #X text 684 749 |; #X text 684 756 |; #X text 684 763 |; #X text 684 770 |; #X text 684 614 ^; #X text 709 754 e1_1; #X text 672 709 e1_2; #X text 745 754 e2_1; #X text 672 669 e2_2; #X text 677 758 d_1; #X text 239 738 d .. direct; #X text 234 750 e1 .. early 1; #X text 234 762 e2 .. early 2; #X text 710 630 mirror source rooms; #X text 400 504 linear rms; #X floatatom 545 397 5 0 0 0 - - -; #X floatatom 565 416 5 0 0 0 - - -; #X floatatom 586 397 5 0 0 0 - - -; #X floatatom 606 416 5 0 0 0 - - -; #X obj 545 376 unpack 0 0 0 0 0 0; #X floatatom 627 397 5 0 0 0 - - -; #X floatatom 648 416 5 0 0 0 - - -; #X text 665 396 linear rms; #X obj 753 420 unpack; #X floatatom 753 457 5 0 0 0 - - -; #X floatatom 761 440 5 0 0 0 - - -; #X obj 769 477 unpack; #X floatatom 769 514 5 0 0 0 - - -; #X floatatom 777 497 5 0 0 0 - - -; #X obj 785 420 unpack; #X floatatom 785 457 5 0 0 0 - - -; #X floatatom 793 440 5 0 0 0 - - -; #X obj 801 477 unpack; #X floatatom 801 514 5 0 0 0 - - -; #X floatatom 809 497 5 0 0 0 - - -; #X obj 817 420 unpack; #X floatatom 817 457 5 0 0 0 - - -; #X floatatom 825 440 5 0 0 0 - - -; #X obj 833 477 unpack; #X floatatom 833 514 5 0 0 0 - - -; #X floatatom 841 497 5 0 0 0 - - -; #X text 879 497 degree; #X text 857 456 degree; #X text 863 439 degree; #X text 694 456 elevation; #X text 706 440 azimuth; #X text 709 512 elevation; #X text 723 495 azimuth; #X floatatom 617 275 5 0 0 0 - - -; #X floatatom 631 292 5 0 0 0 - - -; #X floatatom 646 309 5 0 0 0 - - -; #X floatatom 660 275 5 0 0 0 - - -; #X floatatom 675 292 5 0 0 0 - - -; #X floatatom 689 309 5 0 0 0 - - -; #X floatatom 704 275 5 0 0 0 - - -; #X floatatom 718 292 5 0 0 0 - - -; #X floatatom 733 309 5 0 0 0 - - -; #X floatatom 747 275 5 0 0 0 - - -; #X floatatom 762 292 5 0 0 0 - - -; #X floatatom 776 309 5 0 0 0 - - -; #X floatatom 791 275 5 0 0 0 - - -; #X floatatom 805 292 5 0 0 0 - - -; #X floatatom 820 309 5 0 0 0 - - -; #X floatatom 834 275 5 0 0 0 - - -; #X floatatom 849 292 5 0 0 0 - - -; #X floatatom 864 309 5 0 0 0 - - -; #X obj 617 252 unpack 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0; #X text 872 273 linear rms; #X obj 378 124 unpack; #X floatatom 378 161 5 0 0 0 - - -; #X floatatom 386 144 5 0 0 0 - - -; #X obj 410 124 unpack; #X floatatom 410 161 5 0 0 0 - - -; #X floatatom 418 144 5 0 0 0 - - -; #X obj 443 124 unpack; #X floatatom 443 161 5 0 0 0 - - -; #X floatatom 451 144 5 0 0 0 - - -; #X obj 394 181 unpack; #X floatatom 394 218 5 0 0 0 - - -; #X floatatom 402 201 5 0 0 0 - - -; #X obj 427 181 unpack; #X floatatom 427 218 5 0 0 0 - - -; #X floatatom 435 201 5 0 0 0 - - -; #X obj 459 181 unpack; #X floatatom 459 218 5 0 0 0 - - -; #X floatatom 467 201 5 0 0 0 - - -; #X obj 477 124 unpack; #X floatatom 477 161 5 0 0 0 - - -; #X floatatom 485 144 5 0 0 0 - - -; #X obj 509 124 unpack; #X floatatom 509 161 5 0 0 0 - - -; #X floatatom 517 144 5 0 0 0 - - -; #X obj 542 124 unpack; #X floatatom 542 161 5 0 0 0 - - -; #X floatatom 550 144 5 0 0 0 - - -; #X obj 493 181 unpack; #X floatatom 493 218 5 0 0 0 - - -; #X floatatom 501 201 5 0 0 0 - - -; #X obj 526 181 unpack; #X floatatom 526 218 5 0 0 0 - - -; #X floatatom 534 201 5 0 0 0 - - -; #X obj 558 181 unpack; #X floatatom 558 218 5 0 0 0 - - -; #X floatatom 566 201 5 0 0 0 - - -; #X obj 577 124 unpack; #X floatatom 577 161 5 0 0 0 - - -; #X floatatom 585 144 5 0 0 0 - - -; #X obj 609 124 unpack; #X floatatom 609 161 5 0 0 0 - - -; #X floatatom 617 144 5 0 0 0 - - -; #X obj 642 124 unpack; #X floatatom 642 161 5 0 0 0 - - -; #X floatatom 650 144 5 0 0 0 - - -; #X obj 593 181 unpack; #X floatatom 593 218 5 0 0 0 - - -; #X floatatom 601 201 5 0 0 0 - - -; #X obj 626 181 unpack; #X floatatom 626 218 5 0 0 0 - - -; #X floatatom 634 201 5 0 0 0 - - -; #X obj 658 181 unpack; #X floatatom 658 218 5 0 0 0 - - -; #X floatatom 666 201 5 0 0 0 - - -; #X text 694 218 degree; #X text 700 201 degree; #X text 678 160 degree; #X text 684 143 degree; #X text 319 160 elevation; #X text 331 144 azimuth; #X text 334 216 elevation; #X text 348 199 azimuth; #X text 564 6 renders the delay time \, the damping and the direction of direct \, early_1 and early_2 reflections in a cuboid room model (3 dimensional); #X text 679 746 (; #X text 689 746 ); #X text 684 741 -; #X text 684 751 -; #X text 687 740 .; #X text 682 740 .; #X text 682 748 .; #X text 687 748 .; #X text 685 744 .; #X text 684 744 .; #X text 684 745 .; #X text 685 745 .; #X text 685 743 .; #X text 684 743 .; #X text 689 737 +z; #X text 683 743 .; #X text 683 744 .; #X text 683 745 .; #X text 72 500 e2_3; #X text 74 560 e1_3; #X text 107 560 e2_8; #X text 74 543 e2_9; #X text 36 562 e2_17; #X text 74 579 e2_18; #X text 77 651 d_1; #X text 110 651 e1_1; #X text 77 634 e1_2; #X text 77 670 e1_5; #X text 39 653 e1_4; #X text 143 650 e2_1; #X text 75 619 e2_2; #X text 8 653 e2_4; #X text 78 685 e2_5; #X text 110 633 e2_7; #X text 36 670 e2_10; #X text 108 669 e2_13; #X text 37 636 e2_16; #X text 494 638 z-axe shows out of the display; #X text 78 745 e1_6; #X text 40 747 e2_11; #X text 78 764 e2_12; #X text 111 745 e2_14; #X text 78 728 e2_15; #X text 82 808 e2_6; #X text 635 708 e2_16; #X text 710 709 e2_7; #X text 638 754 e1_4; #X text 601 754 e2_4; #X text 635 786 e2_10; #X text 673 787 e1_5; #X text 708 786 e2_13; #X text 673 823 e2_5; #X text 70 851 bottom (-z); #X text 69 463 top (+z); #X text 489 656 shows only; #X text 487 676 the x/y-plane; #X text 52 449 mirror source rooms (3D); #X connect 0 0 28 0; #X connect 1 0 28 0; #X connect 4 0 5 0; #X connect 5 0 48 0; #X connect 5 1 47 0; #X connect 5 2 46 0; #X connect 13 0 8 0; #X connect 28 0 2 0; #X connect 28 0 3 0; #X connect 29 0 32 0; #X connect 29 1 32 1; #X connect 30 0 32 0; #X connect 31 0 29 0; #X connect 32 0 43 0; #X connect 33 0 32 0; #X connect 33 1 32 2; #X connect 34 0 33 0; #X connect 36 0 39 0; #X connect 36 1 39 1; #X connect 37 0 39 0; #X connect 38 0 36 0; #X connect 39 0 44 0; #X connect 40 0 39 0; #X connect 40 1 39 2; #X connect 41 0 40 0; #X connect 43 0 28 0; #X connect 44 0 28 0; #X connect 45 0 28 0; #X connect 46 0 63 0; #X connect 46 1 291 0; #X connect 46 2 64 0; #X connect 47 0 49 0; #X connect 47 1 244 0; #X connect 47 2 52 0; #X connect 48 0 6 0; #X connect 48 1 7 0; #X connect 48 2 13 0; #X connect 49 0 9 0; #X connect 49 1 10 0; #X connect 49 2 11 0; #X connect 49 3 12 0; #X connect 49 4 50 0; #X connect 49 5 51 0; #X connect 52 0 248 0; #X connect 52 1 251 0; #X connect 52 2 254 0; #X connect 52 3 257 0; #X connect 52 4 260 0; #X connect 52 5 263 0; #X connect 63 0 14 0; #X connect 63 1 15 0; #X connect 63 2 16 0; #X connect 63 3 17 0; #X connect 63 4 23 0; #X connect 63 5 24 0; #X connect 63 6 25 0; #X connect 63 7 26 0; #X connect 63 8 53 0; #X connect 63 9 54 0; #X connect 63 10 55 0; #X connect 63 11 56 0; #X connect 63 12 57 0; #X connect 63 13 58 0; #X connect 63 14 59 0; #X connect 63 15 60 0; #X connect 63 16 61 0; #X connect 63 17 62 0; #X connect 64 0 293 0; #X connect 64 1 302 0; #X connect 64 2 296 0; #X connect 64 3 305 0; #X connect 64 4 299 0; #X connect 64 5 308 0; #X connect 64 6 311 0; #X connect 64 7 320 0; #X connect 64 8 314 0; #X connect 64 9 323 0; #X connect 64 10 317 0; #X connect 64 11 326 0; #X connect 64 12 329 0; #X connect 64 13 338 0; #X connect 64 14 332 0; #X connect 64 15 341 0; #X connect 64 16 335 0; #X connect 64 17 344 0; #X connect 244 0 240 0; #X connect 244 1 241 0; #X connect 244 2 242 0; #X connect 244 3 243 0; #X connect 244 4 245 0; #X connect 244 5 246 0; #X connect 248 0 249 0; #X connect 248 1 250 0; #X connect 251 0 252 0; #X connect 251 1 253 0; #X connect 254 0 255 0; #X connect 254 1 256 0; #X connect 257 0 258 0; #X connect 257 1 259 0; #X connect 260 0 261 0; #X connect 260 1 262 0; #X connect 263 0 264 0; #X connect 263 1 265 0; #X connect 291 0 273 0; #X connect 291 1 274 0; #X connect 291 2 275 0; #X connect 291 3 276 0; #X connect 291 4 277 0; #X connect 291 5 278 0; #X connect 291 6 279 0; #X connect 291 7 280 0; #X connect 291 8 281 0; #X connect 291 9 282 0; #X connect 291 10 283 0; #X connect 291 11 284 0; #X connect 291 12 285 0; #X connect 291 13 286 0; #X connect 291 14 287 0; #X connect 291 15 288 0; #X connect 291 16 289 0; #X connect 291 17 290 0; #X connect 293 0 294 0; #X connect 293 1 295 0; #X connect 296 0 297 0; #X connect 296 1 298 0; #X connect 299 0 300 0; #X connect 299 1 301 0; #X connect 302 0 303 0; #X connect 302 1 304 0; #X connect 305 0 306 0; #X connect 305 1 307 0; #X connect 308 0 309 0; #X connect 308 1 310 0; #X connect 311 0 312 0; #X connect 311 1 313 0; #X connect 314 0 315 0; #X connect 314 1 316 0; #X connect 317 0 318 0; #X connect 317 1 319 0; #X connect 320 0 321 0; #X connect 320 1 322 0; #X connect 323 0 324 0; #X connect 323 1 325 0; #X connect 326 0 327 0; #X connect 326 1 328 0; #X connect 329 0 330 0; #X connect 329 1 331 0; #X connect 332 0 333 0; #X connect 332 1 334 0; #X connect 335 0 336 0; #X connect 335 1 337 0; #X connect 338 0 339 0; #X connect 338 1 340 0; #X connect 341 0 342 0; #X connect 341 1 343 0; #X connect 344 0 345 0; #X connect 344 1 346 0; iem_utils-v0.0.20180206/iem_spec2/0000755000175000017500000000000013236306220016527 5ustar zmoelnigzmoelnigiem_utils-v0.0.20180206/iem_spec2/spec2_shift~-help.pd0000644000175000017500000000262512630366347022433 0ustar zmoelnigzmoelnig#N canvas 10 8 548 293 10; #X obj 15 90 dsp; #X obj 15 67 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0 1 ; #X floatatom 15 131 5 0 0 0 - - -; #X floatatom 28 114 5 0 0 0 - - -; #N canvas 0 0 450 300 graph2 0; #X array array100 64 float 1; #A 0 -0.550001 -0.750001 -0.700001 -0.600001 -0.500001 -0.400001 -0.400001 -0.350001 -0.25 -0.2 -0.15 -0.1 -0.0500001 -0.0500001 3.72529e-008 0.0500001 0.0500001 0.1 0.1 0.15 0.2 0.2 0.250001 0.250001 0.300001 0.350001 0.350001 0.400001 0.500001 0.500001 0.516668 0.533334 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0; #X coords 0 1 63 -1 64 40 1; #X restore 436 66 graph; #X text 83 210 IEM KUG; #X text 67 198 musil; #X text 97 198 @; #X text 103 198 iem.at; #X text 66 220 Graz \, Austria; #X text 18 187 (c) Thomas Musil 2000 - 2006; #N canvas 0 0 450 300 graph2 0; #X array array101 64 float 0; #X coords 0 1 63 -1 64 40 1; #X restore 436 126 graph; #X obj 143 102 spec2_shift~ 10; #X obj 144 131 tabsend~ array101; #X obj 142 71 tabreceive~ array100; #X floatatom 105 51 5 -32 32 0 - - -; #X text 15 10 spec2_shift~; #X text 248 101 1.arg: shift width; #X text 136 6 shift a spectrum of (blocksize/2 + 1) to the left or right about n bins (+- blocksize/2); #X text 80 37 shift width; #X connect 0 0 2 0; #X connect 0 1 3 0; #X connect 1 0 0 0; #X connect 12 0 13 0; #X connect 14 0 12 0; #X connect 15 0 12 0; iem_utils-v0.0.20180206/iem_spec2/spec2_sub~-help.pd0000644000175000017500000000060112630366347022077 0ustar zmoelnigzmoelnig#N canvas 52 28 466 260 10; #X text 86 51 no arg; #X text 83 169 IEM KUG; #X text 67 157 musil; #X text 97 157 @; #X text 103 157 iem.at; #X text 66 179 Graz \, Austria; #X text 18 146 (c) Thomas Musil 2000 - 2006; #X text 183 49 like; #X obj 30 52 spec2-~; #X text 30 15 spec2-~; #X obj 234 50 -~; #X text 106 14 subtract 2 signal spectras with (blocksize/2 + 1) bins ; iem_utils-v0.0.20180206/iem_spec2/LICENSE.txt0000644000175000017500000000214512630366347020371 0ustar zmoelnigzmoelnigiem_spec2 - dynamic library for pd; calculates a lot of pd signal objects only with a vectorsize of blocksize/2 + 1 Copyright (C) 2000-2006 Thomas MUSIL [musil_at_iem.at] IEM - Institute of Electronic Music and Acoustics, Graz Inffeldgasse 10/3, 8010 Graz, Austria http://iem.at This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details ( GnuGPL.txt ). (e.g. http://www.gnu.org/copyleft/gpl.html) You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Graz, 15 Nov. 2006 Thomas Musiliem_utils-v0.0.20180206/iem_spec2/spec2_clip_min~-help.pd0000644000175000017500000000203312630366347023101 0ustar zmoelnigzmoelnig#N canvas 52 28 546 330 10; #X text 230 141 no arg; #X text 81 272 IEM KUG; #X text 65 260 musil; #X text 95 260 @; #X text 101 260 iem.at; #X text 64 282 Graz \, Austria; #X text 16 249 (c) Thomas Musil 2000 - 2006; #X text 351 143 like; #X obj 128 118 sig~; #X floatatom 128 98 5 0 0 0 - - -; #X obj 212 118 sig~; #X floatatom 212 98 5 0 0 0 - - -; #X obj 21 61 dsp; #X obj 21 38 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 1 1 ; #X floatatom 21 107 5 0 0 0 - - -; #X floatatom 34 86 5 0 0 0 - - -; #X text 120 28 iem_spec2 calculates only blocksize/2 + 1 samples of block; #X text 9 6 spec2_clip_min~; #X text 139 9 restrict a signal to lie higher than min limit; #X obj 401 144 max~; #X obj 128 141 spec2_clip_min~; #X obj 84 179 print~; #X obj 85 159 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X connect 8 0 20 0; #X connect 9 0 8 0; #X connect 10 0 20 1; #X connect 11 0 10 0; #X connect 12 0 14 0; #X connect 12 1 15 0; #X connect 13 0 12 0; #X connect 20 0 21 0; #X connect 22 0 21 0; iem_utils-v0.0.20180206/iem_spec2/src/0000755000175000017500000000000013236306220017316 5ustar zmoelnigzmoelnigiem_utils-v0.0.20180206/iem_spec2/src/spec2_mul_scalar~.c0000644000175000017500000000545112630366347023120 0ustar zmoelnigzmoelnig/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_spec2 written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2006 */ #include "m_pd.h" #include "iemlib.h" /* -------------------------- spec2_mul_scalar~ ------------------------------ */ static t_class *spec2_mul_scalar_tilde_class; typedef struct _spec2_mul_scalar_tilde { t_object x_obj; t_float x_f; t_float x_msi; } t_spec2_mul_scalar_tilde; static void spec2_mul_scalar_tilde_ft1(t_spec2_mul_scalar_tilde *x, t_floatarg f) { x->x_f = f; } static t_int *spec2_mul_scalar_tilde_perform(t_int *w) { t_float *io = (t_float *)(w[1]); t_spec2_mul_scalar_tilde *x = (t_spec2_mul_scalar_tilde *)(w[2]); int i, n = (t_int)(w[3]); t_float f = x->x_f; for(i=0; i<=n; i++) { io[i] *= f; } return(w+4); } static t_int *spec2_mul_scalar_tilde_perf16(t_int *w) { t_float *io = (t_float *)(w[1]); t_spec2_mul_scalar_tilde *x = (t_spec2_mul_scalar_tilde *)(w[2]); int n = (t_int)(w[3]); t_float f = x->x_f; while(n) { io[0] *= f; io[1] *= f; io[2] *= f; io[3] *= f; io[4] *= f; io[5] *= f; io[6] *= f; io[7] *= f; io[8] *= f; io[9] *= f; io[10] *= f; io[11] *= f; io[12] *= f; io[13] *= f; io[14] *= f; io[15] *= f; io += 16; n -= 16; } io[0] *= f; return(w+4); } static void spec2_mul_scalar_tilde_dsp(t_spec2_mul_scalar_tilde *x, t_signal **sp) { int n = (sp[0]->s_n)/2; if(n&15) dsp_add(spec2_mul_scalar_tilde_perform, 3, sp[0]->s_vec, x, n); else dsp_add(spec2_mul_scalar_tilde_perf16, 3, sp[0]->s_vec, x, n); } static void *spec2_mul_scalar_tilde_new(t_floatarg f) { t_spec2_mul_scalar_tilde *x = (t_spec2_mul_scalar_tilde *)pd_new(spec2_mul_scalar_tilde_class); inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_float, gensym("ft1")); outlet_new(&x->x_obj, &s_signal); x->x_f = f; x->x_msi = 0.0f; return (x); } static void spec2_mul_scalar_tilde_free(t_spec2_mul_scalar_tilde *x) { } void spec2_mul_scalar_tilde_setup(void) { spec2_mul_scalar_tilde_class = class_new(gensym("spec2_mul_scalar~"), (t_newmethod)spec2_mul_scalar_tilde_new, (t_method)spec2_mul_scalar_tilde_free, sizeof(t_spec2_mul_scalar_tilde), 0, A_DEFFLOAT, 0); class_addcreator((t_newmethod)spec2_mul_scalar_tilde_new, gensym("spec2*s~"), A_DEFFLOAT, 0); CLASS_MAINSIGNALIN(spec2_mul_scalar_tilde_class, t_spec2_mul_scalar_tilde, x_msi); class_addmethod(spec2_mul_scalar_tilde_class, (t_method)spec2_mul_scalar_tilde_ft1, gensym("ft1"), A_FLOAT, 0); class_addmethod(spec2_mul_scalar_tilde_class, (t_method)spec2_mul_scalar_tilde_dsp, gensym("dsp"), 0); // class_sethelpsymbol(spec2_mul_scalar_tilde_class, gensym("iemhelp2/spec2_mul_scalar~-help")); } iem_utils-v0.0.20180206/iem_spec2/src/spec2_clip_min~.c0000644000175000017500000000713512630366347022571 0ustar zmoelnigzmoelnig/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_spec2 written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2006 */ #include "m_pd.h" #include "iemlib.h" /* -------------------------- spec2_clip_min~ ------------------------------ */ static t_class *spec2_clip_min_tilde_class; typedef struct _spec2_clip_min_tilde { t_object x_obj; t_float x_msi; } t_spec2_clip_min_tilde; static t_int *spec2_clip_min_tilde_perform(t_int *w) { t_float *in = (t_float *)(w[1]); t_float *min = (t_float *)(w[2]); t_float *out = (t_float *)(w[3]); int i, n = (t_int)(w[4]); for(i=0; i<=n; i++) { if(in[i] < min[i]) out[i] = min[i]; else out[i] = in[i]; } return(w+5); } static t_int *spec2_clip_min_tilde_perf16(t_int *w) { t_float *in = (t_float *)(w[1]); t_float *min = (t_float *)(w[2]); t_float *out = (t_float *)(w[3]); int n = (t_int)(w[4]); while(n) { if(in[0] < min[0]) out[0] = min[0]; else out[0] = in[0]; if(in[1] < min[1]) out[1] = min[1]; else out[1] = in[1]; if(in[2] < min[2]) out[2] = min[2]; else out[2] = in[2]; if(in[3] < min[3]) out[3] = min[3]; else out[3] = in[3]; if(in[4] < min[4]) out[4] = min[4]; else out[4] = in[4]; if(in[5] < min[5]) out[5] = min[5]; else out[5] = in[5]; if(in[6] < min[6]) out[6] = min[6]; else out[6] = in[6]; if(in[7] < min[7]) out[7] = min[7]; else out[7] = in[7]; if(in[8] < min[8]) out[8] = min[8]; else out[8] = in[8]; if(in[9] < min[9]) out[9] = min[9]; else out[9] = in[9]; if(in[10] < min[10]) out[10] = min[10]; else out[10] = in[10]; if(in[11] < min[11]) out[11] = min[11]; else out[11] = in[11]; if(in[12] < min[12]) out[12] = min[12]; else out[12] = in[12]; if(in[13] < min[13]) out[13] = min[13]; else out[13] = in[13]; if(in[14] < min[14]) out[14] = min[14]; else out[14] = in[14]; if(in[15] < min[15]) out[15] = min[15]; else out[15] = in[15]; in += 16; min += 16; out += 16; n -= 16; } if(in[0] < min[0]) out[0] = min[0]; else out[0] = in[0]; return(w+5); } static void spec2_clip_min_tilde_dsp(t_spec2_clip_min_tilde *x, t_signal **sp) { int n = (sp[0]->s_n)/2; if(n&15) dsp_add(spec2_clip_min_tilde_perform, 4, sp[0]->s_vec, sp[1]->s_vec, sp[2]->s_vec, n); else dsp_add(spec2_clip_min_tilde_perf16, 4, sp[0]->s_vec, sp[1]->s_vec, sp[2]->s_vec, n); } static void *spec2_clip_min_tilde_new(void) { t_spec2_clip_min_tilde *x = (t_spec2_clip_min_tilde *)pd_new(spec2_clip_min_tilde_class); inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_signal, &s_signal); outlet_new(&x->x_obj, &s_signal); x->x_msi = 0.0f; return (x); } static void spec2_clip_min_tilde_free(t_spec2_clip_min_tilde *x) { } void spec2_clip_min_tilde_setup(void) { spec2_clip_min_tilde_class = class_new(gensym("spec2_clip_min~"), (t_newmethod)spec2_clip_min_tilde_new, (t_method)spec2_clip_min_tilde_free, sizeof(t_spec2_clip_min_tilde), 0, 0); CLASS_MAINSIGNALIN(spec2_clip_min_tilde_class, t_spec2_clip_min_tilde, x_msi); class_addmethod(spec2_clip_min_tilde_class, (t_method)spec2_clip_min_tilde_dsp, gensym("dsp"), 0); // class_sethelpsymbol(spec2_clip_min_tilde_class, gensym("iemhelp2/spec2_clip_min~-help")); } iem_utils-v0.0.20180206/iem_spec2/src/spec2_sub~.c0000644000175000017500000000520012630366347021557 0ustar zmoelnigzmoelnig/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_spec2 written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2006 */ #include "m_pd.h" #include "iemlib.h" /* -------------------------- spec2_sub~ ------------------------------ */ static t_class *spec2_sub_tilde_class; typedef struct _spec2_sub_tilde { t_object x_obj; t_float x_msi; } t_spec2_sub_tilde; static t_int *spec2_sub_tilde_perform(t_int *w) { t_float *in1 = (t_float *)(w[1]); t_float *in2 = (t_float *)(w[2]); t_float *out = (t_float *)(w[3]); int i, n = (t_int)(w[4]); for(i=0; i<=n; i++) { out[i] = in1[i] - in2[i]; } return(w+5); } static t_int *spec2_sub_tilde_perf16(t_int *w) { t_float *in1 = (t_float *)(w[1]); t_float *in2 = (t_float *)(w[2]); t_float *out = (t_float *)(w[3]); int n = (t_int)(w[4]); while(n) { out[0] = in1[0] - in2[0]; out[1] = in1[1] - in2[1]; out[2] = in1[2] - in2[2]; out[3] = in1[3] - in2[3]; out[4] = in1[4] - in2[4]; out[5] = in1[5] - in2[5]; out[6] = in1[6] - in2[6]; out[7] = in1[7] - in2[7]; out[8] = in1[8] - in2[8]; out[9] = in1[9] - in2[9]; out[10] = in1[10] - in2[10]; out[11] = in1[11] - in2[11]; out[12] = in1[12] - in2[12]; out[13] = in1[13] - in2[13]; out[14] = in1[14] - in2[14]; out[15] = in1[15] - in2[15]; in1 += 16; in2 += 16; out += 16; n -= 16; } out[0] = in1[0] - in2[0]; return(w+5); } static void spec2_sub_tilde_dsp(t_spec2_sub_tilde *x, t_signal **sp) { int n = (sp[0]->s_n)/2; if(n&15) dsp_add(spec2_sub_tilde_perform, 4, sp[0]->s_vec, sp[1]->s_vec, sp[2]->s_vec, n); else dsp_add(spec2_sub_tilde_perf16, 4, sp[0]->s_vec, sp[1]->s_vec, sp[2]->s_vec, n); } static void *spec2_sub_tilde_new(void) { t_spec2_sub_tilde *x = (t_spec2_sub_tilde *)pd_new(spec2_sub_tilde_class); inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_signal, &s_signal); outlet_new(&x->x_obj, &s_signal); x->x_msi = 0.0f; return (x); } static void spec2_sub_tilde_free(t_spec2_sub_tilde *x) { } void spec2_sub_tilde_setup(void) { spec2_sub_tilde_class = class_new(gensym("spec2_sub~"), (t_newmethod)spec2_sub_tilde_new, (t_method)spec2_sub_tilde_free, sizeof(t_spec2_sub_tilde), 0, 0); class_addcreator((t_newmethod)spec2_sub_tilde_new, gensym("spec2-~"), 0); CLASS_MAINSIGNALIN(spec2_sub_tilde_class, t_spec2_sub_tilde, x_msi); class_addmethod(spec2_sub_tilde_class, (t_method)spec2_sub_tilde_dsp, gensym("dsp"), 0); // class_sethelpsymbol(spec2_sub_tilde_class, gensym("iemhelp2/spec2_sub~-help")); } iem_utils-v0.0.20180206/iem_spec2/src/spec2_sum~.c0000644000175000017500000000512412630366347021577 0ustar zmoelnigzmoelnig/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_spec2 written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2006 */ #include "m_pd.h" #include "iemlib.h" /* ------------------------ spec2_sum_tilde~ ------------------------- */ static t_class *spec2_sum_tilde_class; typedef struct _spec2_sum_tilde { t_object x_obj; t_float x_msi; } t_spec2_sum_tilde; static t_int *spec2_sum_tilde_perform(t_int *w) { t_float *in = (t_float *)(w[1]); t_float *out = (t_float *)(w[2]); t_float sum = 0.0f; int n, hn; n = hn = w[3]; sum = *in++; while(n--) sum += (*in++)*2.0f; while(hn--) *out++ = sum; *out++ = sum; return(w+4); } static t_int *spec2_sum_tilde_perf16(t_int *w) { t_float *in = (t_float *)(w[1]); t_float *out = (t_float *)(w[2]); t_float sum=0.0f; int n, hn; n = hn = w[3]; sum = *in++; while(n) { sum += 2.0f*in[0]; sum += 2.0f*in[1]; sum += 2.0f*in[2]; sum += 2.0f*in[3]; sum += 2.0f*in[4]; sum += 2.0f*in[5]; sum += 2.0f*in[6]; sum += 2.0f*in[7]; sum += 2.0f*in[8]; sum += 2.0f*in[9]; sum += 2.0f*in[10]; sum += 2.0f*in[11]; sum += 2.0f*in[12]; sum += 2.0f*in[13]; sum += 2.0f*in[14]; sum += 2.0f*in[15]; in += 16; n -= 16; } while(hn) { out[0] = sum; out[1] = sum; out[2] = sum; out[3] = sum; out[4] = sum; out[5] = sum; out[6] = sum; out[7] = sum; out[8] = sum; out[9] = sum; out[10] = sum; out[11] = sum; out[12] = sum; out[13] = sum; out[14] = sum; out[15] = sum; out += 16; hn -= 16; } out[0] = sum; return(w+4); } static void spec2_sum_tilde_dsp(t_spec2_sum_tilde *x, t_signal **sp) { int n = (sp[0]->s_n)/2; if(n&15) dsp_add(spec2_sum_tilde_perform, 3, sp[0]->s_vec, sp[0]->s_vec, n); else dsp_add(spec2_sum_tilde_perf16, 3, sp[0]->s_vec, sp[0]->s_vec, n); } static void *spec2_sum_tilde_new(void) { t_spec2_sum_tilde *x = (t_spec2_sum_tilde *)pd_new(spec2_sum_tilde_class); outlet_new(&x->x_obj, &s_signal); x->x_msi = 0.0f; return (x); } void spec2_sum_tilde_setup(void) { spec2_sum_tilde_class = class_new(gensym("spec2_sum~"), (t_newmethod)spec2_sum_tilde_new, 0, sizeof(t_spec2_sum_tilde), 0, 0); CLASS_MAINSIGNALIN(spec2_sum_tilde_class, t_spec2_sum_tilde, x_msi); class_addmethod(spec2_sum_tilde_class, (t_method)spec2_sum_tilde_dsp, gensym("dsp"), 0); // class_sethelpsymbol(spec2_sum_tilde_class, gensym("iemhelp2/spec2_sum~-help")); } iem_utils-v0.0.20180206/iem_spec2/src/spec2_dbtopow~.c0000644000175000017500000000336312630366347022454 0ustar zmoelnigzmoelnig/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_spec2 written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2006 */ #include "m_pd.h" #include "iemlib.h" #include #define SPEC2LOGTEN 2.302585092994f /* ------------------------ spec2_dbtopow_tilde~ ------------------------- */ static t_class *spec2_dbtopow_tilde_class; typedef struct _spec2_dbtopow_tilde { t_object x_obj; t_float x_msi; } t_spec2_dbtopow_tilde; static t_int *spec2_dbtopow_tilde_perform(t_int *w) { t_float *in = (t_float *)(w[1]); t_float *out = (t_float *)(w[2]); int n = w[3]+1; for (; n--; in++, out++) { t_float f = *in; if(f <= 0.0f) *out = 0.0f; else { if(f > 870.0f) f = 870.0f; *out = exp((SPEC2LOGTEN * 0.1f) * (f-100.0f)); } } return(w+4); } static void spec2_dbtopow_tilde_dsp(t_spec2_dbtopow_tilde *x, t_signal **sp) { int n = (sp[0]->s_n)/2; dsp_add(spec2_dbtopow_tilde_perform, 3, sp[0]->s_vec, sp[0]->s_vec, n); } static void *spec2_dbtopow_tilde_new(void) { t_spec2_dbtopow_tilde *x = (t_spec2_dbtopow_tilde *)pd_new(spec2_dbtopow_tilde_class); outlet_new(&x->x_obj, &s_signal); x->x_msi = 0.0f; return (x); } void spec2_dbtopow_tilde_setup(void) { spec2_dbtopow_tilde_class = class_new(gensym("spec2_dbtopow~"), (t_newmethod)spec2_dbtopow_tilde_new, 0, sizeof(t_spec2_dbtopow_tilde), 0, 0); CLASS_MAINSIGNALIN(spec2_dbtopow_tilde_class, t_spec2_dbtopow_tilde, x_msi); class_addmethod(spec2_dbtopow_tilde_class, (t_method)spec2_dbtopow_tilde_dsp, gensym("dsp"), 0); // class_sethelpsymbol(spec2_dbtopow_tilde_class, gensym("iemhelp2/spec2_dbtopow~-help")); } iem_utils-v0.0.20180206/iem_spec2/src/makefile_d_ppc0000644000175000017500000000222312630366347022177 0ustar zmoelnigzmoelnigcurrent: all .SUFFIXES: .d_ppc PD_INSTALL_PATH = "/Applications/Pd.app/Contents/Resources" INCLUDE = -I. -I$(PD_INSTALL_PATH)/src CFLAGS =-DPD -O2 -Wall -W -Wshadow -Wstrict-prototypes \ -Wno-unused -Wno-parentheses -Wno-switch LFLAGS = -bundle -undefined suppress -flat_namespace # the sources SRC = spec2_1p1z_freq~.c \ spec2_1p1z_time~.c \ spec2_abs~.c \ spec2_add_scalar~.c \ spec2_add~.c \ spec2_block_delay~.c \ spec2_clip_max~.c \ spec2_clip_min~.c \ spec2_dbtopow~.c \ spec2_dbtorms~.c \ spec2_matrix_bundle_stat~.c \ spec2_mul_scalar~.c \ spec2_mul~.c \ spec2_powtodb~.c \ spec2_rmstodb~.c \ spec2_shift~.c \ spec2_sqrt~.c \ spec2_stretch~.c \ spec2_sub~.c \ spec2_sum~.c \ spec2_tab_conv~.c \ spec2_tabreceive_enable~.c \ spec2_tabreceive~.c \ iem_spec2.c TARGET = iem_spec2.d_ppc OBJ = $(SRC:.c=.o) # # ------------------ targets ------------------------------------ # clean: rm ../$(TARGET) rm *.o all: $(OBJ) @echo :: $(OBJ) $(CC) $(LFLAGS) -o $(TARGET) *.o strip -S -x $(TARGET) mv $(TARGET) .. $(OBJ) : %.o : %.c touch $*.c $(CC) $(CFLAGS) $(INCLUDE) -c -o $*.o $*.c iem_utils-v0.0.20180206/iem_spec2/src/spec2_mul~.c0000644000175000017500000000520012630366347021563 0ustar zmoelnigzmoelnig/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_spec2 written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2006 */ #include "m_pd.h" #include "iemlib.h" /* -------------------------- spec2_mul~ ------------------------------ */ static t_class *spec2_mul_tilde_class; typedef struct _spec2_mul_tilde { t_object x_obj; t_float x_msi; } t_spec2_mul_tilde; static t_int *spec2_mul_tilde_perform(t_int *w) { t_float *in1 = (t_float *)(w[1]); t_float *in2 = (t_float *)(w[2]); t_float *out = (t_float *)(w[3]); int i, n = (t_int)(w[4]); for(i=0; i<=n; i++) { out[i] = in1[i] * in2[i]; } return(w+5); } static t_int *spec2_mul_tilde_perf16(t_int *w) { t_float *in1 = (t_float *)(w[1]); t_float *in2 = (t_float *)(w[2]); t_float *out = (t_float *)(w[3]); int n = (t_int)(w[4]); while(n) { out[0] = in1[0] * in2[0]; out[1] = in1[1] * in2[1]; out[2] = in1[2] * in2[2]; out[3] = in1[3] * in2[3]; out[4] = in1[4] * in2[4]; out[5] = in1[5] * in2[5]; out[6] = in1[6] * in2[6]; out[7] = in1[7] * in2[7]; out[8] = in1[8] * in2[8]; out[9] = in1[9] * in2[9]; out[10] = in1[10] * in2[10]; out[11] = in1[11] * in2[11]; out[12] = in1[12] * in2[12]; out[13] = in1[13] * in2[13]; out[14] = in1[14] * in2[14]; out[15] = in1[15] * in2[15]; in1 += 16; in2 += 16; out += 16; n -= 16; } out[0] = in1[0] * in2[0]; return(w+5); } static void spec2_mul_tilde_dsp(t_spec2_mul_tilde *x, t_signal **sp) { int n = (sp[0]->s_n)/2; if(n&15) dsp_add(spec2_mul_tilde_perform, 4, sp[0]->s_vec, sp[1]->s_vec, sp[2]->s_vec, n); else dsp_add(spec2_mul_tilde_perf16, 4, sp[0]->s_vec, sp[1]->s_vec, sp[2]->s_vec, n); } static void *spec2_mul_tilde_new(void) { t_spec2_mul_tilde *x = (t_spec2_mul_tilde *)pd_new(spec2_mul_tilde_class); inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_signal, &s_signal); outlet_new(&x->x_obj, &s_signal); x->x_msi = 0.0f; return (x); } static void spec2_mul_tilde_free(t_spec2_mul_tilde *x) { } void spec2_mul_tilde_setup(void) { spec2_mul_tilde_class = class_new(gensym("spec2_mul~"), (t_newmethod)spec2_mul_tilde_new, (t_method)spec2_mul_tilde_free, sizeof(t_spec2_mul_tilde), 0, 0); class_addcreator((t_newmethod)spec2_mul_tilde_new, gensym("spec2*~"), 0); CLASS_MAINSIGNALIN(spec2_mul_tilde_class, t_spec2_mul_tilde, x_msi); class_addmethod(spec2_mul_tilde_class, (t_method)spec2_mul_tilde_dsp, gensym("dsp"), 0); // class_sethelpsymbol(spec2_mul_tilde_class, gensym("iemhelp2/spec2_mul~-help")); } iem_utils-v0.0.20180206/iem_spec2/src/makefile_vc9proj0000644000175000017500000000263012630366347022510 0ustar zmoelnigzmoelnigTARGET = iem_spec2 all: ..\$(TARGET).dll VIS_CPP_PATH = "$(PROGRAMFILES)\Microsoft Visual Studio 9.0\VC" VIS_SDK_PATH = "$(PROGRAMFILES)\Microsoft SDKs\Windows\v6.0A" PD_INST_PATH = "$(PROGRAMFILES)\pd" PD_WIN_INCLUDE_PATH = /I. /I..\..\include /I$(PD_INST_PATH)\src /I$(VIS_CPP_PATH)\include PD_WIN_C_FLAGS = /nologo /W3 /WX /DMSW /DNT /DPD /DWIN32 /DWINDOWS /DHAVE_G_CANVAS_H /Ox -D_CRT_SECURE_NO_WARNINGS PD_WIN_L_FLAGS = /nologo PD_WIN_LIB = /NODEFAULTLIB:libcmt /NODEFAULTLIB:oldnames /NODEFAULTLIB:kernel32 \ $(VIS_CPP_PATH)\lib\libcmt.lib \ $(VIS_CPP_PATH)\lib\oldnames.lib \ $(VIS_SDK_PATH)\lib\kernel32.lib \ $(PD_INST_PATH)\bin\pd.lib SRC = spec2_1p1z_freq~.c \ spec2_1p1z_time~.c \ spec2_abs~.c \ spec2_add_scalar~.c \ spec2_add~.c \ spec2_block_delay~.c \ spec2_clip_max~.c \ spec2_clip_min~.c \ spec2_dbtopow~.c \ spec2_dbtorms~.c \ spec2_matrix_bundle_stat~.c \ spec2_mul_scalar~.c \ spec2_mul~.c \ spec2_powtodb~.c \ spec2_rmstodb~.c \ spec2_shift~.c \ spec2_sqrt~.c \ spec2_stretch~.c \ spec2_sub~.c \ spec2_sum~.c \ spec2_tab_conv~.c \ spec2_tabreceive_enable~.c \ spec2_tabreceive~.c \ $(TARGET).c OBJ = $(SRC:.c=.obj) .c.obj: cl $(PD_WIN_C_FLAGS) $(PD_WIN_INCLUDE_PATH) /c $*.c ..\$(TARGET).dll: $(OBJ) link $(PD_WIN_L_FLAGS) /dll /export:$(TARGET)_setup \ /out:..\$(TARGET).dll $(OBJ) $(PD_WIN_LIB) clean: del *.obj iem_utils-v0.0.20180206/iem_spec2/src/spec2_1p1z_freq~.c0000644000175000017500000002452312630366347022607 0ustar zmoelnigzmoelnig/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_spec2 written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2006 */ #include "m_pd.h" #include "iemlib.h" /* -- spec2_1p1z_freq~ - filter the spectrum with a 1.order IIR twice, once forwards, once backwards --- */ typedef struct spec2_1p1z_freq_tilde { t_object x_obj; t_float x_a0; t_float x_a1; t_float x_b1; t_float *x_begmem; int x_blocksize; t_float x_msi; } t_spec2_1p1z_freq_tilde; t_class *spec2_1p1z_freq_tilde_class; static void spec2_1p1z_freq_tilde_list(t_spec2_1p1z_freq_tilde *x, t_symbol *s, int argc, t_atom *argv) { if((argc >= 3) && IS_A_FLOAT(argv,0) && IS_A_FLOAT(argv,1) && IS_A_FLOAT(argv,2)) { x->x_a0 = (t_float)atom_getfloatarg(0, argc, argv); x->x_a1 = (t_float)atom_getfloatarg(1, argc, argv); x->x_b1 = (t_float)atom_getfloatarg(2, argc, argv); } } static t_int *spec2_1p1z_freq_tilde_perform(t_int *w) { t_float *in = (t_float *)(w[1]); t_float *out = (t_float *)(w[2]); t_spec2_1p1z_freq_tilde *x = (t_spec2_1p1z_freq_tilde *)(w[3]); int i, m, n = (int)(w[4]); t_float a0 = x->x_a0; t_float a1 = x->x_a1; t_float b1 = x->x_b1; t_float *vec1, *vec2, *vec3; t_float in_old, out_old, f; vec2 = x->x_begmem + n + 1; vec1 = vec2 - 1; vec3 = vec2 + 2*n; *vec2++ = in[0]; for(i=1; ix_begmem + 2; in_old = 0.0f; out_old = 0.0f; for(i=0; ix_begmem + 3*n - 2; in_old = 0.0f; out_old = 0.0f; for(i=0; ix_begmem + n + 1; for(i=0; i<=n; i++) { out[i] = *vec2++; } return(w+5); } static t_int *spec2_1p1z_freq_tilde_perf16(t_int *w) { t_float *in = (t_float *)(w[1]); t_float *out = (t_float *)(w[2]); t_spec2_1p1z_freq_tilde *x = (t_spec2_1p1z_freq_tilde *)(w[3]); int i, m, n = (int)(w[4]); t_float a0 = x->x_a0; t_float a1 = x->x_a1; t_float b1 = x->x_b1; t_float *vec1, *vec2, *vec3; t_float in_old, out_old, f; m = 3*n; vec2 = x->x_begmem + n + 1; vec1 = vec2; // vec3 = vec2 + 2*n + 2 - 2; vec3 = vec2 + 2*n; x->x_begmem[0] = 0.0f; x->x_begmem[m-1] = 0.0f; i = n; while(i) { f = in[0]; vec2[0] = f; vec1[0] = f; vec3[0] = f; f = in[1]; vec2[1] = f; vec1[-1] = f; vec3[-1] = f; f = in[2]; vec2[2] = f; vec1[-2] = f; vec3[-2] = f; f = in[3]; vec2[3] = f; vec1[-3] = f; vec3[-3] = f; f = in[4]; vec2[4] = f; vec1[-4] = f; vec3[-4] = f; f = in[5]; vec2[5] = f; vec1[-5] = f; vec3[-5] = f; f = in[6]; vec2[6] = f; vec1[-6] = f; vec3[-6] = f; f = in[7]; vec2[7] = f; vec1[-7] = f; vec3[-7] = f; f = in[8]; vec2[8] = f; vec1[-8] = f; vec3[-8] = f; f = in[9]; vec2[9] = f; vec1[-9] = f; vec3[-9] = f; f = in[10]; vec2[10] = f; vec1[-10] = f; vec3[-10] = f; f = in[11]; vec2[11] = f; vec1[-11] = f; vec3[-11] = f; f = in[12]; vec2[12] = f; vec1[-12] = f; vec3[-12] = f; f = in[13]; vec2[13] = f; vec1[-13] = f; vec3[-13] = f; f = in[14]; vec2[14] = f; vec1[-14] = f; vec3[-14] = f; f = in[15]; vec2[15] = f; vec1[-15] = f; vec3[-15] = f; in += 16; vec1 -= 16; vec2 += 16; vec3 -= 16; i -= 16; } f = in[0]; vec2[0] = f; vec1[0] = f; vec3[0] = f; vec2 = x->x_begmem; in_old = 0.0f; out_old = 0.0f; i = m; while(i) { f = vec2[0]; out_old = a0*f + a1*in_old + b1*out_old; in_old = f; vec2[0] = out_old; f = vec2[1]; out_old = a0*f + a1*in_old + b1*out_old; in_old = f; vec2[1] = out_old; f = vec2[2]; out_old = a0*f + a1*in_old + b1*out_old; in_old = f; vec2[2] = out_old; f = vec2[3]; out_old = a0*f + a1*in_old + b1*out_old; in_old = f; vec2[3] = out_old; f = vec2[4]; out_old = a0*f + a1*in_old + b1*out_old; in_old = f; vec2[4] = out_old; f = vec2[5]; out_old = a0*f + a1*in_old + b1*out_old; in_old = f; vec2[5] = out_old; f = vec2[6]; out_old = a0*f + a1*in_old + b1*out_old; in_old = f; vec2[6] = out_old; f = vec2[7]; out_old = a0*f + a1*in_old + b1*out_old; in_old = f; vec2[7] = out_old; f = vec2[8]; out_old = a0*f + a1*in_old + b1*out_old; in_old = f; vec2[8] = out_old; f = vec2[9]; out_old = a0*f + a1*in_old + b1*out_old; in_old = f; vec2[9] = out_old; f = vec2[10]; out_old = a0*f + a1*in_old + b1*out_old; in_old = f; vec2[10] = out_old; f = vec2[11]; out_old = a0*f + a1*in_old + b1*out_old; in_old = f; vec2[11] = out_old; f = vec2[12]; out_old = a0*f + a1*in_old + b1*out_old; in_old = f; vec2[12] = out_old; f = vec2[13]; out_old = a0*f + a1*in_old + b1*out_old; in_old = f; vec2[13] = out_old; f = vec2[14]; out_old = a0*f + a1*in_old + b1*out_old; in_old = f; vec2[14] = out_old; f = vec2[15]; out_old = a0*f + a1*in_old + b1*out_old; in_old = f; vec2[15] = out_old; vec2 += 16; i -= 16; } f = vec2[0]; out_old = a0*f + a1*in_old + b1*out_old; in_old = f; vec2[0] = out_old; f = vec2[1]; out_old = a0*f + a1*in_old + b1*out_old; in_old = f; vec2[1] = out_old; f = vec2[2]; out_old = a0*f + a1*in_old + b1*out_old; in_old = f; vec2[2] = out_old; // vec2 = x->x_begmem + 3*n - 1 + 3; vec2 = x->x_begmem + 3*n + 2; in_old = 0.0f; out_old = 0.0f; for(i=0; ix_begmem + n + 1; i = n; while(i) { out[0] = vec2[0]; out[1] = vec2[1]; out[2] = vec2[2]; out[3] = vec2[3]; out[4] = vec2[4]; out[5] = vec2[5]; out[6] = vec2[6]; out[7] = vec2[7]; out[8] = vec2[8]; out[9] = vec2[9]; out[10] = vec2[10]; out[11] = vec2[11]; out[12] = vec2[12]; out[13] = vec2[13]; out[14] = vec2[14]; out[15] = vec2[15]; vec2 += 16; out += 16; i -= 16; } out[0] = vec2[0]; return(w+5); } static void spec2_1p1z_freq_tilde_dsp(t_spec2_1p1z_freq_tilde *x, t_signal **sp) { int n = (sp[0]->s_n)/2; if(!x->x_blocksize) { x->x_begmem = (t_float *)getbytes(3*(n+1)*sizeof(t_float)); x->x_blocksize = n; } else if(x->x_blocksize != n) { x->x_begmem = (t_float *)resizebytes(x->x_begmem, 3*(x->x_blocksize+1)*sizeof(t_float), 3*(n+1)*sizeof(t_float)); x->x_blocksize = n; } if(n&15) dsp_add(spec2_1p1z_freq_tilde_perform, 4, sp[0]->s_vec, sp[1]->s_vec, x, n); else dsp_add(spec2_1p1z_freq_tilde_perform, 4, sp[0]->s_vec, sp[1]->s_vec, x, n); } static void spec2_1p1z_freq_tilde_free(t_spec2_1p1z_freq_tilde *x) { if(x->x_begmem) freebytes(x->x_begmem, 3*(x->x_blocksize+1)*sizeof(t_float)); } static void *spec2_1p1z_freq_tilde_new(t_symbol *s, int argc, t_atom *argv) { t_spec2_1p1z_freq_tilde *x = (t_spec2_1p1z_freq_tilde *)pd_new(spec2_1p1z_freq_tilde_class); outlet_new(&x->x_obj, &s_signal); x->x_blocksize = 0; x->x_begmem = (t_float *)0; if(argc >= 3) spec2_1p1z_freq_tilde_list(x, s, argc, argv); else { x->x_a0 = 1.0f; x->x_a1 = 0.0f; x->x_b1 = 0.0f; } x->x_msi = 0.0f; return (x); } void spec2_1p1z_freq_tilde_setup(void) { spec2_1p1z_freq_tilde_class = class_new(gensym("spec2_1p1z_freq~"), (t_newmethod)spec2_1p1z_freq_tilde_new, (t_method)spec2_1p1z_freq_tilde_free, sizeof(t_spec2_1p1z_freq_tilde), 0, A_GIMME, 0); CLASS_MAINSIGNALIN(spec2_1p1z_freq_tilde_class, t_spec2_1p1z_freq_tilde, x_msi); class_addmethod(spec2_1p1z_freq_tilde_class, (t_method)spec2_1p1z_freq_tilde_dsp, gensym("dsp"), 0); class_addlist(spec2_1p1z_freq_tilde_class, (t_method)spec2_1p1z_freq_tilde_list); // class_sethelpsymbol(spec2_1p1z_freq_tilde_class, gensym("iemhelp2/spec2_1p1z_freq~-help")); } iem_utils-v0.0.20180206/iem_spec2/src/spec2_matrix_bundle_stat~.c0000644000175000017500000001712612630366347024670 0ustar zmoelnigzmoelnig/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_spec2 written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2006 */ #include "m_pd.h" #include "iemlib.h" /* ---------- spec2_matrix_bundle_stat~ - signal matrix multiplication object with message matrix-coeff. ----------- */ typedef struct spec2_matrix_bundle_stat_tilde { t_object x_obj; int *x_matbuf; t_float **x_io; t_float *x_outsumbuf; int x_outsumbufsize; int x_n_in; /* columns */ int x_n_out; /* rows */ t_float x_msi; } t_spec2_matrix_bundle_stat_tilde; t_class *spec2_matrix_bundle_stat_tilde_class; static void spec2_matrix_bundle_stat_tilde_element(t_spec2_matrix_bundle_stat_tilde *x, t_symbol *s, int argc, t_atom *argv) { int inindex, outindex; int *matrix = x->x_matbuf; if(argc < 2) { post("spec2_matrix_bundle_stat~ : bad list: output_row_index input_col_index !"); return; } outindex = (int)atom_getint(argv); argv++; inindex = (int)atom_getint(argv) - 1; if(inindex >= x->x_n_in) inindex = x->x_n_in - 1; if(inindex < 0) inindex = 0; if(outindex >= x->x_n_out) outindex = x->x_n_out; if(outindex < 0) outindex = 0; matrix[inindex] = outindex; } static void spec2_matrix_bundle_stat_tilde_list(t_spec2_matrix_bundle_stat_tilde *x, t_symbol *s, int argc, t_atom *argv) { int outindex, i, n=x->x_n_in; int *matrix = x->x_matbuf; if(argc < n) { post("spec2_matrix_bundle_stat~ : bad list: (number_of_input_cols = %d) * output_row_index !", n); return; } for(i=0; i= x->x_n_out) outindex = x->x_n_out; if(outindex < 0) outindex = 0; matrix[i] = outindex; } } static void spec2_matrix_bundle_stat_tilde_bundle(t_spec2_matrix_bundle_stat_tilde *x, t_symbol *s, int argc, t_atom *argv) { spec2_matrix_bundle_stat_tilde_list(x, &s_list, argc, argv); } /* the dsp thing */ static t_int *spec2_matrix_bundle_stat_tilde_perform(t_int *w) { t_spec2_matrix_bundle_stat_tilde *x = (t_spec2_matrix_bundle_stat_tilde *)(w[1]); int n = (int)(w[2]); t_float **io = x->x_io; t_float *outsum; int *mat = x->x_matbuf; int n_in = x->x_n_in; /* columns */ int n_out = x->x_n_out; /* rows */ t_float *in, *out; int i, j, thrw; outsum = x->x_outsumbuf; for(j=0; jx_outsumbuf + n*thrw; for(i=0; i<=n; i++) *outsum++ += *in++; } } outsum = x->x_outsumbuf; for(j=0; jx_io; t_float *outsum; int *mat = x->x_matbuf; int n_in = x->x_n_in; /* columns */ int n_out = x->x_n_out; /* rows */ t_float *in, *out; int i, j, thrw; for(j=0; jx_outsumbuf + j*(n+1); for(i=n; i; i -= 8, outsum += 8) { outsum[0] = 0.0f; outsum[1] = 0.0f; outsum[2] = 0.0f; outsum[3] = 0.0f; outsum[4] = 0.0f; outsum[5] = 0.0f; outsum[6] = 0.0f; outsum[7] = 0.0f; } outsum[0] = 0.0f; } for(j=0; jx_outsumbuf + (n+1)*thrw; for(i=n; i; i -= 8, outsum += 8, in += 8) { outsum[0] += in[0]; outsum[1] += in[1]; outsum[2] += in[2]; outsum[3] += in[3]; outsum[4] += in[4]; outsum[5] += in[5]; outsum[6] += in[6]; outsum[7] += in[7]; } outsum[0] += in[0]; } } for(j=0; jx_outsumbuf + j*(n+1); for (i=n; i; i -= 8, out += 8, outsum += 8) { out[0] = outsum[0]; out[1] = outsum[1]; out[2] = outsum[2]; out[3] = outsum[3]; out[4] = outsum[4]; out[5] = outsum[5]; out[6] = outsum[6]; out[7] = outsum[7]; } out[0] = outsum[0]; } return (w+3); } static void spec2_matrix_bundle_stat_tilde_dsp(t_spec2_matrix_bundle_stat_tilde *x, t_signal **sp) { int i, n=x->x_n_out*sp[0]->s_n/2; if(!x->x_outsumbuf) { x->x_outsumbufsize = n; x->x_outsumbuf = (t_float *)getbytes((x->x_outsumbufsize+x->x_n_out) * sizeof(t_float)); } else if(x->x_outsumbufsize != n) { x->x_outsumbuf = (t_float *)resizebytes(x->x_outsumbuf, (x->x_outsumbufsize+x->x_n_out)*sizeof(t_float), (n+x->x_n_out)*sizeof(t_float)); x->x_outsumbufsize = n; } n = x->x_n_in + x->x_n_out; for(i=0; ix_io[i] = sp[i]->s_vec; /*post("iovec_addr = %d", (unsigned int)x->x_io[i]);*/ } n = sp[0]->s_n/2; if(n&7) dsp_add(spec2_matrix_bundle_stat_tilde_perform, 2, x, n); else dsp_add(spec2_matrix_bundle_stat_tilde_perf8, 2, x, n); } /* setup/setdown things */ static void spec2_matrix_bundle_stat_tilde_free(t_spec2_matrix_bundle_stat_tilde *x) { freebytes(x->x_matbuf, x->x_n_in * sizeof(int)); freebytes(x->x_io, (x->x_n_in + x->x_n_out) * sizeof(t_float *)); if(x->x_outsumbuf) freebytes(x->x_outsumbuf, (x->x_outsumbufsize+1) * sizeof(t_float)); } static void *spec2_matrix_bundle_stat_tilde_new(t_symbol *s, int argc, t_atom *argv) { t_spec2_matrix_bundle_stat_tilde *x = (t_spec2_matrix_bundle_stat_tilde *)pd_new(spec2_matrix_bundle_stat_tilde_class); int i; switch (argc) { case 0: x->x_n_in = x->x_n_out = 1; break; case 1: x->x_n_in = x->x_n_out = (int)atom_getint(argv); break; default: x->x_n_in = (int)atom_getint(argv); x->x_n_out = (int)atom_getint(argv+1); break; } if(x->x_n_in < 1) x->x_n_in = 1; if(x->x_n_out < 1) x->x_n_out = 1; i = x->x_n_in - 1; while(i--) inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_signal, &s_signal); i = x->x_n_out; while(i--) outlet_new(&x->x_obj, &s_signal); x->x_msi = 0; x->x_outsumbuf = (t_float *)0; x->x_outsumbufsize = 0; x->x_matbuf = (int *)getbytes(x->x_n_in * sizeof(int)); x->x_io = (t_float **)getbytes((x->x_n_in + x->x_n_out) * sizeof(t_float *)); return (x); } void spec2_matrix_bundle_stat_tilde_setup(void) { spec2_matrix_bundle_stat_tilde_class = class_new(gensym("spec2_matrix_bundle_stat~"), (t_newmethod)spec2_matrix_bundle_stat_tilde_new, (t_method)spec2_matrix_bundle_stat_tilde_free, sizeof(t_spec2_matrix_bundle_stat_tilde), 0, A_GIMME, 0); CLASS_MAINSIGNALIN(spec2_matrix_bundle_stat_tilde_class, t_spec2_matrix_bundle_stat_tilde, x_msi); class_addmethod(spec2_matrix_bundle_stat_tilde_class, (t_method)spec2_matrix_bundle_stat_tilde_dsp, gensym("dsp"), 0); class_addlist(spec2_matrix_bundle_stat_tilde_class, (t_method)spec2_matrix_bundle_stat_tilde_list); class_addmethod(spec2_matrix_bundle_stat_tilde_class, (t_method)spec2_matrix_bundle_stat_tilde_element, gensym("element"), A_GIMME, 0); class_addmethod(spec2_matrix_bundle_stat_tilde_class, (t_method)spec2_matrix_bundle_stat_tilde_bundle, gensym("bundle"), A_GIMME, 0); // class_sethelpsymbol(spec2_matrix_bundle_stat_tilde_class, gensym("iemhelp2/spec2_matrix_bundle_stat~-help")); } iem_utils-v0.0.20180206/iem_spec2/src/VC7/0000755000175000017500000000000012630366347017732 5ustar zmoelnigzmoelnigiem_utils-v0.0.20180206/iem_spec2/src/VC7/iem_spec2.vcproj0000644000175000017500000000243112630366347023025 0ustar zmoelnigzmoelnig iem_utils-v0.0.20180206/iem_spec2/src/VC7/makefile_vc7proj0000644000175000017500000000262012630366347023104 0ustar zmoelnigzmoelnigTARGET = iem_spec2 all: ..\$(TARGET).dll VIS_CPP_PATH = "C:\Programme\Microsoft Visual Studio .NET 2003\Vc7" VIS_SDK_PATH = "C:\Programme\Microsoft Visual Studio .NET 2003\Vc7\PlatformSDK" PD_INST_PATH = "C:\Programme\pd-0.42-5" PD_WIN_INCLUDE_PATH = /I. /I$(PD_INST_PATH)\src /I$(VIS_CPP_PATH)\include PD_WIN_C_FLAGS = /nologo /W3 /WX /DMSW /DNT /DPD /DWIN32 /DWINDOWS /Ox -D_CRT_SECURE_NO_WARNINGS PD_WIN_L_FLAGS = /nologo PD_WIN_LIB = /NODEFAULTLIB:libcmt /NODEFAULTLIB:oldnames /NODEFAULTLIB:kernel32 \ $(VIS_CPP_PATH)\lib\libcmt.lib \ $(VIS_CPP_PATH)\lib\oldnames.lib \ $(VIS_SDK_PATH)\lib\kernel32.lib \ $(PD_INST_PATH)\bin\pd.lib SRC = spec2_1p1z_freq~.c \ spec2_1p1z_time~.c \ spec2_abs~.c \ spec2_add_scalar~.c \ spec2_add~.c \ spec2_block_delay~.c \ spec2_clip_max~.c \ spec2_clip_min~.c \ spec2_dbtopow~.c \ spec2_dbtorms~.c \ spec2_matrix_bundle_stat~.c \ spec2_mul_scalar~.c \ spec2_mul~.c \ spec2_powtodb~.c \ spec2_rmstodb~.c \ spec2_shift~.c \ spec2_sqrt~.c \ spec2_stretch~.c \ spec2_sub~.c \ spec2_sum~.c \ spec2_tab_conv~.c \ spec2_tabreceive_enable~.c \ spec2_tabreceive~.c \ iem_spec2.c OBJ = $(SRC:.c=.obj) .c.obj: cl $(PD_WIN_C_FLAGS) $(PD_WIN_INCLUDE_PATH) /c $*.c ..\$(TARGET).dll: $(OBJ) link $(PD_WIN_L_FLAGS) /dll /export:$(TARGET)_setup \ /out:..\$(TARGET).dll $(OBJ) $(PD_WIN_LIB) clean: del *.obj iem_utils-v0.0.20180206/iem_spec2/src/iem_spec2.h0000644000175000017500000000047312630366347021356 0ustar zmoelnigzmoelnig/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_spec2 written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2009 */ #ifndef __IEMSPEC2_H__ #define __IEMSPEC2_H__ #define DELLINE_DEF_VEC_SIZE 64 #endif iem_utils-v0.0.20180206/iem_spec2/src/spec2_tabreceive_enable~.c0000644000175000017500000001122412630366347024410 0ustar zmoelnigzmoelnig/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_spec2 written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2009 */ #include "m_pd.h" #include "iemlib.h" /* ------------------------ spec2_tabreceive_enable~ ------------------------- */ static t_class *spec2_tabreceive_enable_tilde_class; typedef struct _spec2_tabreceive_enable_tilde { t_object x_obj; iemarray_t *x_vec; t_symbol *x_arrayname; int x_enable; } t_spec2_tabreceive_enable_tilde; static void spec2_tabreceive_enable_tilde_symbol(t_spec2_tabreceive_enable_tilde *x, t_symbol *s) { x->x_arrayname = s; } static void spec2_tabreceive_enable_tilde_float(t_spec2_tabreceive_enable_tilde *x, t_floatarg f) { int i=(int)f; if(i) i = 1; x->x_enable = i; } static t_int *spec2_tabreceive_enable_tilde_perform(t_int *w) { t_spec2_tabreceive_enable_tilde *x = (t_spec2_tabreceive_enable_tilde *)(w[1]); t_float *out = (t_float *)(w[2]); int n = w[3]+1, i; iemarray_t *vec = x->x_vec; if(vec && x->x_enable) { for(i=0; ix_vec; if(vec && x->x_enable) { while(n) { out[0] = iemarray_getfloat(vec, 0); out[1] = iemarray_getfloat(vec, 1); out[2] = iemarray_getfloat(vec, 2); out[3] = iemarray_getfloat(vec, 3); out[4] = iemarray_getfloat(vec, 4); out[5] = iemarray_getfloat(vec, 5); out[6] = iemarray_getfloat(vec, 6); out[7] = iemarray_getfloat(vec, 7); out[8] = iemarray_getfloat(vec, 8); out[9] = iemarray_getfloat(vec, 9); out[10] = iemarray_getfloat(vec, 10); out[11] = iemarray_getfloat(vec, 11); out[12] = iemarray_getfloat(vec, 12); out[13] = iemarray_getfloat(vec, 13); out[14] = iemarray_getfloat(vec, 14); out[15] = iemarray_getfloat(vec, 15); vec += 16; out += 16; n -= 16; } out[0] = iemarray_getfloat(vec, 0); } else { while(n) { out[0] = 0.0f; out[1] = 0.0f; out[2] = 0.0f; out[3] = 0.0f; out[4] = 0.0f; out[5] = 0.0f; out[6] = 0.0f; out[7] = 0.0f; out[8] = 0.0f; out[9] = 0.0f; out[10] = 0.0f; out[11] = 0.0f; out[12] = 0.0f; out[13] = 0.0f; out[14] = 0.0f; out[15] = 0.0f; out += 16; n -= 16; } out[0] = 0.0f; } return(w+4); } static void spec2_tabreceive_enable_tilde_dsp(t_spec2_tabreceive_enable_tilde *x, t_signal **sp) { t_garray *a; int vecsize; if(!(a = (t_garray *)pd_findbyclass(x->x_arrayname, garray_class))) { if(*x->x_arrayname->s_name) error("spec2_tabreceive_enable~: %s: no such array", x->x_arrayname->s_name); } else if(!iemarray_getarray(a, &vecsize, &x->x_vec)) error("%s: bad template for spec2_tabreceive_enable~", x->x_arrayname->s_name); else { int n = sp[0]->s_n; if(n < vecsize) vecsize = n; vecsize /= 2; if(vecsize&15) dsp_add(spec2_tabreceive_enable_tilde_perform, 3, x, sp[0]->s_vec, vecsize); else dsp_add(spec2_tabreceive_enable_tilde_perf16, 3, x, sp[0]->s_vec, vecsize); } } static void *spec2_tabreceive_enable_tilde_new(t_symbol *s, int argc, t_atom *argv) { t_spec2_tabreceive_enable_tilde *x = (t_spec2_tabreceive_enable_tilde *)pd_new(spec2_tabreceive_enable_tilde_class); x->x_enable = 0; if((argc >= 1) && IS_A_SYMBOL(argv,0)) x->x_arrayname = atom_getsymbolarg(0, argc, argv); if((argc >= 2) && IS_A_FLOAT(argv,1)) x->x_enable = (int)atom_getintarg(1, argc, argv); if(x->x_enable) x->x_enable = 1; outlet_new(&x->x_obj, &s_signal); return (x); } void spec2_tabreceive_enable_tilde_setup(void) { spec2_tabreceive_enable_tilde_class = class_new(gensym("spec2_tabreceive_enable~"), (t_newmethod)spec2_tabreceive_enable_tilde_new, 0, sizeof(t_spec2_tabreceive_enable_tilde), 0, A_GIMME, 0); class_addmethod(spec2_tabreceive_enable_tilde_class, (t_method)spec2_tabreceive_enable_tilde_dsp, gensym("dsp"), 0); class_addsymbol(spec2_tabreceive_enable_tilde_class, (t_method)spec2_tabreceive_enable_tilde_symbol); class_addfloat(spec2_tabreceive_enable_tilde_class, (t_method)spec2_tabreceive_enable_tilde_float); // class_sethelpsymbol(spec2_tabreceive_enable_tilde_class, gensym("iemhelp2/spec2_tabreceive_enable~-help")); } iem_utils-v0.0.20180206/iem_spec2/src/makefile_linux0000644000175000017500000000233012630366347022250 0ustar zmoelnigzmoelnigcurrent: all .SUFFIXES: .pd_linux INCLUDE = -I. -I/usr/local/src/pd/src LDFLAGS = --export-dynamic -shared LIB = -ldl -lm -lpthread #select either the DBG and OPT compiler flags below: CFLAGS = -DPD -DUNIX -W -Werror -Wno-unused \ -Wno-parentheses -Wno-switch -O6 -funroll-loops -fomit-frame-pointer -fno-strict-aliasing \ -DDL_OPEN -fPIC SYSTEM = $(shell uname -m) # the sources SRC = spec2_1p1z_freq~.c \ spec2_1p1z_time~.c \ spec2_abs~.c \ spec2_add_scalar~.c \ spec2_add~.c \ spec2_block_delay~.c \ spec2_clip_max~.c \ spec2_clip_min~.c \ spec2_dbtopow~.c \ spec2_dbtorms~.c \ spec2_matrix_bundle_stat~.c \ spec2_mul_scalar~.c \ spec2_mul~.c \ spec2_powtodb~.c \ spec2_rmstodb~.c \ spec2_shift~.c \ spec2_sqrt~.c \ spec2_stretch~.c \ spec2_sub~.c \ spec2_sum~.c \ spec2_tab_conv~.c \ spec2_tabreceive_enable~.c \ spec2_tabreceive~.c \ iem_spec2.c TARGET = iem_spec2.pd_linux OBJ = $(SRC:.c=.o) # # ------------------ targets ------------------------------------ # clean: rm ../$(TARGET) rm *.o all: $(OBJ) @echo :: $(OBJ) $(LD) $(LDFLAGS) -o $(TARGET) *.o $(LIB) strip --strip-unneeded $(TARGET) mv $(TARGET) .. $(OBJ) : %.o : %.c $(CC) $(CFLAGS) $(INCLUDE) -c -o $*.o $*.c iem_utils-v0.0.20180206/iem_spec2/src/iem_spec2.vcproj0000644000175000017500000000357512630366347022440 0ustar zmoelnigzmoelnig iem_utils-v0.0.20180206/iem_spec2/src/iem_spec2.c0000644000175000017500000000451012630366347021345 0ustar zmoelnigzmoelnig/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_spec2 written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2009 */ #include "m_pd.h" #include "iemlib.h" static t_class *iem_spec2_class; static void *iem_spec2_new(void) { t_object *x = (t_object *)pd_new(iem_spec2_class); return (x); } void spec2_1p1z_freq_tilde_setup(void); void spec2_1p1z_time_tilde_setup(void); void spec2_abs_tilde_setup(void); void spec2_add_scalar_tilde_setup(void); void spec2_add_tilde_setup(void); void spec2_block_delay_tilde_setup(void); void spec2_clip_max_tilde_setup(void); void spec2_clip_min_tilde_setup(void); void spec2_dbtopow_tilde_setup(void); void spec2_dbtorms_tilde_setup(void); void spec2_matrix_bundle_stat_tilde_setup(void); void spec2_mul_scalar_tilde_setup(void); void spec2_mul_tilde_setup(void); void spec2_powtodb_tilde_setup(void); void spec2_rmstodb_tilde_setup(void); void spec2_shift_tilde_setup(void); void spec2_sqrt_tilde_setup(void); void spec2_stretch_tilde_setup(void); void spec2_sub_tilde_setup(void); void spec2_sum_tilde_setup(void); void spec2_tab_conv_tilde_setup(void); void spec2_tabreceive_enable_tilde_setup(void); void spec2_tabreceive_tilde_setup(void); /* ------------------------ setup routine ------------------------- */ void iem_spec2_setup(void) { iem_spec2_class = class_new(gensym("iem_spec2"), iem_spec2_new, 0, sizeof(t_object), CLASS_NOINLET, 0); spec2_1p1z_freq_tilde_setup(); spec2_1p1z_time_tilde_setup(); spec2_abs_tilde_setup(); spec2_add_scalar_tilde_setup(); spec2_add_tilde_setup(); spec2_block_delay_tilde_setup(); spec2_clip_max_tilde_setup(); spec2_clip_min_tilde_setup(); spec2_dbtopow_tilde_setup(); spec2_dbtorms_tilde_setup(); spec2_matrix_bundle_stat_tilde_setup(); spec2_mul_scalar_tilde_setup(); spec2_mul_tilde_setup(); spec2_powtodb_tilde_setup(); spec2_rmstodb_tilde_setup(); spec2_shift_tilde_setup(); spec2_sqrt_tilde_setup(); spec2_stretch_tilde_setup(); spec2_sub_tilde_setup(); spec2_sum_tilde_setup(); spec2_tab_conv_tilde_setup(); spec2_tabreceive_enable_tilde_setup(); spec2_tabreceive_tilde_setup(); post("iem_spec2 (R-1.18) library loaded! (c) Thomas Musil 01.2009"); post(" musil%ciem.at iem KUG Graz Austria", '@'); } iem_utils-v0.0.20180206/iem_spec2/src/VC6/0000755000175000017500000000000012630366347017731 5ustar zmoelnigzmoelnigiem_utils-v0.0.20180206/iem_spec2/src/VC6/iem_spec2.dsw0000644000175000017500000000107112630366347022315 0ustar zmoelnigzmoelnigMicrosoft Developer Studio Workspace File, Format Version 6.00 # WARNUNG: DIESE ARBEITSBEREICHSDATEI DARF NICHT BEARBEITET ODER GELÖSCHT WERDEN! ############################################################################### Project: "iem_spec2"=.\iem_spec2.dsp - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ }}} ############################################################################### Global: Package=<5> {{{ }}} Package=<3> {{{ }}} ############################################################################### iem_utils-v0.0.20180206/iem_spec2/src/VC6/makefile_win0000644000175000017500000000256112630366347022312 0ustar zmoelnigzmoelnig all: ..\iem_spec2.dll VIS_CPP_PATH = "C:\Programme\Microsoft Visual Studio\Vc98" PD_INST_PATH = "C:\Programme\pd" PD_WIN_INCLUDE_PATH = /I. /I$(PD_INST_PATH)\src /I$(VIS_CPP_PATH)\include PD_WIN_C_FLAGS = /nologo /W3 /WX /DMSW /DNT /DPD /DWIN32 /DWINDOWS /Ox -DPA_LITTLE_ENDIAN PD_WIN_L_FLAGS = /nologo PD_WIN_LIB = /NODEFAULTLIB:libc /NODEFAULTLIB:oldnames /NODEFAULTLIB:kernel /NODEFAULTLIB:uuid \ $(VIS_CPP_PATH)\lib\libc.lib \ $(VIS_CPP_PATH)\lib\oldnames.lib \ $(VIS_CPP_PATH)\lib\kernel32.lib \ $(VIS_CPP_PATH)\lib\wsock32.lib \ $(VIS_CPP_PATH)\lib\winmm.lib \ $(PD_INST_PATH)\bin\pd.lib SRC = spec2_1p1z_freq~.c \ spec2_1p1z_time~.c \ spec2_abs~.c \ spec2_add_scalar~.c \ spec2_add~.c \ spec2_block_delay~.c \ spec2_clip_max~.c \ spec2_clip_min~.c \ spec2_dbtopow~.c \ spec2_dbtorms~.c \ spec2_matrix_bundle_stat~.c \ spec2_mul_scalar~.c \ spec2_mul~.c \ spec2_powtodb~.c \ spec2_rmstodb~.c \ spec2_shift~.c \ spec2_sqrt~.c \ spec2_stretch~.c \ spec2_sub~.c \ spec2_sum~.c \ spec2_tab_conv~.c \ spec2_tabreceive_enable~.c \ spec2_tabreceive~.c \ iem_spec2.c OBJ = $(SRC:.c=.obj) .c.obj: cl $(PD_WIN_C_FLAGS) $(PD_WIN_INCLUDE_PATH) /c $*.c ..\iem_spec2.dll: $(OBJ) link $(PD_WIN_L_FLAGS) /dll /export:iem_spec2_setup \ /out:..\iem_spec2.dll $(OBJ) $(PD_WIN_LIB) clean: del *.obj iem_utils-v0.0.20180206/iem_spec2/src/VC6/iem_spec2.dsp0000644000175000017500000000500712630366347022311 0ustar zmoelnigzmoelnig# Microsoft Developer Studio Project File - Name="iem_spec2" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** NICHT BEARBEITEN ** # TARGTYPE "Win32 (x86) External Target" 0x0106 CFG=iem_spec2 - Win32 Debug !MESSAGE Dies ist kein gültiges Makefile. Zum Erstellen dieses Projekts mit NMAKE !MESSAGE verwenden Sie den Befehl "Makefile exportieren" und führen Sie den Befehl !MESSAGE !MESSAGE NMAKE /f "iem_spec2.mak". !MESSAGE !MESSAGE Sie können beim Ausführen von NMAKE eine Konfiguration angeben !MESSAGE durch Definieren des Makros CFG in der Befehlszeile. Zum Beispiel: !MESSAGE !MESSAGE NMAKE /f "iem_spec2.mak" CFG="iem_spec2 - Win32 Debug" !MESSAGE !MESSAGE Für die Konfiguration stehen zur Auswahl: !MESSAGE !MESSAGE "iem_spec2 - Win32 Release" (basierend auf "Win32 (x86) External Target") !MESSAGE "iem_spec2 - Win32 Debug" (basierend auf "Win32 (x86) External Target") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" !IF "$(CFG)" == "iem_spec2 - Win32 Release" # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "Release" # PROP BASE Intermediate_Dir "Release" # PROP BASE Cmd_Line "NMAKE /f makefile_win" # PROP BASE Rebuild_Opt "/a" # PROP BASE Target_File "makefile_win.exe" # PROP BASE Bsc_Name "makefile_win.bsc" # PROP BASE Target_Dir "" # PROP Use_Debug_Libraries 0 # PROP Output_Dir "Release" # PROP Intermediate_Dir "Release" # PROP Cmd_Line "NMAKE /f makefile_win" # PROP Rebuild_Opt "/a" # PROP Target_File "iem_spec2.exe" # PROP Bsc_Name "iem_spec2.bsc" # PROP Target_Dir "" !ELSEIF "$(CFG)" == "iem_spec2 - Win32 Debug" # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "Debug" # PROP BASE Intermediate_Dir "Debug" # PROP BASE Cmd_Line "NMAKE /f makefile_win" # PROP BASE Rebuild_Opt "/a" # PROP BASE Target_File "makefile_win.exe" # PROP BASE Bsc_Name "makefile_win.bsc" # PROP BASE Target_Dir "" # PROP Use_Debug_Libraries 1 # PROP Output_Dir "Debug" # PROP Intermediate_Dir "Debug" # PROP Cmd_Line "NMAKE /f makefile_win" # PROP Rebuild_Opt "/a" # PROP Target_File "iem_spec2.exe" # PROP Bsc_Name "iem_spec2.bsc" # PROP Target_Dir "" !ENDIF # Begin Target # Name "iem_spec2 - Win32 Release" # Name "iem_spec2 - Win32 Debug" !IF "$(CFG)" == "iem_spec2 - Win32 Release" !ELSEIF "$(CFG)" == "iem_spec2 - Win32 Debug" !ENDIF # Begin Source File SOURCE=.\makefile_win # End Source File # End Target # End Project iem_utils-v0.0.20180206/iem_spec2/src/iemlib.h0000644000175000017500000000762412630366347020756 0ustar zmoelnigzmoelnig/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iemlib written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2012 */ #ifndef __IEMLIB_H__ #define __IEMLIB_H__ #define IS_A_NULL(atom,index) ((atom+index)->a_type == A_NULL) #define IS_A_POINTER(atom,index) ((atom+index)->a_type == A_POINTER) #define IS_A_FLOAT(atom,index) ((atom+index)->a_type == A_FLOAT) #define IS_A_SYMBOL(atom,index) ((atom+index)->a_type == A_SYMBOL) #define IS_A_DOLLAR(atom,index) ((atom+index)->a_type == A_DOLLAR) #define IS_A_DOLLSYM(atom,index) ((atom+index)->a_type == A_DOLLSYM) #define IS_A_SEMI(atom,index) ((atom+index)->a_type == A_SEMI) #define IS_A_COMMA(atom,index) ((atom+index)->a_type == A_COMMA) #define SETNULL(atom) ((atom)->a_type = A_NULL) /* now miller's code starts : for 4 point interpolation for lookup tables for denormal floats */ #ifdef MSW int sys_noloadbang; //t_symbol *iemgui_key_sym=0; #include #else extern int sys_noloadbang; //extern t_symbol *iemgui_key_sym; #include #endif #define DEFDELVS 64 #define XTRASAMPS 4 #define SAMPBLK 4 #define UNITBIT32 1572864. /* 3*2^19; bit 32 has place value 1 */ /* machine-dependent definitions. These ifdefs really should have been by CPU type and not by operating system! */ #ifdef IRIX /* big-endian. Most significant byte is at low address in memory */ #define HIOFFSET 0 /* word offset to find MSB */ #define LOWOFFSET 1 /* word offset to find LSB */ #define int32 long /* a data type that has 32 bits */ #endif /* IRIX */ #ifdef MSW /* little-endian; most significant byte is at highest address */ #define HIOFFSET 1 #define LOWOFFSET 0 #define int32 long #endif /* MSW */ #if defined(__FreeBSD__) || defined(__APPLE__) || defined(__FreeBSD_kernel__) #include #endif #if defined(__linux__) || defined(__CYGWIN__) || defined(__GNU__) || defined(ANDROID) #include #endif #if defined(__unix__) || defined(__APPLE__) #if !defined(BYTE_ORDER) || !defined(LITTLE_ENDIAN) #error No byte order defined #endif #if BYTE_ORDER == LITTLE_ENDIAN #define HIOFFSET 1 #define LOWOFFSET 0 #else #define HIOFFSET 0 /* word offset to find MSB */ #define LOWOFFSET 1 /* word offset to find LSB */ #endif /* __BYTE_ORDER */ #include #define int32 int32_t #endif /* __unix__ or __APPLE__*/ union tabfudge_d { double tf_d; int32 tf_i[2]; }; union tabfudge_f { float tf_f; long tf_l; }; #if defined __i386__ || defined __x86_64__ #define IEM_DENORMAL(f) ((((*(unsigned int*)&(f))&0x60000000)==0) || \ (((*(unsigned int*)&(f))&0x60000000)==0x60000000)) /* more stringent test: anything not between 1e-19 and 1e19 in absolute val */ #else #define IEM_DENORMAL(f) 0 #endif /* on 64bit systems we cannot use garray_getfloatarray... */ #if ((defined PD_MAJOR_VERSION && defined PD_MINOR_VERSION) && (PD_MAJOR_VERSION > 0 || PD_MINOR_VERSION > 40)) # define iemarray_t t_word # define iemarray_getarray garray_getfloatwords # define iemarray_getfloat(pointer, index) (pointer[index].w_float) # define iemarray_setfloat(pointer, index, fvalue) (pointer[index].w_float = fvalue) #else # define iemarray_t t_float # define iemarray_getarray garray_getfloatarray # define iemarray_getfloat(pointer, index) (pointer[index]) # define iemarray_setfloat(pointer, index, fvalue) (pointer[index] = fvalue) #endif #endif iem_utils-v0.0.20180206/iem_spec2/src/spec2_add~.c0000644000175000017500000000520112630366347021517 0ustar zmoelnigzmoelnig/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_spec2 written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2006 */ #include "m_pd.h" #include "iemlib.h" /* -------------------------- spec2_add~ ------------------------------ */ static t_class *spec2_add_tilde_class; typedef struct _spec2_add_tilde { t_object x_obj; t_float x_msi; } t_spec2_add_tilde; static t_int *spec2_add_tilde_perform(t_int *w) { t_float *in1 = (t_float *)(w[1]); t_float *in2 = (t_float *)(w[2]); t_float *out = (t_float *)(w[3]); int i, n = (t_int)(w[4]); for(i=0; i<=n; i++) { out[i] = in1[i] + in2[i]; } return(w+5); } static t_int *spec2_add_tilde_perf16(t_int *w) { t_float *in1 = (t_float *)(w[1]); t_float *in2 = (t_float *)(w[2]); t_float *out = (t_float *)(w[3]); int n = (t_int)(w[4]); while(n) { out[0] = in1[0] + in2[0]; out[1] = in1[1] + in2[1]; out[2] = in1[2] + in2[2]; out[3] = in1[3] + in2[3]; out[4] = in1[4] + in2[4]; out[5] = in1[5] + in2[5]; out[6] = in1[6] + in2[6]; out[7] = in1[7] + in2[7]; out[8] = in1[8] + in2[8]; out[9] = in1[9] + in2[9]; out[10] = in1[10] + in2[10]; out[11] = in1[11] + in2[11]; out[12] = in1[12] + in2[12]; out[13] = in1[13] + in2[13]; out[14] = in1[14] + in2[14]; out[15] = in1[15] + in2[15]; in1 += 16; in2 += 16; out += 16; n -= 16; } out[0] = in1[0] + in2[0]; return(w+5); } static void spec2_add_tilde_dsp(t_spec2_add_tilde *x, t_signal **sp) { int n = (sp[0]->s_n)/2; if(n&15) dsp_add(spec2_add_tilde_perform, 4, sp[0]->s_vec, sp[1]->s_vec, sp[2]->s_vec, n); else dsp_add(spec2_add_tilde_perf16, 4, sp[0]->s_vec, sp[1]->s_vec, sp[2]->s_vec, n); } static void *spec2_add_tilde_new(void) { t_spec2_add_tilde *x = (t_spec2_add_tilde *)pd_new(spec2_add_tilde_class); inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_signal, &s_signal); outlet_new(&x->x_obj, &s_signal); x->x_msi = 0.0f; return (x); } static void spec2_add_tilde_free(t_spec2_add_tilde *x) { } void spec2_add_tilde_setup(void) { spec2_add_tilde_class = class_new(gensym("spec2_add~"), (t_newmethod)spec2_add_tilde_new, (t_method)spec2_add_tilde_free, sizeof(t_spec2_add_tilde), 0, 0); class_addcreator((t_newmethod)spec2_add_tilde_new, gensym("spec2+~"), 0); CLASS_MAINSIGNALIN(spec2_add_tilde_class, t_spec2_add_tilde, x_msi); class_addmethod(spec2_add_tilde_class, (t_method)spec2_add_tilde_dsp, gensym("dsp"), 0); // class_sethelpsymbol(spec2_add_tilde_class, gensym("iemhelp2/spec2_add~-help")); } iem_utils-v0.0.20180206/iem_spec2/src/spec2_powtodb~.c0000644000175000017500000000335612630366347022456 0ustar zmoelnigzmoelnig/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_spec2 written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2006 */ #include "m_pd.h" #include "iemlib.h" #include #define SPEC2LOGTEN 2.302585092994f /* ------------------------ spec2_powtodb_tilde~ ------------------------- */ static t_class *spec2_powtodb_tilde_class; typedef struct _spec2_powtodb_tilde { t_object x_obj; t_float x_msi; } t_spec2_powtodb_tilde; static t_int *spec2_powtodb_tilde_perform(t_int *w) { t_float *in = (t_float *)(w[1]); t_float *out = (t_float *)(w[2]); int n = w[3]+1; for(; n--; in++, out++) { t_float f = *in; if(f <= 0.0f) *out = 0.0f; else { t_float g = 100.0f + 10.0f/SPEC2LOGTEN * log(f); *out = (g < 0.0f ? 0.0f : g); } } return(w+4); } static void spec2_powtodb_tilde_dsp(t_spec2_powtodb_tilde *x, t_signal **sp) { int n = (sp[0]->s_n)/2; dsp_add(spec2_powtodb_tilde_perform, 3, sp[0]->s_vec, sp[0]->s_vec, n); } static void *spec2_powtodb_tilde_new(void) { t_spec2_powtodb_tilde *x = (t_spec2_powtodb_tilde *)pd_new(spec2_powtodb_tilde_class); outlet_new(&x->x_obj, &s_signal); x->x_msi = 0.0f; return (x); } void spec2_powtodb_tilde_setup(void) { spec2_powtodb_tilde_class = class_new(gensym("spec2_powtodb~"), (t_newmethod)spec2_powtodb_tilde_new, 0, sizeof(t_spec2_powtodb_tilde), 0, 0); CLASS_MAINSIGNALIN(spec2_powtodb_tilde_class, t_spec2_powtodb_tilde, x_msi); class_addmethod(spec2_powtodb_tilde_class, (t_method)spec2_powtodb_tilde_dsp, gensym("dsp"), 0); // class_sethelpsymbol(spec2_powtodb_tilde_class, gensym("iemhelp2/spec2_powtodb~-help")); } iem_utils-v0.0.20180206/iem_spec2/src/makefile_d_fat0000644000175000017500000000226112630366347022171 0ustar zmoelnigzmoelnigcurrent: all .SUFFIXES: .d_fat PD_INSTALL_PATH ?= "/Applications/Pd.app/Contents/Resources" INCLUDE = -I. -I$(PD_INSTALL_PATH)/src CFLAGS =-DPD -O2 -Wall -W -Wshadow -Wstrict-prototypes \ -Wno-unused -Wno-parentheses -Wno-switch LFLAGS = -bundle -undefined suppress -flat_namespace # the sources SRC = spec2_1p1z_freq~.c \ spec2_1p1z_time~.c \ spec2_abs~.c \ spec2_add_scalar~.c \ spec2_add~.c \ spec2_block_delay~.c \ spec2_clip_max~.c \ spec2_clip_min~.c \ spec2_dbtopow~.c \ spec2_dbtorms~.c \ spec2_matrix_bundle_stat~.c \ spec2_mul_scalar~.c \ spec2_mul~.c \ spec2_powtodb~.c \ spec2_rmstodb~.c \ spec2_shift~.c \ spec2_sqrt~.c \ spec2_stretch~.c \ spec2_sub~.c \ spec2_sum~.c \ spec2_tab_conv~.c \ spec2_tabreceive_enable~.c \ spec2_tabreceive~.c \ iem_spec2.c TARGET = iem_spec2.d_fat OBJ = $(SRC:.c=.o) # # ------------------ targets ------------------------------------ # clean: rm ../$(TARGET) rm *.o all: $(OBJ) @echo :: $(OBJ) $(CC) -arch i386 -arch ppc $(LFLAGS) -o $(TARGET) *.o strip -S -x $(TARGET) mv $(TARGET) .. $(OBJ) : %.o : %.c $(CC) -arch i386 -arch ppc $(CFLAGS) $(INCLUDE) -c -o $*.o $*.c iem_utils-v0.0.20180206/iem_spec2/src/spec2_rmstodb~.c0000644000175000017500000000335712630366347022453 0ustar zmoelnigzmoelnig/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_spec2 written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2006 */ #include "m_pd.h" #include "iemlib.h" #include #define SPEC2LOGTEN 2.302585092994f /* ------------------------ spec2_rmstodb_tilde~ ------------------------- */ static t_class *spec2_rmstodb_tilde_class; typedef struct _spec2_rmstodb_tilde { t_object x_obj; t_float x_msi; } t_spec2_rmstodb_tilde; static t_int *spec2_rmstodb_tilde_perform(t_int *w) { t_float *in = (t_float *)(w[1]); t_float *out = (t_float *)(w[2]); int n = w[3]+1; for(; n--; in++, out++) { t_float f = *in; if(f <= 0.0f) *out = 0.0f; else { t_float g = 100.0f + 20.0f/SPEC2LOGTEN * log(f); *out = (g < 0.0f ? 0.0f : g); } } return(w+4); } static void spec2_rmstodb_tilde_dsp(t_spec2_rmstodb_tilde *x, t_signal **sp) { int n = (sp[0]->s_n)/2; dsp_add(spec2_rmstodb_tilde_perform, 3, sp[0]->s_vec, sp[0]->s_vec, n); } static void *spec2_rmstodb_tilde_new(void) { t_spec2_rmstodb_tilde *x = (t_spec2_rmstodb_tilde *)pd_new(spec2_rmstodb_tilde_class); outlet_new(&x->x_obj, &s_signal); x->x_msi = 0.0f; return (x); } void spec2_rmstodb_tilde_setup(void) { spec2_rmstodb_tilde_class = class_new(gensym("spec2_rmstodb~"), (t_newmethod)spec2_rmstodb_tilde_new, 0, sizeof(t_spec2_rmstodb_tilde), 0, 0); CLASS_MAINSIGNALIN(spec2_rmstodb_tilde_class, t_spec2_rmstodb_tilde, x_msi); class_addmethod(spec2_rmstodb_tilde_class, (t_method)spec2_rmstodb_tilde_dsp, gensym("dsp"), 0); // class_sethelpsymbol(spec2_rmstodb_tilde_class, gensym("iemhelp2/spec2_rmstodb~-help")); } iem_utils-v0.0.20180206/iem_spec2/src/VC9/0000755000175000017500000000000012630366347017734 5ustar zmoelnigzmoelnigiem_utils-v0.0.20180206/iem_spec2/src/VC9/makefile_vc9proj0000644000175000017500000000257612630366347023122 0ustar zmoelnigzmoelnigTARGET = iem_spec2 all: ..\$(TARGET).dll VIS_CPP_PATH = "C:\Program Files\Microsoft Visual Studio 9.0\VC" VIS_SDK_PATH = "C:\Program Files\Microsoft SDKs\Windows\v6.0A" PD_INST_PATH = "C:\Program Files\pd-0.43.0" PD_WIN_INCLUDE_PATH = /I. /I$(PD_INST_PATH)\src /I$(VIS_CPP_PATH)\include PD_WIN_C_FLAGS = /nologo /W3 /WX /DMSW /DNT /DPD /DWIN32 /DWINDOWS /Ox -D_CRT_SECURE_NO_WARNINGS PD_WIN_L_FLAGS = /nologo PD_WIN_LIB = /NODEFAULTLIB:libcmt /NODEFAULTLIB:oldnames /NODEFAULTLIB:kernel32 \ $(VIS_CPP_PATH)\lib\libcmt.lib \ $(VIS_CPP_PATH)\lib\oldnames.lib \ $(VIS_SDK_PATH)\lib\kernel32.lib \ $(PD_INST_PATH)\bin\pd.lib SRC = spec2_1p1z_freq~.c \ spec2_1p1z_time~.c \ spec2_abs~.c \ spec2_add_scalar~.c \ spec2_add~.c \ spec2_block_delay~.c \ spec2_clip_max~.c \ spec2_clip_min~.c \ spec2_dbtopow~.c \ spec2_dbtorms~.c \ spec2_matrix_bundle_stat~.c \ spec2_mul_scalar~.c \ spec2_mul~.c \ spec2_powtodb~.c \ spec2_rmstodb~.c \ spec2_shift~.c \ spec2_sqrt~.c \ spec2_stretch~.c \ spec2_sub~.c \ spec2_sum~.c \ spec2_tab_conv~.c \ spec2_tabreceive_enable~.c \ spec2_tabreceive~.c \ iem_spec2.c OBJ = $(SRC:.c=.obj) .c.obj: cl $(PD_WIN_C_FLAGS) $(PD_WIN_INCLUDE_PATH) /c $*.c ..\$(TARGET).dll: $(OBJ) link $(PD_WIN_L_FLAGS) /dll /export:$(TARGET)_setup \ /out:..\$(TARGET).dll $(OBJ) $(PD_WIN_LIB) clean: del *.obj iem_utils-v0.0.20180206/iem_spec2/src/VC9/iem_spec2.vcproj0000644000175000017500000000357512630366347023041 0ustar zmoelnigzmoelnig iem_utils-v0.0.20180206/iem_spec2/src/VC9/iem_spec2.sln0000644000175000017500000000156312630366347022325 0ustar zmoelnigzmoelnig Microsoft Visual Studio Solution File, Format Version 10.00 # Visual Studio 2008 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "iem_spec2", "iem_spec2.vcproj", "{6A44952F-0D55-44EE-9032-928368583BEC}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Win32 = Debug|Win32 Release|Win32 = Release|Win32 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {6A44952F-0D55-44EE-9032-928368583BEC}.Debug|Win32.ActiveCfg = Debug|Win32 {6A44952F-0D55-44EE-9032-928368583BEC}.Debug|Win32.Build.0 = Debug|Win32 {6A44952F-0D55-44EE-9032-928368583BEC}.Release|Win32.ActiveCfg = Release|Win32 {6A44952F-0D55-44EE-9032-928368583BEC}.Release|Win32.Build.0 = Release|Win32 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection EndGlobal iem_utils-v0.0.20180206/iem_spec2/src/spec2_add_scalar~.c0000644000175000017500000000545212630366347023054 0ustar zmoelnigzmoelnig/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_spec2 written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2006 */ #include "m_pd.h" #include "iemlib.h" /* -------------------------- spec2_add_scalar~ ------------------------------ */ static t_class *spec2_add_scalar_tilde_class; typedef struct _spec2_add_scalar_tilde { t_object x_obj; t_float x_f; t_float x_msi; } t_spec2_add_scalar_tilde; static void spec2_add_scalar_tilde_ft1(t_spec2_add_scalar_tilde *x, t_floatarg f) { x->x_f = f; } static t_int *spec2_add_scalar_tilde_perform(t_int *w) { t_float *io = (t_float *)(w[1]); t_spec2_add_scalar_tilde *x = (t_spec2_add_scalar_tilde *)(w[2]); int i, n = (t_int)(w[3]); t_float f = x->x_f; for(i=0; i<=n; i++) { io[i] += f; } return(w+4); } static t_int *spec2_add_scalar_tilde_perf16(t_int *w) { t_float *io = (t_float *)(w[1]); t_spec2_add_scalar_tilde *x = (t_spec2_add_scalar_tilde *)(w[2]); int n = (t_int)(w[3]); t_float f = x->x_f; while(n) { io[0] += f; io[1] += f; io[2] += f; io[3] += f; io[4] += f; io[5] += f; io[6] += f; io[7] += f; io[8] += f; io[9] += f; io[10] += f; io[11] += f; io[12] += f; io[13] += f; io[14] += f; io[15] += f; io += 16; n -= 16; } io[0] += f; return(w+4); } static void spec2_add_scalar_tilde_dsp(t_spec2_add_scalar_tilde *x, t_signal **sp) { int n = (sp[0]->s_n)/2; if(n&15) dsp_add(spec2_add_scalar_tilde_perform, 3, sp[0]->s_vec, x, n); else dsp_add(spec2_add_scalar_tilde_perf16, 3, sp[0]->s_vec, x, n); } static void *spec2_add_scalar_tilde_new(t_floatarg f) { t_spec2_add_scalar_tilde *x = (t_spec2_add_scalar_tilde *)pd_new(spec2_add_scalar_tilde_class); inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_float, gensym("ft1")); outlet_new(&x->x_obj, &s_signal); x->x_f = f; x->x_msi = 0.0f; return (x); } static void spec2_add_scalar_tilde_free(t_spec2_add_scalar_tilde *x) { } void spec2_add_scalar_tilde_setup(void) { spec2_add_scalar_tilde_class = class_new(gensym("spec2_add_scalar~"), (t_newmethod)spec2_add_scalar_tilde_new, (t_method)spec2_add_scalar_tilde_free, sizeof(t_spec2_add_scalar_tilde), 0, A_DEFFLOAT, 0); class_addcreator((t_newmethod)spec2_add_scalar_tilde_new, gensym("spec2+s~"), A_DEFFLOAT, 0); CLASS_MAINSIGNALIN(spec2_add_scalar_tilde_class, t_spec2_add_scalar_tilde, x_msi); class_addmethod(spec2_add_scalar_tilde_class, (t_method)spec2_add_scalar_tilde_ft1, gensym("ft1"), A_FLOAT, 0); class_addmethod(spec2_add_scalar_tilde_class, (t_method)spec2_add_scalar_tilde_dsp, gensym("dsp"), 0); // class_sethelpsymbol(spec2_add_scalar_tilde_class, gensym("iemhelp2/spec2_add_scalar~-help")); } iem_utils-v0.0.20180206/iem_spec2/src/spec2_stretch~.c0000644000175000017500000000551312630366347022451 0ustar zmoelnigzmoelnig/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_spec2 written by Thomas Musil (c) IEM KUG Graz Austria 2000 - 2006 */ #include "m_pd.h" #include "iemlib.h" /* -- spec2_stretch~ - stretch spectral bins --- */ typedef struct spec2_stretch_tilde { t_object x_obj; int x_blocksize; t_float x_mul; t_float *x_spec; t_float x_msi; } t_spec2_stretch_tilde; t_class *spec2_stretch_tilde_class; static t_int *spec2_stretch_tilde_perform(t_int *w) { t_float *in = (t_float *)(w[1]); t_float *out = (t_float *)(w[2]); t_spec2_stretch_tilde *x = (t_spec2_stretch_tilde *)(w[3]); int i, j, m, n = (t_int)(w[4])+1; t_float yn0, yn1, fract; t_float *spec=x->x_spec; t_float mul=x->x_mul; t_float rcp_mul = 1.0f / mul; for(i=0; i n) m = n; for(i=0; ix_mul = mul; } static void spec2_stretch_tilde_dsp(t_spec2_stretch_tilde *x, t_signal **sp) { int n = (sp[0]->s_n)/2; if(!x->x_blocksize) { x->x_spec = (t_float *)getbytes((n+1)*sizeof(t_float)); x->x_blocksize = n; } else if(x->x_blocksize != n) { x->x_spec = (t_float *)resizebytes(x->x_spec, (x->x_blocksize+1)*sizeof(t_float), (n+1)*sizeof(t_float)); x->x_blocksize = n; } dsp_add(spec2_stretch_tilde_perform, 4, sp[0]->s_vec, sp[1]->s_vec, x, n); } static void *spec2_stretch_tilde_new(t_floatarg mul) { t_spec2_stretch_tilde *x = (t_spec2_stretch_tilde *)pd_new(spec2_stretch_tilde_class); outlet_new(&x->x_obj, &s_signal); if(mul <= 0.0f) mul = 1.0f; x->x_blocksize = 0; x->x_mul = mul; x->x_spec = (t_float *)0; return (x); } static void spec2_stretch_tilde_free(t_spec2_stretch_tilde *x) { if(x->x_spec) freebytes(x->x_spec, (x->x_blocksize+1) * sizeof(t_float)); } void spec2_stretch_tilde_setup(void) { spec2_stretch_tilde_class = class_new(gensym("spec2_stretch~"), (t_newmethod)spec2_stretch_tilde_new, 0, sizeof(t_spec2_stretch_tilde), 0, A_DEFFLOAT, 0); CLASS_MAINSIGNALIN(spec2_stretch_tilde_class, t_spec2_stretch_tilde, x_msi); class_addmethod(spec2_stretch_tilde_class, (t_method)spec2_stretch_tilde_dsp, gensym("dsp"), 0); class_addfloat(spec2_stretch_tilde_class, (t_method)spec2_stretch_tilde_mul); // class_sethelpsymbol(spec2_stretch_tilde_class, gensym("iemhelp/spec2_stretch~-help")); } iem_utils-v0.0.20180206/iem_spec2/src/makefile_darwin0000644000175000017500000000244312630366347022402 0ustar zmoelnigzmoelnigcurrent: all .SUFFIXES: .pd_darwin PD_INSTALL_PATH = "/Applications/Pd.app/Contents/Resources" INCLUDE = -I. -I$(PD_INSTALL_PATH)/src LIB = -ldl -lm -lpthread CFLAGS = -DPD -DUNIX -g -Wall -W -Werror -Wno-unused \ -Wno-parentheses -Wno-switch -O2 -fno-strict-aliasing \ $(INCLUDE) $(UCFLAGS) $(AFLAGS) \ MACOSXLINKFLAGS = -bundle -bundle_loader $(PD_INSTALL_PATH)/bin/pd SYSTEM = $(shell uname -m) # the sources SRC = spec2_1p1z_freq~.c \ spec2_1p1z_time~.c \ spec2_abs~.c \ spec2_add_scalar~.c \ spec2_add~.c \ spec2_block_delay~.c \ spec2_clip_max~.c \ spec2_clip_min~.c \ spec2_dbtopow~.c \ spec2_dbtorms~.c \ spec2_matrix_bundle_stat~.c \ spec2_mul_scalar~.c \ spec2_mul~.c \ spec2_powtodb~.c \ spec2_rmstodb~.c \ spec2_shift~.c \ spec2_sqrt~.c \ spec2_stretch~.c \ spec2_sub~.c \ spec2_sum~.c \ spec2_tab_conv~.c \ spec2_tabreceive_enable~.c \ spec2_tabreceive~.c \ iem_spec2.c TARGET = iem_spec2.pd_darwin OBJ = $(SRC:.c=.o) # # ------------------ targets ------------------------------------ # clean: rm ../$(TARGET) rm *.o all: $(OBJ) @echo :: $(OBJ) $(CC) $(MACOSXLINKFLAGS) -o $(TARGET) *.o $(LIB) strip -S -x $(TARGET) mv $(TARGET) .. $(OBJ) : %.o : %.c touch $*.c $(CC) $(CFLAGS) -DPD $(INCLUDE) -c -o $*.o $*.c iem_utils-v0.0.20180206/iem_spec2/src/spec2_abs~.c0000644000175000017500000000431312630366347021537 0ustar zmoelnigzmoelnig/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_spec2 written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2006 */ #include "m_pd.h" #include "iemlib.h" #include /* ------------------------ spec2_abs_tilde~ ------------------------- */ static t_class *spec2_abs_tilde_class; typedef struct _spec2_abs_tilde { t_object x_obj; t_float x_msi; } t_spec2_abs_tilde; static t_int *spec2_abs_tilde_perform(t_int *w) { t_float *in = (t_float *)(w[1]); t_float *out = (t_float *)(w[2]); int n = w[3]+1; while(n--) { *in++ = fabs(*out++); } return(w+4); } static t_int *spec2_abs_tilde_perf16(t_int *w) { t_float *in = (t_float *)(w[1]); t_float *out = (t_float *)(w[2]); int n = w[3]; while(n) { in[0] = fabs(out[0]); in[1] = fabs(out[1]); in[2] = fabs(out[2]); in[3] = fabs(out[3]); in[4] = fabs(out[4]); in[5] = fabs(out[5]); in[6] = fabs(out[6]); in[7] = fabs(out[7]); in[8] = fabs(out[8]); in[9] = fabs(out[9]); in[10] = fabs(out[10]); in[11] = fabs(out[11]); in[12] = fabs(out[12]); in[13] = fabs(out[13]); in[14] = fabs(out[14]); in[15] = fabs(out[15]); in += 16; out += 16; n -= 16; } in[0] = fabs(out[0]); return(w+4); } static void spec2_abs_tilde_dsp(t_spec2_abs_tilde *x, t_signal **sp) { int n = (sp[0]->s_n)/2; if(n&15) dsp_add(spec2_abs_tilde_perform, 3, sp[0]->s_vec, sp[0]->s_vec, n); else dsp_add(spec2_abs_tilde_perf16, 3, sp[0]->s_vec, sp[0]->s_vec, n); } static void *spec2_abs_tilde_new(void) { t_spec2_abs_tilde *x = (t_spec2_abs_tilde *)pd_new(spec2_abs_tilde_class); outlet_new(&x->x_obj, &s_signal); x->x_msi = 0.0f; return (x); } void spec2_abs_tilde_setup(void) { spec2_abs_tilde_class = class_new(gensym("spec2_abs~"), (t_newmethod)spec2_abs_tilde_new, 0, sizeof(t_spec2_abs_tilde), 0, 0); CLASS_MAINSIGNALIN(spec2_abs_tilde_class, t_spec2_abs_tilde, x_msi); class_addmethod(spec2_abs_tilde_class, (t_method)spec2_abs_tilde_dsp, gensym("dsp"), 0); // class_sethelpsymbol(spec2_abs_tilde_class, gensym("iemhelp2/spec2_abs~-help")); } iem_utils-v0.0.20180206/iem_spec2/src/spec2_block_delay~.c0000644000175000017500000000773212630366347023252 0ustar zmoelnigzmoelnig/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_spec2 written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2006 */ #include "m_pd.h" #include "iemlib.h" /* -------------------------- spec2_block_delay~ ------------------------------ */ static t_class *spec2_block_delay_tilde_class; typedef struct _spec2_block_delay_tilde { t_object x_obj; t_float *x_begmem; int x_blocksize; t_float x_msi; } t_spec2_block_delay_tilde; static t_int *spec2_block_delay_tilde_perform(t_int *w) { t_float *in = (t_float *)(w[1]); t_float *out = (t_float *)(w[2]); t_spec2_block_delay_tilde *x = (t_spec2_block_delay_tilde *)(w[3]); int i, n = (t_int)(w[4]); t_float *rw_vec; rw_vec = x->x_begmem; for(i=0; i<=n; i++) { t_float f = in[i]; out[i] = rw_vec[i]; rw_vec[i] = f; } return(w+5); } static t_int *spec2_block_delay_tilde_perf16(t_int *w) { t_float *in = (t_float *)(w[1]); t_float *out = (t_float *)(w[2]); t_spec2_block_delay_tilde *x = (t_spec2_block_delay_tilde *)(w[3]); int i, n = (t_int)(w[4]); t_float *rw_vec, ff; rw_vec = x->x_begmem; while(n) { t_float f[16]; f[0] = in[0]; f[1] = in[1]; f[2] = in[2]; f[3] = in[3]; f[4] = in[4]; f[5] = in[5]; f[6] = in[6]; f[7] = in[7]; f[8] = in[8]; f[9] = in[9]; f[10] = in[10]; f[11] = in[11]; f[12] = in[12]; f[13] = in[13]; f[14] = in[14]; f[15] = in[15]; out[0] = rw_vec[0]; out[1] = rw_vec[1]; out[2] = rw_vec[2]; out[3] = rw_vec[3]; out[4] = rw_vec[4]; out[5] = rw_vec[5]; out[6] = rw_vec[6]; out[7] = rw_vec[7]; out[8] = rw_vec[8]; out[9] = rw_vec[9]; out[10] = rw_vec[10]; out[11] = rw_vec[11]; out[12] = rw_vec[12]; out[13] = rw_vec[13]; out[14] = rw_vec[14]; out[15] = rw_vec[15]; rw_vec[0] = f[0]; rw_vec[1] = f[1]; rw_vec[2] = f[2]; rw_vec[3] = f[3]; rw_vec[4] = f[4]; rw_vec[5] = f[5]; rw_vec[6] = f[6]; rw_vec[7] = f[7]; rw_vec[8] = f[8]; rw_vec[9] = f[9]; rw_vec[10] = f[10]; rw_vec[11] = f[11]; rw_vec[12] = f[12]; rw_vec[13] = f[13]; rw_vec[14] = f[14]; rw_vec[15] = f[15]; rw_vec += 16; in += 16; out += 16; n -= 16; } ff = in[0]; out[0] = rw_vec[0]; rw_vec[0] = ff; return(w+5); } static void spec2_block_delay_tilde_dsp(t_spec2_block_delay_tilde *x, t_signal **sp) { int n = (sp[0]->s_n)/2; if(!x->x_blocksize)/*first time*/ { x->x_begmem = (t_float *)getbytes((n+1) * sizeof(t_float)); x->x_blocksize = n; } else if(x->x_blocksize != n) { x->x_begmem = (t_float *)resizebytes(x->x_begmem, (x->x_blocksize+1)*sizeof(t_float), (n+1)*sizeof(t_float)); x->x_blocksize = n; } if(n&15) dsp_add(spec2_block_delay_tilde_perform, 4, sp[0]->s_vec, sp[1]->s_vec, x, n); else dsp_add(spec2_block_delay_tilde_perf16, 4, sp[0]->s_vec, sp[1]->s_vec, x, n); } static void *spec2_block_delay_tilde_new(void) { t_spec2_block_delay_tilde *x = (t_spec2_block_delay_tilde *)pd_new(spec2_block_delay_tilde_class); x->x_blocksize = 0; x->x_begmem = (t_float *)0; outlet_new(&x->x_obj, &s_signal); x->x_msi = 0.0f; return (x); } static void spec2_block_delay_tilde_free(t_spec2_block_delay_tilde *x) { if(x->x_begmem) freebytes(x->x_begmem, (x->x_blocksize+1) * sizeof(t_float)); } void spec2_block_delay_tilde_setup(void) { spec2_block_delay_tilde_class = class_new(gensym("spec2_block_delay~"), (t_newmethod)spec2_block_delay_tilde_new, (t_method)spec2_block_delay_tilde_free, sizeof(t_spec2_block_delay_tilde), 0, 0); CLASS_MAINSIGNALIN(spec2_block_delay_tilde_class, t_spec2_block_delay_tilde, x_msi); class_addmethod(spec2_block_delay_tilde_class, (t_method)spec2_block_delay_tilde_dsp, gensym("dsp"), 0); // class_sethelpsymbol(spec2_block_delay_tilde_class, gensym("iemhelp2/spec2_block_delay~-help")); } iem_utils-v0.0.20180206/iem_spec2/src/spec2_sqrt~.c0000644000175000017500000000325312630366347021765 0ustar zmoelnigzmoelnig/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_spec2 written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2006 */ #include "m_pd.h" #include "iemlib.h" #include /* ------------------------ spec2_sqrt_tilde~ ------------------------- */ static t_class *spec2_sqrt_tilde_class; typedef struct _spec2_sqrt_tilde { t_object x_obj; t_float x_msi; } t_spec2_sqrt_tilde; static t_int *spec2_sqrt_tilde_perform(t_int *w) { t_float *in = (t_float *)(w[1]); t_float *out = (t_float *)(w[2]); int n = w[3]+1; while(n--) { t_sample f = *in++; if (f<0.0) { *out++=0.0; } else { #if ((defined PD_MAJOR_VERSION && defined PD_MINOR_VERSION) && (PD_MAJOR_VERSION > 0 || PD_MINOR_VERSION > 43)) t_float g = q8_rsqrt(f); *out++ = f*g*(1.5 - 0.5 * g * g * f); #else *out++ = sqrt(f); #endif } } return(w+4); } static void spec2_sqrt_tilde_dsp(t_spec2_sqrt_tilde *x, t_signal **sp) { int n = (sp[0]->s_n)/2; dsp_add(spec2_sqrt_tilde_perform, 3, sp[0]->s_vec, sp[0]->s_vec, n); } static void *spec2_sqrt_tilde_new(void) { t_spec2_sqrt_tilde *x = (t_spec2_sqrt_tilde *)pd_new(spec2_sqrt_tilde_class); outlet_new(&x->x_obj, &s_signal); x->x_msi = 0.0f; return (x); } void spec2_sqrt_tilde_setup(void) { spec2_sqrt_tilde_class = class_new(gensym("spec2_sqrt~"), (t_newmethod)spec2_sqrt_tilde_new, 0, sizeof(t_spec2_sqrt_tilde), 0, 0); CLASS_MAINSIGNALIN(spec2_sqrt_tilde_class, t_spec2_sqrt_tilde, x_msi); class_addmethod(spec2_sqrt_tilde_class, (t_method)spec2_sqrt_tilde_dsp, gensym("dsp"), 0); } iem_utils-v0.0.20180206/iem_spec2/src/spec2_1p1z_time~.c0000644000175000017500000001411612630366347022605 0ustar zmoelnigzmoelnig/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_spec2 written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2006 */ #include "m_pd.h" #include "iemlib.h" /* -------------------------- spec2_1p1z_time~ ------------------------------ */ static t_class *spec2_1p1z_time_tilde_class; typedef struct _spec2_1p1z_time_tilde { t_object x_obj; t_float x_a0; t_float x_a1; t_float x_b1; t_float *x_begmem_forw; t_float *x_begmem_back; int x_blocksize; t_float x_msi; } t_spec2_1p1z_time_tilde; static void spec2_1p1z_time_tilde_list(t_spec2_1p1z_time_tilde *x, t_symbol *s, int argc, t_atom *argv) { if((argc >= 3) && IS_A_FLOAT(argv,0) && IS_A_FLOAT(argv,1) && IS_A_FLOAT(argv,2)) { x->x_a0 = (t_float)atom_getfloatarg(0, argc, argv); x->x_a1 = (t_float)atom_getfloatarg(1, argc, argv); x->x_b1 = (t_float)atom_getfloatarg(2, argc, argv); } } static t_int *spec2_1p1z_time_tilde_perform(t_int *w) { t_float *in = (t_float *)(w[1]); t_float *out = (t_float *)(w[2]); t_spec2_1p1z_time_tilde *x = (t_spec2_1p1z_time_tilde *)(w[3]); int i, n = (t_int)(w[4]); t_float a0 = x->x_a0; t_float a1 = x->x_a1; t_float b1 = x->x_b1; t_float *vec_forw = x->x_begmem_forw; t_float *vec_back = x->x_begmem_back; t_float f; for(i=0; i<=n; i++) { f = in[i]; out[i] = a0*f + a1*vec_forw[i] + b1*vec_back[i]; vec_forw[i] = f; vec_back[i] = out[i]; } return(w+5); } static t_int *spec2_1p1z_time_tilde_perf16(t_int *w) { t_float *in = (t_float *)(w[1]); t_float *out = (t_float *)(w[2]); t_spec2_1p1z_time_tilde *x = (t_spec2_1p1z_time_tilde *)(w[3]); int n = (t_int)(w[4]); t_float a0 = x->x_a0; t_float a1 = x->x_a1; t_float b1 = x->x_b1; t_float *vec_forw = x->x_begmem_forw; t_float *vec_back = x->x_begmem_back; t_float ff; while(n) { t_float f[16]; f[0] = in[0]; f[1] = in[1]; f[2] = in[2]; f[3] = in[3]; f[4] = in[4]; f[5] = in[5]; f[6] = in[6]; f[7] = in[7]; f[8] = in[8]; f[9] = in[9]; f[10] = in[10]; f[11] = in[11]; f[12] = in[12]; f[13] = in[13]; f[14] = in[14]; f[15] = in[15]; out[0] = a0*f[0] + a1*vec_forw[0] + b1*vec_back[0]; out[1] = a0*f[1] + a1*vec_forw[1] + b1*vec_back[1]; out[2] = a0*f[2] + a1*vec_forw[2] + b1*vec_back[2]; out[3] = a0*f[3] + a1*vec_forw[3] + b1*vec_back[3]; out[4] = a0*f[4] + a1*vec_forw[4] + b1*vec_back[4]; out[5] = a0*f[5] + a1*vec_forw[5] + b1*vec_back[5]; out[6] = a0*f[6] + a1*vec_forw[6] + b1*vec_back[6]; out[7] = a0*f[7] + a1*vec_forw[7] + b1*vec_back[7]; out[8] = a0*f[8] + a1*vec_forw[8] + b1*vec_back[8]; out[9] = a0*f[9] + a1*vec_forw[9] + b1*vec_back[9]; out[10] = a0*f[10] + a1*vec_forw[10] + b1*vec_back[10]; out[11] = a0*f[11] + a1*vec_forw[11] + b1*vec_back[11]; out[12] = a0*f[12] + a1*vec_forw[12] + b1*vec_back[12]; out[13] = a0*f[13] + a1*vec_forw[13] + b1*vec_back[13]; out[14] = a0*f[14] + a1*vec_forw[14] + b1*vec_back[14]; out[15] = a0*f[15] + a1*vec_forw[15] + b1*vec_back[15]; vec_forw[0] = f[0]; vec_forw[1] = f[1]; vec_forw[2] = f[2]; vec_forw[3] = f[3]; vec_forw[4] = f[4]; vec_forw[5] = f[5]; vec_forw[6] = f[6]; vec_forw[7] = f[7]; vec_forw[8] = f[8]; vec_forw[9] = f[9]; vec_forw[10] = f[10]; vec_forw[11] = f[11]; vec_forw[12] = f[12]; vec_forw[13] = f[13]; vec_forw[14] = f[14]; vec_forw[15] = f[15]; vec_back[0] = out[0]; vec_back[1] = out[1]; vec_back[2] = out[2]; vec_back[3] = out[3]; vec_back[4] = out[4]; vec_back[5] = out[5]; vec_back[6] = out[6]; vec_back[7] = out[7]; vec_back[8] = out[8]; vec_back[9] = out[9]; vec_back[10] = out[10]; vec_back[11] = out[11]; vec_back[12] = out[12]; vec_back[13] = out[13]; vec_back[14] = out[14]; vec_back[15] = out[15]; in += 16; out += 16; vec_forw += 16; vec_back += 16; n -= 16; } ff = in[0]; out[0] = a0*ff + a1*vec_forw[0] + b1*vec_back[0]; vec_forw[0] = ff; vec_back[0] = out[0]; return(w+5); } static void spec2_1p1z_time_tilde_dsp(t_spec2_1p1z_time_tilde *x, t_signal **sp) { int n = (sp[0]->s_n)/2; if(!x->x_blocksize)/*first time*/ { x->x_begmem_forw = (t_float *)getbytes(2 * (n+1) * sizeof(t_float)); x->x_blocksize = n; x->x_begmem_back = x->x_begmem_forw + n + 1; } else if(x->x_blocksize != n) { x->x_begmem_forw = (t_float *)resizebytes(x->x_begmem_forw, 2*(x->x_blocksize+1)*sizeof(t_float), 2*(n+1)*sizeof(t_float)); x->x_blocksize = n; x->x_begmem_back = x->x_begmem_forw + n +1; } if(n&15) dsp_add(spec2_1p1z_time_tilde_perform, 4, sp[0]->s_vec, sp[1]->s_vec, x, n); else dsp_add(spec2_1p1z_time_tilde_perf16, 4, sp[0]->s_vec, sp[1]->s_vec, x, n); } static void *spec2_1p1z_time_tilde_new(t_symbol *s, int argc, t_atom *argv) { t_spec2_1p1z_time_tilde *x = (t_spec2_1p1z_time_tilde *)pd_new(spec2_1p1z_time_tilde_class); outlet_new(&x->x_obj, &s_signal); x->x_blocksize = 0; x->x_begmem_forw = (t_float *)0; if(argc >= 3) spec2_1p1z_time_tilde_list(x, s, argc, argv); else { x->x_a0 = 1.0f; x->x_a1 = 0.0f; x->x_b1 = 0.0f; } x->x_msi = 0.0f; return (x); } static void spec2_1p1z_time_tilde_free(t_spec2_1p1z_time_tilde *x) { if(x->x_begmem_forw) freebytes(x->x_begmem_forw, 2 * (x->x_blocksize+1) * sizeof(t_float)); } void spec2_1p1z_time_tilde_setup(void) { spec2_1p1z_time_tilde_class = class_new(gensym("spec2_1p1z_time~"), (t_newmethod)spec2_1p1z_time_tilde_new, (t_method)spec2_1p1z_time_tilde_free, sizeof(t_spec2_1p1z_time_tilde), 0, A_GIMME, 0); CLASS_MAINSIGNALIN(spec2_1p1z_time_tilde_class, t_spec2_1p1z_time_tilde, x_msi); class_addlist(spec2_1p1z_time_tilde_class, (t_method)spec2_1p1z_time_tilde_list); class_addmethod(spec2_1p1z_time_tilde_class, (t_method)spec2_1p1z_time_tilde_dsp, gensym("dsp"), 0); // class_sethelpsymbol(spec2_1p1z_time_tilde_class, gensym("iemhelp2/spec2_1p1z_time~-help")); } iem_utils-v0.0.20180206/iem_spec2/src/spec2_tab_conv~.c0000644000175000017500000001015412630366347022565 0ustar zmoelnigzmoelnig/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_spec2 written by Thomas Musil (c) IEM KUG Graz Austria 2000 - 2009 */ #include "m_pd.h" #include "iemlib.h" /* -- spec2_tab_conv~ - convolute a spectrum with a table --- */ typedef struct spec2_tab_conv_tilde { t_object x_obj; t_float *x_spec; iemarray_t *x_beg_array; int x_blocksize; int x_winsize; int x_has_changed; t_symbol *x_sym_array; t_float x_msi; } t_spec2_tab_conv_tilde; t_class *spec2_tab_conv_tilde_class; static void spec2_tab_conv_tilde_set(t_spec2_tab_conv_tilde *x, t_symbol *s, int argc, t_atom *argv) { if((argc >= 2) && IS_A_SYMBOL(argv, 0) && IS_A_FLOAT(argv, 1)) { x->x_sym_array = (t_symbol *)(atom_getsymbol(argv)); x->x_winsize = (int)(atom_getint(argv+1)); x->x_has_changed = 1; } } static t_int *spec2_tab_conv_tilde_perform(t_int *w) { t_float *in = (t_float *)(w[1]); t_float *out = (t_float *)(w[2]); t_spec2_tab_conv_tilde *x = (t_spec2_tab_conv_tilde *)(w[3]); t_float sum=0.0f; t_float *vec1, *vec2, *vec3; iemarray_t*win; int i, m, n = (int)(w[4])+1; int j, ws=x->x_winsize; vec2 = x->x_spec + n; vec1 = vec2; vec3 = vec2 + 2*n - 2; for(i=0; ix_spec + n - ws/2; win = x->x_beg_array; for(i=0; is_n)/2; t_garray *a; int n_points; if(x->x_has_changed) { x->x_has_changed = 0; if(!(a = (t_garray *)pd_findbyclass(x->x_sym_array, garray_class))) { if(*x->x_sym_array->s_name) error("spec2_tab_conv~: %s: no such array", x->x_sym_array->s_name); } else if(!iemarray_getarray(a, &n_points, &x->x_beg_array)) error("%s: bad template for spec2_tab_conv~", x->x_sym_array->s_name); else { if(n_points > (n+1)) n_points = n+1; if(x->x_winsize < 0) x->x_winsize = 0; if(x->x_winsize > n_points) x->x_winsize = n_points; } } if(!x->x_blocksize) { x->x_spec = (t_float *)getbytes(3*(n+1)*sizeof(t_float)); x->x_blocksize = n; } else if(x->x_blocksize != n) { x->x_spec = (t_float *)resizebytes(x->x_spec, 3*(x->x_blocksize+1)*sizeof(t_float), 3*(n+1)*sizeof(t_float)); x->x_blocksize = n; } dsp_add(spec2_tab_conv_tilde_perform, 4, sp[0]->s_vec, sp[1]->s_vec, x, n); } static void spec2_tab_conv_tilde_free(t_spec2_tab_conv_tilde *x) { if(x->x_spec) freebytes(x->x_spec, 3*(x->x_blocksize+1)*sizeof(t_float)); } static void *spec2_tab_conv_tilde_new(t_symbol *s, int argc, t_atom *argv) { t_spec2_tab_conv_tilde *x = (t_spec2_tab_conv_tilde *)pd_new(spec2_tab_conv_tilde_class); if((argc >= 2) && IS_A_SYMBOL(argv,0) && IS_A_FLOAT(argv,1)) { x->x_sym_array = (t_symbol *)(atom_getsymbol(argv)); x->x_winsize = (int)(atom_getint(argv+1)); x->x_spec = (t_float *)0; x->x_beg_array = (iemarray_t *)0; x->x_blocksize = 0; x->x_has_changed = 1; outlet_new(&x->x_obj, &s_signal); x->x_msi = 0.0f; return(x); } else { post("spec2_tab_conv~-ERROR: needs 2 args: convolution-array-name + convolution-array-size !!!"); return(0); } } void spec2_tab_conv_tilde_setup(void) { spec2_tab_conv_tilde_class = class_new(gensym("spec2_tab_conv~"), (t_newmethod)spec2_tab_conv_tilde_new, (t_method)spec2_tab_conv_tilde_free, sizeof(t_spec2_tab_conv_tilde), 0, A_GIMME, 0); CLASS_MAINSIGNALIN(spec2_tab_conv_tilde_class, t_spec2_tab_conv_tilde, x_msi); class_addmethod(spec2_tab_conv_tilde_class, (t_method)spec2_tab_conv_tilde_dsp, gensym("dsp"), 0); class_addmethod(spec2_tab_conv_tilde_class, (t_method)spec2_tab_conv_tilde_set, gensym("set"), A_GIMME, 0); // class_sethelpsymbol(spec2_tab_conv_tilde_class, gensym("iemhelp/spec2_tab_conv~-help")); } iem_utils-v0.0.20180206/iem_spec2/src/iem_spec2.dsw0000644000175000017500000000107112630366347021717 0ustar zmoelnigzmoelnigMicrosoft Developer Studio Workspace File, Format Version 6.00 # WARNUNG: DIESE ARBEITSBEREICHSDATEI DARF NICHT BEARBEITET ODER GELÖSCHT WERDEN! ############################################################################### Project: "iem_spec2"=.\iem_spec2.dsp - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ }}} ############################################################################### Global: Package=<5> {{{ }}} Package=<3> {{{ }}} ############################################################################### iem_utils-v0.0.20180206/iem_spec2/src/iem_spec2.sln0000644000175000017500000000156312630366347021724 0ustar zmoelnigzmoelnig Microsoft Visual Studio Solution File, Format Version 10.00 # Visual Studio 2008 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "iem_spec2", "iem_spec2.vcproj", "{6A44952F-0D55-44EE-9032-928368583BEC}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Win32 = Debug|Win32 Release|Win32 = Release|Win32 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {6A44952F-0D55-44EE-9032-928368583BEC}.Debug|Win32.ActiveCfg = Debug|Win32 {6A44952F-0D55-44EE-9032-928368583BEC}.Debug|Win32.Build.0 = Debug|Win32 {6A44952F-0D55-44EE-9032-928368583BEC}.Release|Win32.ActiveCfg = Release|Win32 {6A44952F-0D55-44EE-9032-928368583BEC}.Release|Win32.Build.0 = Release|Win32 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection EndGlobal iem_utils-v0.0.20180206/iem_spec2/src/makefile_win0000644000175000017500000000256112630366347021714 0ustar zmoelnigzmoelnig all: ..\iem_spec2.dll VIS_CPP_PATH = "C:\Programme\Microsoft Visual Studio\Vc98" PD_INST_PATH = "C:\Programme\pd" PD_WIN_INCLUDE_PATH = /I. /I$(PD_INST_PATH)\src /I$(VIS_CPP_PATH)\include PD_WIN_C_FLAGS = /nologo /W3 /WX /DMSW /DNT /DPD /DWIN32 /DWINDOWS /Ox -DPA_LITTLE_ENDIAN PD_WIN_L_FLAGS = /nologo PD_WIN_LIB = /NODEFAULTLIB:libc /NODEFAULTLIB:oldnames /NODEFAULTLIB:kernel /NODEFAULTLIB:uuid \ $(VIS_CPP_PATH)\lib\libc.lib \ $(VIS_CPP_PATH)\lib\oldnames.lib \ $(VIS_CPP_PATH)\lib\kernel32.lib \ $(VIS_CPP_PATH)\lib\wsock32.lib \ $(VIS_CPP_PATH)\lib\winmm.lib \ $(PD_INST_PATH)\bin\pd.lib SRC = spec2_1p1z_freq~.c \ spec2_1p1z_time~.c \ spec2_abs~.c \ spec2_add_scalar~.c \ spec2_add~.c \ spec2_block_delay~.c \ spec2_clip_max~.c \ spec2_clip_min~.c \ spec2_dbtopow~.c \ spec2_dbtorms~.c \ spec2_matrix_bundle_stat~.c \ spec2_mul_scalar~.c \ spec2_mul~.c \ spec2_powtodb~.c \ spec2_rmstodb~.c \ spec2_shift~.c \ spec2_sqrt~.c \ spec2_stretch~.c \ spec2_sub~.c \ spec2_sum~.c \ spec2_tab_conv~.c \ spec2_tabreceive_enable~.c \ spec2_tabreceive~.c \ iem_spec2.c OBJ = $(SRC:.c=.obj) .c.obj: cl $(PD_WIN_C_FLAGS) $(PD_WIN_INCLUDE_PATH) /c $*.c ..\iem_spec2.dll: $(OBJ) link $(PD_WIN_L_FLAGS) /dll /export:iem_spec2_setup \ /out:..\iem_spec2.dll $(OBJ) $(PD_WIN_LIB) clean: del *.obj iem_utils-v0.0.20180206/iem_spec2/src/spec2_shift~.c0000644000175000017500000000561112630366347022111 0ustar zmoelnigzmoelnig/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_spec2 written by Thomas Musil (c) IEM KUG Graz Austria 2000 - 2006 */ #include "m_pd.h" #include "iemlib.h" /* -- spec2_shift~ - shift spectral bins to left (lower, negative) or to right (higher, positiv) --- */ typedef struct spec2_shift_tilde { t_object x_obj; int x_blocksize; t_float x_add; t_float *x_spec; t_float x_msi; } t_spec2_shift_tilde; t_class *spec2_shift_tilde_class; static t_int *spec2_shift_tilde_perform(t_int *w) { t_float *in = (t_float *)(w[1]); t_float *out = (t_float *)(w[2]); t_spec2_shift_tilde *x = (t_spec2_shift_tilde *)(w[3]); int i, j, n = (t_int)(w[4])+1; t_float *spec=x->x_spec; t_float add=x->x_add; if((add >= n) || (add <= -n)) { for(i=0; i= 0) { for(i=0; ix_add = add; } static void spec2_shift_tilde_dsp(t_spec2_shift_tilde *x, t_signal **sp) { int n = (sp[0]->s_n)/2; if(!x->x_blocksize) { x->x_spec = (t_float *)getbytes((n+1)*sizeof(t_float)); x->x_blocksize = n; } else if(x->x_blocksize != n) { x->x_spec = (t_float *)resizebytes(x->x_spec, (x->x_blocksize+1)*sizeof(t_float), (n+1)*sizeof(t_float)); x->x_blocksize = n; } dsp_add(spec2_shift_tilde_perform, 4, sp[0]->s_vec, sp[1]->s_vec, x, n); } static void *spec2_shift_tilde_new(t_floatarg add) { t_spec2_shift_tilde *x = (t_spec2_shift_tilde *)pd_new(spec2_shift_tilde_class); outlet_new(&x->x_obj, &s_signal); x->x_blocksize = 0; x->x_add = add; x->x_spec = (t_float *)0; return (x); } static void spec2_shift_tilde_free(t_spec2_shift_tilde *x) { if(x->x_spec) freebytes(x->x_spec, (x->x_blocksize+1) * sizeof(t_float)); } void spec2_shift_tilde_setup(void) { spec2_shift_tilde_class = class_new(gensym("spec2_shift~"), (t_newmethod)spec2_shift_tilde_new, 0, sizeof(t_spec2_shift_tilde), 0, A_DEFFLOAT, 0); CLASS_MAINSIGNALIN(spec2_shift_tilde_class, t_spec2_shift_tilde, x_msi); class_addmethod(spec2_shift_tilde_class, (t_method)spec2_shift_tilde_dsp, gensym("dsp"), 0); class_addfloat(spec2_shift_tilde_class, (t_method)spec2_shift_tilde_add); // class_sethelpsymbol(spec2_shift_tilde_class, gensym("iemhelp/spec2_shift~-help")); } iem_utils-v0.0.20180206/iem_spec2/src/spec2_clip_max~.c0000644000175000017500000000713512630366347022573 0ustar zmoelnigzmoelnig/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_spec2 written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2006 */ #include "m_pd.h" #include "iemlib.h" /* -------------------------- spec2_clip_max~ ------------------------------ */ static t_class *spec2_clip_max_tilde_class; typedef struct _spec2_clip_max_tilde { t_object x_obj; t_float x_msi; } t_spec2_clip_max_tilde; static t_int *spec2_clip_max_tilde_perform(t_int *w) { t_float *in = (t_float *)(w[1]); t_float *max = (t_float *)(w[2]); t_float *out = (t_float *)(w[3]); int i, n = (t_int)(w[4]); for(i=0; i<=n; i++) { if(in[i] > max[i]) out[i] = max[i]; else out[i] = in[i]; } return(w+5); } static t_int *spec2_clip_max_tilde_perf16(t_int *w) { t_float *in = (t_float *)(w[1]); t_float *max = (t_float *)(w[2]); t_float *out = (t_float *)(w[3]); int n = (t_int)(w[4]); while(n) { if(in[0] > max[0]) out[0] = max[0]; else out[0] = in[0]; if(in[1] > max[1]) out[1] = max[1]; else out[1] = in[1]; if(in[2] > max[2]) out[2] = max[2]; else out[2] = in[2]; if(in[3] > max[3]) out[3] = max[3]; else out[3] = in[3]; if(in[4] > max[4]) out[4] = max[4]; else out[4] = in[4]; if(in[5] > max[5]) out[5] = max[5]; else out[5] = in[5]; if(in[6] > max[6]) out[6] = max[6]; else out[6] = in[6]; if(in[7] > max[7]) out[7] = max[7]; else out[7] = in[7]; if(in[8] > max[8]) out[8] = max[8]; else out[8] = in[8]; if(in[9] > max[9]) out[9] = max[9]; else out[9] = in[9]; if(in[10] > max[10]) out[10] = max[10]; else out[10] = in[10]; if(in[11] > max[11]) out[11] = max[11]; else out[11] = in[11]; if(in[12] > max[12]) out[12] = max[12]; else out[12] = in[12]; if(in[13] > max[13]) out[13] = max[13]; else out[13] = in[13]; if(in[14] > max[14]) out[14] = max[14]; else out[14] = in[14]; if(in[15] > max[15]) out[15] = max[15]; else out[15] = in[15]; in += 16; max += 16; out += 16; n -= 16; } if(in[0] > max[0]) out[0] = max[0]; else out[0] = in[0]; return(w+5); } static void spec2_clip_max_tilde_dsp(t_spec2_clip_max_tilde *x, t_signal **sp) { int n = (sp[0]->s_n)/2; if(n&15) dsp_add(spec2_clip_max_tilde_perform, 4, sp[0]->s_vec, sp[1]->s_vec, sp[2]->s_vec, n); else dsp_add(spec2_clip_max_tilde_perf16, 4, sp[0]->s_vec, sp[1]->s_vec, sp[2]->s_vec, n); } static void *spec2_clip_max_tilde_new(void) { t_spec2_clip_max_tilde *x = (t_spec2_clip_max_tilde *)pd_new(spec2_clip_max_tilde_class); inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_signal, &s_signal); outlet_new(&x->x_obj, &s_signal); x->x_msi = 0.0f; return (x); } static void spec2_clip_max_tilde_free(t_spec2_clip_max_tilde *x) { } void spec2_clip_max_tilde_setup(void) { spec2_clip_max_tilde_class = class_new(gensym("spec2_clip_max~"), (t_newmethod)spec2_clip_max_tilde_new, (t_method)spec2_clip_max_tilde_free, sizeof(t_spec2_clip_max_tilde), 0, 0); CLASS_MAINSIGNALIN(spec2_clip_max_tilde_class, t_spec2_clip_max_tilde, x_msi); class_addmethod(spec2_clip_max_tilde_class, (t_method)spec2_clip_max_tilde_dsp, gensym("dsp"), 0); // class_sethelpsymbol(spec2_clip_max_tilde_class, gensym("iemhelp2/spec2_clip_max~-help")); } iem_utils-v0.0.20180206/iem_spec2/src/spec2_tabreceive~.c0000644000175000017500000000753712630366347023116 0ustar zmoelnigzmoelnig/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_spec2 written by Thomas Musil (c) IEM KUG Graz Austria 2000 - 2009 */ #include "m_pd.h" #include "iemlib.h" /* ------------------------ spec2_tabreceive~ ------------------------- */ static t_class *spec2_tabreceive_tilde_class; typedef struct _spec2_tabreceive_tilde { t_object x_obj; iemarray_t *x_vec; t_symbol *x_arrayname; } t_spec2_tabreceive_tilde; static void spec2_tabreceive_tilde_symbol(t_spec2_tabreceive_tilde *x, t_symbol *s) { x->x_arrayname = s; } static t_int *spec2_tabreceive_tilde_perform(t_int *w) { t_spec2_tabreceive_tilde *x = (t_spec2_tabreceive_tilde *)(w[1]); t_float *out = (t_float *)(w[2]); int n = w[3]+1, i; iemarray_t *vec = x->x_vec; if(vec) { for(i=0; ix_vec; if(vec) { while(n) { out[0] = iemarray_getfloat(vec, 0); out[1] = iemarray_getfloat(vec, 1); out[2] = iemarray_getfloat(vec, 2); out[3] = iemarray_getfloat(vec, 3); out[4] = iemarray_getfloat(vec, 4); out[5] = iemarray_getfloat(vec, 5); out[6] = iemarray_getfloat(vec, 6); out[7] = iemarray_getfloat(vec, 7); out[8] = iemarray_getfloat(vec, 8); out[9] = iemarray_getfloat(vec, 9); out[10] = iemarray_getfloat(vec, 10); out[11] = iemarray_getfloat(vec, 11); out[12] = iemarray_getfloat(vec, 12); out[13] = iemarray_getfloat(vec, 13); out[14] = iemarray_getfloat(vec, 14); out[15] = iemarray_getfloat(vec, 15); vec += 16; out += 16; n -= 16; } out[0] = iemarray_getfloat(vec, 0); } else { while(n) { out[0] = 0.0f; out[1] = 0.0f; out[2] = 0.0f; out[3] = 0.0f; out[4] = 0.0f; out[5] = 0.0f; out[6] = 0.0f; out[7] = 0.0f; out[8] = 0.0f; out[9] = 0.0f; out[10] = 0.0f; out[11] = 0.0f; out[12] = 0.0f; out[13] = 0.0f; out[14] = 0.0f; out[15] = 0.0f; out += 16; n -= 16; } out[0] = 0.0f; } return(w+4); } static void spec2_tabreceive_tilde_dsp(t_spec2_tabreceive_tilde *x, t_signal **sp) { t_garray *a; int vecsize; if(!(a = (t_garray *)pd_findbyclass(x->x_arrayname, garray_class))) { if(*x->x_arrayname->s_name) error("spec2_tabreceive~: %s: no such array", x->x_arrayname->s_name); } else if(!iemarray_getarray(a, &vecsize, &x->x_vec)) error("%s: bad template for spec2_tabreceive~", x->x_arrayname->s_name); else { int n = sp[0]->s_n; if(n < vecsize) vecsize = n; vecsize /= 2; if(vecsize&15) dsp_add(spec2_tabreceive_tilde_perform, 3, x, sp[0]->s_vec, vecsize); else dsp_add(spec2_tabreceive_tilde_perf16, 3, x, sp[0]->s_vec, vecsize); } } static void *spec2_tabreceive_tilde_new(t_symbol *s) { t_spec2_tabreceive_tilde *x = (t_spec2_tabreceive_tilde *)pd_new(spec2_tabreceive_tilde_class); x->x_arrayname = s; outlet_new(&x->x_obj, &s_signal); return (x); } void spec2_tabreceive_tilde_setup(void) { spec2_tabreceive_tilde_class = class_new(gensym("spec2_tabreceive~"), (t_newmethod)spec2_tabreceive_tilde_new, 0, sizeof(t_spec2_tabreceive_tilde), 0, A_DEFSYM, 0); class_addmethod(spec2_tabreceive_tilde_class, (t_method)spec2_tabreceive_tilde_dsp, gensym("dsp"), 0); class_addsymbol(spec2_tabreceive_tilde_class, (t_method)spec2_tabreceive_tilde_symbol); // class_sethelpsymbol(spec2_tabreceive_tilde_class, gensym("iemhelp/spec2_tabreceive~-help")); } iem_utils-v0.0.20180206/iem_spec2/src/iem_spec2.dsp0000644000175000017500000000500712630366347021713 0ustar zmoelnigzmoelnig# Microsoft Developer Studio Project File - Name="iem_spec2" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** NICHT BEARBEITEN ** # TARGTYPE "Win32 (x86) External Target" 0x0106 CFG=iem_spec2 - Win32 Debug !MESSAGE Dies ist kein gültiges Makefile. Zum Erstellen dieses Projekts mit NMAKE !MESSAGE verwenden Sie den Befehl "Makefile exportieren" und führen Sie den Befehl !MESSAGE !MESSAGE NMAKE /f "iem_spec2.mak". !MESSAGE !MESSAGE Sie können beim Ausführen von NMAKE eine Konfiguration angeben !MESSAGE durch Definieren des Makros CFG in der Befehlszeile. Zum Beispiel: !MESSAGE !MESSAGE NMAKE /f "iem_spec2.mak" CFG="iem_spec2 - Win32 Debug" !MESSAGE !MESSAGE Für die Konfiguration stehen zur Auswahl: !MESSAGE !MESSAGE "iem_spec2 - Win32 Release" (basierend auf "Win32 (x86) External Target") !MESSAGE "iem_spec2 - Win32 Debug" (basierend auf "Win32 (x86) External Target") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" !IF "$(CFG)" == "iem_spec2 - Win32 Release" # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "Release" # PROP BASE Intermediate_Dir "Release" # PROP BASE Cmd_Line "NMAKE /f makefile_win" # PROP BASE Rebuild_Opt "/a" # PROP BASE Target_File "makefile_win.exe" # PROP BASE Bsc_Name "makefile_win.bsc" # PROP BASE Target_Dir "" # PROP Use_Debug_Libraries 0 # PROP Output_Dir "Release" # PROP Intermediate_Dir "Release" # PROP Cmd_Line "NMAKE /f makefile_win" # PROP Rebuild_Opt "/a" # PROP Target_File "iem_spec2.exe" # PROP Bsc_Name "iem_spec2.bsc" # PROP Target_Dir "" !ELSEIF "$(CFG)" == "iem_spec2 - Win32 Debug" # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "Debug" # PROP BASE Intermediate_Dir "Debug" # PROP BASE Cmd_Line "NMAKE /f makefile_win" # PROP BASE Rebuild_Opt "/a" # PROP BASE Target_File "makefile_win.exe" # PROP BASE Bsc_Name "makefile_win.bsc" # PROP BASE Target_Dir "" # PROP Use_Debug_Libraries 1 # PROP Output_Dir "Debug" # PROP Intermediate_Dir "Debug" # PROP Cmd_Line "NMAKE /f makefile_win" # PROP Rebuild_Opt "/a" # PROP Target_File "iem_spec2.exe" # PROP Bsc_Name "iem_spec2.bsc" # PROP Target_Dir "" !ENDIF # Begin Target # Name "iem_spec2 - Win32 Release" # Name "iem_spec2 - Win32 Debug" !IF "$(CFG)" == "iem_spec2 - Win32 Release" !ELSEIF "$(CFG)" == "iem_spec2 - Win32 Debug" !ENDIF # Begin Source File SOURCE=.\makefile_win # End Source File # End Target # End Project iem_utils-v0.0.20180206/iem_spec2/src/spec2_dbtorms~.c0000644000175000017500000000336412630366347022451 0ustar zmoelnigzmoelnig/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_spec2 written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2006 */ #include "m_pd.h" #include "iemlib.h" #include #define SPEC2LOGTEN 2.302585092994f /* ------------------------ spec2_dbtorms_tilde~ ------------------------- */ static t_class *spec2_dbtorms_tilde_class; typedef struct _spec2_dbtorms_tilde { t_object x_obj; t_float x_msi; } t_spec2_dbtorms_tilde; static t_int *spec2_dbtorms_tilde_perform(t_int *w) { t_float *in = (t_float *)(w[1]); t_float *out = (t_float *)(w[2]); int n = w[3]+1; for (; n--; in++, out++) { t_float f = *in; if(f <= 0.0f) *out = 0.0f; else { if(f > 485.0f) f = 485.0f; *out = exp((SPEC2LOGTEN * 0.05f) * (f-100.0f)); } } return(w+4); } static void spec2_dbtorms_tilde_dsp(t_spec2_dbtorms_tilde *x, t_signal **sp) { int n = (sp[0]->s_n)/2; dsp_add(spec2_dbtorms_tilde_perform, 3, sp[0]->s_vec, sp[0]->s_vec, n); } static void *spec2_dbtorms_tilde_new(void) { t_spec2_dbtorms_tilde *x = (t_spec2_dbtorms_tilde *)pd_new(spec2_dbtorms_tilde_class); outlet_new(&x->x_obj, &s_signal); x->x_msi = 0.0f; return (x); } void spec2_dbtorms_tilde_setup(void) { spec2_dbtorms_tilde_class = class_new(gensym("spec2_dbtorms~"), (t_newmethod)spec2_dbtorms_tilde_new, 0, sizeof(t_spec2_dbtorms_tilde), 0, 0); CLASS_MAINSIGNALIN(spec2_dbtorms_tilde_class, t_spec2_dbtorms_tilde, x_msi); class_addmethod(spec2_dbtorms_tilde_class, (t_method)spec2_dbtorms_tilde_dsp, gensym("dsp"), 0); // class_sethelpsymbol(spec2_dbtorms_tilde_class, gensym("iemhelp2/spec2_dbtorms~-help")); } iem_utils-v0.0.20180206/iem_spec2/src/makefile0000644000175000017500000000002712630366347021032 0ustar zmoelnigzmoelniginclude makefile_linux iem_utils-v0.0.20180206/iem_spec2/spec2_tabreceive~-help.pd0000644000175000017500000000773612630366347023437 0ustar zmoelnigzmoelnig#N canvas 9 28 944 451 10; #X obj 44 49 dsp; #X obj 44 26 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0 1 ; #X floatatom 44 90 5 0 0 0 - - -; #X floatatom 57 73 5 0 0 0 - - -; #N canvas 0 0 450 300 graph1 0; #X array scope 512 float 0; #X coords 0 1 511 -1 512 100 1; #X restore 350 236 graph; #X obj 211 175 tabwrite~ scope; #X obj 269 55 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X text 17 -25 spec2_tabreceive~; #N canvas 0 0 450 300 graph2 0; #X array filter 256 float 1; #A 0 0 0 0 0 0 0 0 0.04 0.04 0.08 0.14 0.18 0.2 0.24 0.26 0.28 0.32 0.34 0.36 0.38 0.4 0.42 0.44 0.44 0.46 0.5 0.54 0.58 0.6 0.62 0.646667 0.673334 0.7 0.74 0.76 0.78 0 0 0 0 0 0 -0.06 -0.0866667 -0.113333 -0.14 -0.175 -0.21 -0.245 -0.28 -0.31 -0.34 -0.366667 -0.393333 -0.42 -0.45 -0.48 -0.52 -0.56 -0.58 -0.62 -0.62 -0.66 -0.67 -0.68 -0.7 -0.74 -0.76 -0.78 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.8 0.78 0.76 0.68 0.62 0.58 0.5 0.473334 0.446667 0.42 0.38 0.34 0.3 0.266667 0.233333 0.2 0.17 0.14 0.11 0.08 0.05 0.02 0 0 0 0 0 0 -0.68 -0.68 -0.62 -0.56 -0.52 -0.48 -0.45 -0.42 -0.37 -0.32 -0.28 -0.24 -0.19 -0.14 -0.12 -0.1 -0.08 -0.02 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0; #X coords 0 1 255 -1 256 100 1; #X restore 488 -33 graph; #X obj 226 88 del 100; #X msg 767 2 \; filter const 0; #N canvas 70 41 953 575 spec2_blockfilter~ 0; #X obj 100 51 inlet~; #X obj 102 381 outlet~; #X obj 271 120 block~ 256 2; #N canvas 0 0 450 300 graph1 0; #X array rect 256 float 0; #X coords 0 1 255 -1 200 140 1; #X restore 460 21 graph; #X obj 276 459 tab_const rect; #X obj 279 396 t b b; #X msg 304 421 0 128 1; #X msg 224 419 128 128 0; #X obj 279 374 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 279 350 loadbang; #X obj 100 135 rfft~; #X obj 101 284 rifft~; #X obj 101 309 /~ 256; #X obj 101 108 *~; #X obj 114 85 spec2_tabreceive~ rect; #N canvas 0 0 450 300 graph1 0; #X array real 256 float 0; #X coords 0 1 255 -1 200 140 1; #X restore 691 177 graph; #N canvas 0 0 450 300 graph1 0; #X array imag 256 float 0; #X coords 0 1 255 -1 200 140 1; #X restore 691 326 graph; #X obj 697 56 inlet; #X obj 697 80 t b; #X obj 246 153 spec2_tabreceive~ real; #X obj 262 178 spec2_tabreceive~ imag; #X text 407 178 1.arg: table-name; #X obj 157 264 spec2+~; #X obj 39 261 spec2-~; #X obj 31 216 spec2*~; #X obj 84 219 spec2*~; #X obj 145 218 spec2*~; #X obj 204 218 spec2*~; #X obj 697 102 tab_rfft filter real imag 256; #X connect 0 0 13 0; #X connect 5 0 7 0; #X connect 5 1 6 0; #X connect 6 0 4 0; #X connect 7 0 4 0; #X connect 8 0 5 0; #X connect 9 0 8 0; #X connect 10 0 24 0; #X connect 10 0 26 0; #X connect 10 1 25 0; #X connect 10 1 27 0; #X connect 11 0 12 0; #X connect 12 0 1 0; #X connect 13 0 10 0; #X connect 14 0 13 1; #X connect 17 0 18 0; #X connect 18 0 28 0; #X connect 19 0 24 1; #X connect 19 0 27 1; #X connect 20 0 25 1; #X connect 20 0 26 1; #X connect 22 0 11 1; #X connect 23 0 11 0; #X connect 24 0 23 0; #X connect 25 0 23 1; #X connect 26 0 22 0; #X connect 27 0 22 1; #X restore 248 137 pd spec2_blockfilter~ using spec2_tabreceive~; #X obj 582 122 spec2_tabreceive~ filter; #X text 735 121 1.arg: table-name; #X msg 607 92 symbol filter; #X text 90 302 IEM KUG; #X text 74 290 musil; #X text 104 290 @; #X text 110 290 iem.at; #X text 73 312 Graz \, Austria; #X text 25 279 (c) Thomas Musil 2000 - 2006; #X obj 249 114 dirac~; #X text 143 -11 iem_spec2 calculates only (blocksize/2 + 1) samples ; #X text 140 -27 receives spectrum from table with (blocksize/2 + 1) ; #X connect 0 0 2 0; #X connect 0 1 3 0; #X connect 1 0 0 0; #X connect 6 0 11 1; #X connect 6 0 9 0; #X connect 9 0 5 0; #X connect 9 0 21 0; #X connect 11 0 5 0; #X connect 14 0 12 0; #X connect 21 0 11 0; iem_utils-v0.0.20180206/iem_spec2/spec2_tab_conv~-help.pd0000644000175000017500000001147412630366347023113 0ustar zmoelnigzmoelnig#N canvas 9 18 777 596 10; #X obj 44 49 dsp; #X obj 44 26 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0 1 ; #X floatatom 44 90 5 0 0 0 - - -; #X floatatom 57 73 5 0 0 0 - - -; #N canvas 0 0 450 300 graph1 0; #X array win 50 float 0; #X coords 0 1 49 -1 200 140 1; #X restore 267 333 graph; #X floatatom 64 144 7 0 0 0 - - -; #X obj 189 188 noise~; #X floatatom 316 170 5 2 40 0 - - -; #X msg 316 147 8; #X text 22 -1 spec2_tab_conv~; #X obj 64 166 osc~ 5000; #N canvas 148 208 734 434 gen_win 0; #X obj 92 43 inlet; #X obj 92 121 - 1; #X obj 92 142 t f f; #X obj 92 167 / 20; #X obj 92 188 * 3.14159; #X obj 92 211 sin; #X msg 92 232 \$1 \$1; #X obj 92 254 *; #X obj 92 65 t b f b; #X msg 253 218 1 \$1; #X obj 253 240 /; #X obj 224 367 outlet; #X obj 225 315 f; #X msg 224 337 set win \$1; #X obj 527 33 table hwin 50; #X obj 242 124 tab_const hwin; #X obj 92 274 tabwrite hwin; #X obj 191 146 tab_sum hwin; #X obj 253 264 tab_mul_scalar hwin hwin; #X obj 191 192 tab_copy hwin win; #X obj 93 95 for++ 1 20; #X connect 0 0 8 0; #X connect 1 0 2 0; #X connect 2 0 3 0; #X connect 2 1 16 1; #X connect 3 0 4 0; #X connect 4 0 5 0; #X connect 5 0 6 0; #X connect 6 0 7 0; #X connect 7 0 16 0; #X connect 8 0 20 0; #X connect 8 1 3 1; #X connect 8 1 12 1; #X connect 8 1 20 1; #X connect 8 2 15 0; #X connect 9 0 10 0; #X connect 10 0 18 0; #X connect 12 0 13 0; #X connect 13 0 11 0; #X connect 17 0 19 0; #X connect 17 1 9 0; #X connect 19 0 12 0; #X connect 20 0 1 0; #X connect 20 1 17 0; #X restore 316 189 pd gen_win; #X obj 316 124 loadbang; #N canvas 6 92 777 603 spec2_blockfilter~ 0; #X obj 59 29 inlet~; #X obj 72 488 outlet~; #X obj 61 101 rfft~; #X obj 71 392 rifft~; #X obj 407 22 inlet; #X text 199 240 1.arg: table-name; #X obj 474 23 block~ 256 2; #N canvas 0 0 450 300 graph1 0; #X array hsin 256 float 0; #X coords 0 1 255 -1 200 140 1; #X restore 423 296 graph; #X obj 458 140 for++ 0 255 0.1; #X obj 458 119 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 458 160 t f f; #X obj 457 190 / 256; #X obj 457 210 * 3.14159; #X obj 457 229 sin; #X obj 457 251 tabwrite hsin; #X obj 72 51 tabreceive~ hsin; #X obj 60 73 *~; #X obj 458 95 loadbang; #X obj 241 100 rfft~; #X obj 252 50 tabreceive~ hsin; #X obj 240 72 *~; #X obj 241 26 inlet~; #X obj 84 417 tabreceive~ hsin; #X obj 72 439 *~; #X text 199 251 2.arg: table-size; #X obj 72 463 /~ 32768; #X obj 59 290 spec2_dbtorms~; #X obj 65 363 spec2*~; #X obj 122 366 spec2*~; #X obj 58 178 spec2+~; #X obj 47 151 spec2*~; #X obj 94 151 spec2*~; #X obj 58 201 spec2_powtodb~; #X obj 59 247 spec2_tab_conv~ win 8; #X connect 0 0 16 0; #X connect 2 0 30 0; #X connect 2 0 30 1; #X connect 2 1 31 0; #X connect 2 1 31 1; #X connect 3 0 23 0; #X connect 4 0 33 0; #X connect 8 0 10 0; #X connect 9 0 8 0; #X connect 10 0 11 0; #X connect 10 1 14 1; #X connect 11 0 12 0; #X connect 12 0 13 0; #X connect 13 0 14 0; #X connect 15 0 16 1; #X connect 16 0 2 0; #X connect 17 0 9 0; #X connect 18 0 27 1; #X connect 18 1 28 1; #X connect 19 0 20 1; #X connect 20 0 18 0; #X connect 21 0 20 0; #X connect 22 0 23 1; #X connect 23 0 25 0; #X connect 25 0 1 0; #X connect 26 0 27 0; #X connect 26 0 28 0; #X connect 27 0 3 0; #X connect 28 0 3 1; #X connect 29 0 32 0; #X connect 30 0 29 0; #X connect 31 0 29 1; #X connect 32 0 33 0; #X connect 33 0 26 0; #X restore 64 211 pd spec2_blockfilter~ using spec2_tab_conv~; #X text 550 227 1.arg: table-name; #X text 551 240 2.arg: table-size; #X msg 429 209 set win 8; #X obj 408 234 spec2_tab_conv~ win 8; #X obj 68 298 dac~; #X obj 144 311 prvu~; #X obj 145 339 vu 15 120 empty empty -1 -8 0 8 -66577 -1 1 0; #X floatatom 143 505 5 0 0 0 - - -; #X floatatom 154 479 5 0 0 0 - - -; #X msg 156 288 reset; #X text 146 4 convolute a spectrum of size (blocksize/2 + 1) with a table of size n; #X obj 69 266 *~ 0.003; #X obj 133 255 dbtorms; #X obj 201 252 hsl 128 15 0 127 0 0 empty empty empty -2 -6 0 8 -262144 -1 -1 0 1; #X obj 161 131 mtof; #X obj 165 111 hsl 137 15 0 136 0 0 empty empty empty -2 -6 0 8 -262144 -1 -1 0 1; #X text 98 553 IEM KUG; #X text 82 541 musil; #X text 112 541 @; #X text 118 541 iem.at; #X text 81 563 Graz \, Austria; #X text 33 530 (c) Thomas Musil 2000 - 2006; #X connect 0 0 2 0; #X connect 0 1 3 0; #X connect 1 0 0 0; #X connect 5 0 10 0; #X connect 6 0 13 1; #X connect 7 0 11 0; #X connect 8 0 7 0; #X connect 10 0 13 0; #X connect 11 0 13 2; #X connect 12 0 8 0; #X connect 13 0 25 0; #X connect 16 0 17 0; #X connect 19 0 20 0; #X connect 20 0 21 0; #X connect 20 1 22 0; #X connect 23 0 19 0; #X connect 25 0 19 0; #X connect 25 0 18 0; #X connect 25 0 18 1; #X connect 26 0 25 1; #X connect 27 0 26 0; #X connect 28 0 5 0; #X connect 29 0 28 0; iem_utils-v0.0.20180206/iem_spec2/spec2_1p1z_freq~-help.pd0000644000175000017500000000471612630366347023131 0ustar zmoelnigzmoelnig#N canvas 20 32 724 388 10; #X obj 42 70 dsp; #X obj 42 47 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 1 1 ; #X floatatom 42 111 5 0 0 0 - - -; #X floatatom 55 94 5 0 0 0 - - -; #N canvas 0 0 450 300 graph1 0; #X array scope 256 float 0; #X coords 0 100 255 0 300 200 1; #X restore 346 82 graph; #X text 130 39 iem_spec2 calculates only blocksize/2 + 1 samples of block; #N canvas 0 0 633 408 tables 0; #N canvas 0 0 450 300 graph1 0; #X array hann 259 float 0; #X coords 0 1 258 -1 200 140 1; #X restore 30 31 graph; #X obj 246 34 loadbang; #X msg 246 55 \; hann cosinesum 256 0.5 -0.5; #X connect 1 0 2 0; #X restore 149 82 pd tables; #X obj 42 145 noise~; #X obj 237 93 osc~ 11025; #X msg 292 58 0; #X obj 42 169 bpq2~ 7000 6 100; #X msg 206 187 1 0 0; #X msg 205 121 0.1 0 0.9; #X text 90 302 IEM KUG; #X text 74 290 musil; #X text 104 290 @; #X text 110 290 iem.at; #X text 73 312 Graz \, Austria; #X text 25 279 (c) Thomas Musil 2000 - 2006; #X text 18 5 spec2_1p1z_freq~; #N canvas 190 113 569 461 spec_analyse_by_1p1z_freq 0; #X obj 100 51 inlet~; #X obj 352 46 block~ 256 2; #X obj 102 156 rfft~; #X obj 101 108 *~; #X obj 298 46 inlet; #X obj 114 86 spec2_tabreceive~ hann; #X obj 97 186 *~; #X obj 124 186 *~; #X obj 104 211 +~; #X obj 104 266 powtodb~; #X obj 104 291 tabsend~ scope; #X obj 180 174 /; #X obj 101 131 *~ 0.032; #X msg 189 149 1 32; #X obj 188 127 loadbang; #X obj 300 225 spec2_1p1z_freq~ 0.5 0 0.5; #X connect 0 0 3 0; #X connect 2 0 6 0; #X connect 2 0 6 1; #X connect 2 1 7 0; #X connect 2 1 7 1; #X connect 3 0 12 0; #X connect 4 0 15 0; #X connect 5 0 3 1; #X connect 6 0 8 0; #X connect 7 0 8 1; #X connect 8 0 15 0; #X connect 9 0 10 0; #X connect 11 0 12 1; #X connect 12 0 2 0; #X connect 13 0 11 0; #X connect 14 0 13 0; #X connect 15 0 9 0; #X restore 42 214 pd spec_analyse_by_1p1z_freq; #X msg 205 143 0.3 0 0.7; #X msg 205 165 0.5 0 0.5; #X msg 105 123 6; #X msg 107 143 3; #X msg 134 122 16; #X msg 164 121 66; #X text 168 3 filter the spectrum with a 1p1z-IIR filter; #X text 169 14 first time from the left to right; #X text 169 26 second time from the right to left; #X connect 0 0 2 0; #X connect 0 1 3 0; #X connect 1 0 0 0; #X connect 7 0 10 0; #X connect 9 0 8 1; #X connect 10 0 20 0; #X connect 11 0 20 1; #X connect 12 0 20 1; #X connect 21 0 20 1; #X connect 22 0 20 1; #X connect 23 0 10 2; #X connect 24 0 10 2; #X connect 25 0 10 2; #X connect 26 0 10 2; iem_utils-v0.0.20180206/iem_spec2/spec2_stretch~-help.pd0000644000175000017500000000267612630366347023000 0ustar zmoelnigzmoelnig#N canvas 10 8 548 293 10; #X obj 15 90 dsp; #X obj 15 67 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 1 1 ; #X floatatom 15 131 5 0 0 0 - - -; #X floatatom 28 114 5 0 0 0 - - -; #N canvas 0 0 450 300 graph2 0; #X array array100 64 float 1; #A 0 -0.550001 -0.750001 -0.700001 -0.600001 -0.500001 -0.400001 -0.400001 -0.350001 -0.25 -0.2 -0.15 -0.1 -0.0500001 -0.0500001 3.72529e-008 0.0500001 0.0500001 0.1 0.1 0.15 0.2 0.2 0.250001 0.250001 0.300001 0.350001 0.350001 0.400001 0.500001 0.500001 0.516668 0.533334 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0; #X coords 0 1 63 -1 64 40 1; #X restore 436 66 graph; #X text 83 210 IEM KUG; #X text 67 198 musil; #X text 97 198 @; #X text 103 198 iem.at; #X text 66 220 Graz \, Austria; #X text 18 187 (c) Thomas Musil 2000 - 2006; #N canvas 0 0 450 300 graph2 0; #X array array101 64 float 0; #X coords 0 1 63 -1 64 40 1; #X restore 436 126 graph; #X obj 144 131 tabsend~ array101; #X obj 142 71 tabreceive~ array100; #X floatatom 93 41 5 20 500 0 - - -; #X obj 143 102 spec2_stretch~ 1; #X obj 93 58 / 100; #X floatatom 93 78 5 0 0 0 - - -; #X text 16 10 spec2_stretch~; #X text 137 6 stretch a spectrum of (blocksize/2 + 1) by a factor; #X text 256 102 1.arg: stretch factor; #X connect 0 0 2 0; #X connect 0 1 3 0; #X connect 1 0 0 0; #X connect 13 0 15 0; #X connect 14 0 16 0; #X connect 15 0 12 0; #X connect 16 0 17 0; #X connect 17 0 15 0; iem_utils-v0.0.20180206/iem_spec2/spec2_block_delay~-help.pd0000644000175000017500000000421112630366347023557 0ustar zmoelnigzmoelnig#N canvas 90 35 769 482 10; #X obj 42 70 dsp; #X obj 42 47 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 1 1 ; #X floatatom 42 111 5 0 0 0 - - -; #X floatatom 55 94 5 0 0 0 - - -; #N canvas 0 0 450 300 graph1 0; #X array array101 192 float 0; #X coords 0 1 191 -1 382 128 1; #X restore 319 224 graph; #X obj 46 156 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X text 19 4 spec2_block_delay~; #X text 202 216 no arguments; #X text 90 402 IEM KUG; #X text 74 390 musil; #X text 104 390 @; #X text 110 390 iem.at; #X text 73 412 Graz \, Austria; #X text 25 379 (c) Thomas Musil 2000 - 2006; #X obj 84 217 spec2_block_delay~; #X text 146 21 but copy only (blocksize/2 + 1) samples; #N canvas 0 0 470 320 init 0; #X obj 52 43 t f f; #X obj 50 -10 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 43 77 + 0.5; #X obj 52 -36 loadbang; #X obj 50 11 for++ -64 63; #X obj 56 107 / 64; #X obj 101 105 + 64; #X obj 57 147 tabwrite array100; #X msg 161 -9 \; array100 xticks 0 32 2; #X msg 174 75 \; array101 xticks 0 32 2; #X msg 177 125 \; array101 xlabel -1.1 0 32 64 96 128 160 192; #X msg 165 30 \; array100 xlabel -1.1 0 32 64 96 128; #X connect 0 0 2 0; #X connect 0 1 6 0; #X connect 1 0 4 0; #X connect 2 0 5 0; #X connect 3 0 1 0; #X connect 3 0 8 0; #X connect 3 0 11 0; #X connect 3 0 9 0; #X connect 3 0 10 0; #X connect 4 0 0 0; #X connect 5 0 7 0; #X connect 6 0 7 1; #X restore 323 394 pd init; #N canvas 0 0 450 300 graph1 0; #X array array100 128 float 0; #X coords 0 1 127 -1 256 128 1; #X restore 319 62 graph; #X obj 84 192 tabplay~ array100; #X obj 46 252 tabwrite~ array101; #X text 161 4 delay spectrum around blocksize samples; #X text 484 372 0 .. 32: preceding signal (== 0); #X text 480 385 33 .. 63: ignored input ramp; #X text 481 399 64 .. 96: delayed ramp signal; #X text 477 412 97 .. 127: ignored input ramp; #X text 473 425 128 .. 160: delayed ramp signal; #X text 471 438 161 .. 191: ignored input signal (== 0); #X connect 0 0 2 0; #X connect 0 1 3 0; #X connect 1 0 0 0; #X connect 5 0 18 0; #X connect 5 0 19 0; #X connect 14 0 19 0; #X connect 18 0 14 0; iem_utils-v0.0.20180206/iem_spec2/spec2_powtodb~-help.pd0000644000175000017500000000066312630366347022774 0ustar zmoelnigzmoelnig#N canvas 52 29 470 263 10; #X text 120 53 no arg; #X text 83 169 IEM KUG; #X text 67 157 musil; #X text 97 157 @; #X text 103 157 iem.at; #X text 66 179 Graz \, Austria; #X text 18 146 (c) Thomas Musil 2000 - 2006; #X text 211 52 like; #X text 135 24 with (blocksize/2 + 1) bins; #X obj 26 53 spec2_powtodb~; #X text 29 15 spec2_powtodb~; #X obj 243 54 powtodb~; #X text 133 13 convert power to db of a signal spectrum; iem_utils-v0.0.20180206/iem_spec2/spec2_dbtorms~-help.pd0000644000175000017500000000066712630366347022774 0ustar zmoelnigzmoelnig#N canvas 52 29 470 263 10; #X text 120 53 no arg; #X text 83 169 IEM KUG; #X text 67 157 musil; #X text 97 157 @; #X text 103 157 iem.at; #X text 66 179 Graz \, Austria; #X text 18 146 (c) Thomas Musil 2000 - 2006; #X text 211 52 like; #X text 135 24 with (blocksize/2 + 1) bins; #X text 29 15 spec2_dbtorms~; #X obj 243 54 dbtorms~; #X obj 26 53 spec2_dbtorms~; #X text 132 13 convert dB to rms value of a signal spectrum; iem_utils-v0.0.20180206/iem_spec2/spec2_rmstodb~-help.pd0000644000175000017500000000066712630366347022774 0ustar zmoelnigzmoelnig#N canvas 52 29 470 263 10; #X text 120 53 no arg; #X text 83 169 IEM KUG; #X text 67 157 musil; #X text 97 157 @; #X text 103 157 iem.at; #X text 66 179 Graz \, Austria; #X text 18 146 (c) Thomas Musil 2000 - 2006; #X text 211 52 like; #X text 135 24 with (blocksize/2 + 1) bins; #X text 29 15 spec2_rmstodb~; #X text 132 13 convert rms value to db of a signal spectrum; #X obj 26 53 spec2_rmstodb~; #X obj 243 54 rmstodb~; iem_utils-v0.0.20180206/iem_spec2/spec2_abs~-help.pd0000644000175000017500000000064712630366347022065 0ustar zmoelnigzmoelnig#N canvas 52 28 470 264 10; #X text 102 53 no arg; #X text 83 169 IEM KUG; #X text 67 157 musil; #X text 97 157 @; #X text 103 157 iem.at; #X text 66 179 Graz \, Austria; #X text 18 146 (c) Thomas Musil 2000 - 2006; #X text 183 49 like; #X obj 29 52 spec2_abs~; #X text 30 16 spec2_abs~; #X obj 226 52 abs~; #X text 109 25 with (blocksize/2 + 1) bins; #X text 106 14 take absolute value of a signal spectrum; iem_utils-v0.0.20180206/iem_spec2/READ_ME.txt0000644000175000017500000000140612630366347020402 0ustar zmoelnigzmoelnigThis library extends the performance of miller puckette's pure data (pd). iem_spec2 is written by Thomas Musil from IEM Graz Austria and it is compatible to miller puckette's pd-0.37-3 to pd-0.39-2. see also LICENCE.txt, GnuGPL.txt. iem_spec2 contains 23 objects: all of them calculate only blocksize/2 + 1 samples of a signal vector; spec2_abs~, spec2+~, spec2*~, spec2-~, spec2_dbtopow~, spec2_dbtorms~, spec2_powtodb~, spec2_rmstodb~, spec2_sqrt~, spec2_tabreceive~ do the same as objects without spec2_ prefix; the other objects are: spec2_1p1z_freq~, spec2_1p1z_time~, spec2_+s~, spec2_block_delay~, spec2_clip_max~, spec2_clip_min~, spec2_matrix_bundle_stat~, spec2_*s~, spec2_shift~, spec2_stretch~, spec2_sum~, spec2_tab_conv~, spec2_tabreceive_enable~. iem_utils-v0.0.20180206/iem_spec2/spec2_dbtopow~-help.pd0000644000175000017500000000066312630366347022774 0ustar zmoelnigzmoelnig#N canvas 52 29 470 263 10; #X text 120 53 no arg; #X text 83 169 IEM KUG; #X text 67 157 musil; #X text 97 157 @; #X text 103 157 iem.at; #X text 66 179 Graz \, Austria; #X text 18 146 (c) Thomas Musil 2000 - 2006; #X text 211 52 like; #X text 135 24 with (blocksize/2 + 1) bins; #X obj 243 54 dbtopow~; #X obj 26 53 spec2_dbtopow~; #X text 29 15 spec2_dbtopow~; #X text 132 13 convert dB to power of a signal spectrum; iem_utils-v0.0.20180206/iem_spec2/spec2_mul~-help.pd0000644000175000017500000000060112630366347022103 0ustar zmoelnigzmoelnig#N canvas 52 28 474 268 10; #X text 86 51 no arg; #X text 83 169 IEM KUG; #X text 67 157 musil; #X text 97 157 @; #X text 103 157 iem.at; #X text 66 179 Graz \, Austria; #X text 18 146 (c) Thomas Musil 2000 - 2006; #X text 183 49 like; #X text 30 15 spec2*~; #X obj 30 52 spec2*~; #X obj 234 50 *~; #X text 106 14 multiply 2 signal spectras with (blocksize/2 + 1) bins ; iem_utils-v0.0.20180206/iem_spec2/spec2_add~-help.pd0000644000175000017500000000057212630366347022045 0ustar zmoelnigzmoelnig#N canvas 52 28 474 268 10; #X obj 30 52 spec2+~; #X text 86 51 no arg; #X text 83 169 IEM KUG; #X text 67 157 musil; #X text 97 157 @; #X text 103 157 iem.at; #X text 66 179 Graz \, Austria; #X text 18 146 (c) Thomas Musil 2000 - 2006; #X text 30 15 spec2+~; #X text 183 49 like; #X obj 234 50 +~; #X text 106 14 add 2 signal spectras with (blocksize/2 + 1) bins; iem_utils-v0.0.20180206/iem_spec2/spec2_clip_max~-help.pd0000644000175000017500000000203012630366347023100 0ustar zmoelnigzmoelnig#N canvas 52 28 606 339 10; #X text 230 141 no arg; #X text 81 272 IEM KUG; #X text 65 260 musil; #X text 95 260 @; #X text 101 260 iem.at; #X text 64 282 Graz \, Austria; #X text 16 249 (c) Thomas Musil 2000 - 2006; #X text 351 143 like; #X obj 128 141 spec2_clip_max~; #X obj 128 118 sig~; #X floatatom 128 98 5 0 0 0 - - -; #X obj 212 118 sig~; #X floatatom 212 98 5 0 0 0 - - -; #X obj 401 144 min~; #X text 9 6 spec2_clip_max~; #X obj 21 61 dsp; #X obj 21 38 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0 1 ; #X floatatom 21 107 5 0 0 0 - - -; #X floatatom 34 86 5 0 0 0 - - -; #X text 120 28 iem_spec2 calculates only blocksize/2 + 1 samples of block; #X text 139 9 restrict a signal to lie lower than max limit; #X obj 84 179 print~; #X obj 85 159 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X connect 8 0 21 0; #X connect 9 0 8 0; #X connect 10 0 9 0; #X connect 11 0 8 1; #X connect 12 0 11 0; #X connect 15 0 17 0; #X connect 15 1 18 0; #X connect 16 0 15 0; #X connect 22 0 21 0; iem_utils-v0.0.20180206/iem_spec2/spec2_mul_scalar~-help.pd0000644000175000017500000000067612630366347023444 0ustar zmoelnigzmoelnig#N canvas 52 28 591 268 10; #X text 83 169 IEM KUG; #X text 67 157 musil; #X text 97 157 @; #X text 103 157 iem.at; #X text 66 179 Graz \, Austria; #X text 18 146 (c) Thomas Musil 2000 - 2006; #X text 361 51 like; #X text 30 14 spec2*s~; #X text 107 26 with (blocksize/2 + 1) bins; #X text 106 14 multiply a value with a signal spectrum; #X text 134 53 1.arg: value to multiply; #X obj 30 52 spec2*s~ 0; #X obj 412 52 *~ 0; iem_utils-v0.0.20180206/iem_spec2/spec2_tabreceive_enable~-help.pd0000644000175000017500000001065012630366347024732 0ustar zmoelnigzmoelnig#N canvas 22 17 939 438 10; #X obj 44 49 dsp; #X obj 44 26 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0 1 ; #X floatatom 44 90 5 0 0 0 - - -; #X floatatom 57 73 5 0 0 0 - - -; #N canvas 0 0 450 300 graph1 0; #X array scope 512 float 0; #X coords 0 1 511 -1 512 100 1; #X restore 371 240 graph; #X obj 121 178 tabwrite~ scope; #X obj 211 47 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #N canvas 0 0 450 300 graph2 0; #X array filter 256 float 1; #A 0 0 0 0 0 0 0 0 0.04 0.04 0.08 0.14 0.18 0.2 0.24 0.26 0.28 0.32 0.34 0.36 0.38 0.4 0.42 0.44 0.44 0.46 0.5 0.54 0.58 0.6 0.62 0.646667 0.673334 0.7 0.74 0.76 0.78 0 0 0 0 0 0 -0.06 -0.0866667 -0.113333 -0.14 -0.175 -0.21 -0.245 -0.28 -0.31 -0.34 -0.366667 -0.393333 -0.42 -0.45 -0.48 -0.52 -0.56 -0.58 -0.62 -0.62 -0.66 -0.67 -0.68 -0.7 -0.74 -0.76 -0.78 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.8 0.78 0.76 0.68 0.62 0.58 0.5 0.473334 0.446667 0.42 0.38 0.34 0.3 0.266667 0.233333 0.2 0.17 0.14 0.11 0.08 0.05 0.02 0 0 0 0 0 0 -0.68 -0.68 -0.62 -0.56 -0.52 -0.48 -0.45 -0.42 -0.37 -0.32 -0.28 -0.24 -0.19 -0.14 -0.12 -0.1 -0.08 -0.02 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0; #X coords 0 1 255 -1 256 100 1; #X restore 502 -33 graph; #X obj 136 91 del 100; #X msg 781 2 \; filter const 0; #X text 14 -28 spec2_tabreceive_enable~; #X obj 278 47 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0 1 ; #X text 295 47 enable; #X text 209 -15 and enables/disables reading the table; #N canvas 63 41 965 587 spec2_blockfilter~ 0; #X obj 100 51 inlet~; #X obj 102 381 outlet~; #X obj 271 120 block~ 256 2; #N canvas 0 0 450 300 graph1 0; #X array rect 256 float 0; #X coords 0 1 255 -1 200 140 1; #X restore 460 21 graph; #X obj 276 459 tab_const rect; #X obj 279 396 t b b; #X msg 304 421 0 128 1; #X msg 224 419 128 128 0; #X obj 279 374 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 279 350 loadbang; #X obj 101 309 /~ 256; #X obj 101 108 *~; #X obj 114 85 spec2_tabreceive~ rect; #N canvas 0 0 450 300 graph1 0; #X array real 256 float 0; #X coords 0 1 255 -1 200 140 1; #X restore 691 177 graph; #N canvas 0 0 450 300 graph1 0; #X array imag 256 float 0; #X coords 0 1 255 -1 200 140 1; #X restore 691 326 graph; #X obj 697 56 inlet; #X obj 697 80 t b; #X text 351 190 1.arg: table-name; #X obj 291 54 inlet; #X obj 101 131 rfft~; #X obj 102 280 rifft~; #X obj 158 260 spec2+~; #X obj 40 257 spec2-~; #X obj 32 212 spec2*~; #X obj 85 215 spec2*~; #X obj 146 214 spec2*~; #X obj 205 214 spec2*~; #X obj 247 149 spec2_tabreceive_enable~ real 0; #X obj 263 174 spec2_tabreceive_enable~ imag 0; #X text 352 205 2.arg: enable-state; #X obj 697 102 tab_rfft filter real imag 256; #X connect 0 0 11 0; #X connect 5 0 7 0; #X connect 5 1 6 0; #X connect 6 0 4 0; #X connect 7 0 4 0; #X connect 8 0 5 0; #X connect 9 0 8 0; #X connect 10 0 1 0; #X connect 11 0 19 0; #X connect 12 0 11 1; #X connect 15 0 16 0; #X connect 16 0 30 0; #X connect 18 0 27 0; #X connect 18 0 28 0; #X connect 19 0 23 0; #X connect 19 0 25 0; #X connect 19 1 24 0; #X connect 19 1 26 0; #X connect 20 0 10 0; #X connect 21 0 20 1; #X connect 22 0 20 0; #X connect 23 0 22 0; #X connect 24 0 22 1; #X connect 25 0 21 0; #X connect 26 0 21 1; #X connect 27 0 23 1; #X connect 27 0 26 1; #X connect 28 0 24 1; #X connect 28 0 25 1; #X restore 158 141 pd spec2_blockfilter~ using spec2_tabreceive_enable~ ; #X text 749 122 1.arg: table-name; #X msg 561 99 symbol filter; #X text 749 134 2.arg: enable-state; #X obj 536 129 spec2_tabreceive_enable~ filter 1; #X msg 496 89 1; #X msg 524 89 0; #X obj 159 117 dirac~; #X text 150 2 iem_spec2 calculates only (blocksize/2 + 1) samples; #X text 180 -27 receives spectrum from table with (blocksize/2 + 1) ; #X text 90 302 IEM KUG; #X text 74 290 musil; #X text 104 290 @; #X text 110 290 iem.at; #X text 73 312 Graz \, Austria; #X text 25 279 (c) Thomas Musil 2000 - 2006; #X connect 0 0 2 0; #X connect 0 1 3 0; #X connect 1 0 0 0; #X connect 6 0 14 2; #X connect 6 0 8 0; #X connect 8 0 5 0; #X connect 8 0 21 0; #X connect 11 0 14 1; #X connect 14 0 5 0; #X connect 16 0 18 0; #X connect 19 0 18 0; #X connect 20 0 18 0; #X connect 21 0 14 0; iem_utils-v0.0.20180206/iem_spec2/spec2_1p1z_time~-help.pd0000644000175000017500000000420312630366347023121 0ustar zmoelnigzmoelnig#N canvas 20 32 712 376 10; #X obj 42 70 dsp; #X obj 42 47 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 1 1 ; #X floatatom 42 111 5 0 0 0 - - -; #X floatatom 55 94 5 0 0 0 - - -; #N canvas 0 0 450 300 graph1 0; #X array scope 256 float 0; #X coords 0 100 255 0 300 200 1; #X restore 346 82 graph; #X text 18 5 spec2_1p1z_time~; #X text 132 20 iem_spec2 calculates only blocksize/2 + 1 samples of block; #N canvas 0 0 629 404 tables 0; #N canvas 0 0 450 300 graph1 0; #X array hann 259 float 0; #X coords 0 1 258 -1 200 140 1; #X restore 30 31 graph; #X obj 246 34 loadbang; #X msg 246 55 \; hann cosinesum 256 0.5 -0.5; #X connect 1 0 2 0; #X restore 149 82 pd tables; #X obj 42 145 noise~; #X obj 237 93 osc~ 11025; #X msg 292 58 0; #X obj 42 169 bpq2~ 7000 6 100; #X msg 201 187 1 0 0; #X msg 200 165 0.1 0 0.9; #X msg 200 143 0.01 0 0.99; #N canvas 190 113 557 449 spec_analyse_by_1p1z_time 0; #X obj 100 51 inlet~; #X obj 352 46 block~ 256 2; #X obj 102 156 rfft~; #X obj 101 108 *~; #X obj 300 225 spec2_1p1z_time~ 0.5 0 0.5; #X obj 298 46 inlet; #X obj 114 86 spec2_tabreceive~ hann; #X obj 97 186 *~; #X obj 124 186 *~; #X obj 104 211 +~; #X obj 104 266 powtodb~; #X obj 104 291 tabsend~ scope; #X obj 180 174 /; #X obj 101 131 *~ 0.032; #X msg 189 149 1 32; #X obj 188 127 loadbang; #X connect 0 0 3 0; #X connect 2 0 7 0; #X connect 2 0 7 1; #X connect 2 1 8 0; #X connect 2 1 8 1; #X connect 3 0 13 0; #X connect 4 0 10 0; #X connect 5 0 4 0; #X connect 6 0 3 1; #X connect 7 0 9 0; #X connect 8 0 9 1; #X connect 9 0 4 0; #X connect 10 0 11 0; #X connect 12 0 13 1; #X connect 13 0 2 0; #X connect 14 0 12 0; #X connect 15 0 14 0; #X restore 42 214 pd spec_analyse_by_1p1z_time; #X text 90 302 IEM KUG; #X text 74 290 musil; #X text 104 290 @; #X text 110 290 iem.at; #X text 73 312 Graz \, Austria; #X text 25 279 (c) Thomas Musil 2000 - 2006; #X text 168 3 makes a feedback of the spectrum; #X connect 0 0 2 0; #X connect 0 1 3 0; #X connect 1 0 0 0; #X connect 8 0 11 0; #X connect 10 0 9 1; #X connect 11 0 15 0; #X connect 12 0 15 1; #X connect 13 0 15 1; #X connect 14 0 15 1; iem_utils-v0.0.20180206/iem_spec2/spec2_matrix_bundle_stat~-help.pd0000644000175000017500000001101712630366347025201 0ustar zmoelnigzmoelnig#N canvas 106 40 882 682 10; #X obj 18 44 dsp; #X obj 18 14 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0 1 ; #X floatatom 18 100 5 0 0 0 - - -; #X floatatom 33 74 5 0 0 0 - - -; #X obj 46 322 sig~ 1; #X obj 96 353 sig~ 2; #X obj 145 377 sig~ 4; #X obj 195 402 sig~ 8; #X obj 234 431 sig~ 16; #X obj 47 488 unsig~; #X floatatom 47 512 5 0 0 0 - - -; #X obj 245 491 unsig~; #X floatatom 245 515 5 0 0 0 - - -; #X obj 298 442 any; #X msg 298 154 bundle 0 0 0 0 0; #X msg 298 180 bundle 1 1 1 1 1; #X msg 298 201 bundle 2 2 2 2 2; #X msg 298 227 bundle 1 0 0 0 0; #X msg 298 247 bundle 0 1 0 0 0; #X msg 298 267 bundle 0 0 1 0 0; #X msg 298 287 bundle 0 0 0 1 0; #X msg 298 307 bundle 0 0 0 0 1; #X msg 298 333 bundle 2 0 0 0 0; #X msg 298 353 bundle 0 2 0 0 0; #X msg 298 373 bundle 0 0 2 0 0; #X msg 298 393 bundle 0 0 0 2 0; #X msg 298 413 bundle 0 0 0 0 2; #X obj 432 442 pp element; #X obj 432 419 pack 0 0; #X obj 432 397 f; #X floatatom 475 368 4 1 5 0 - - -; #X floatatom 445 368 4 0 2 0 - - -; #X obj 422 375 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X text 706 15 SIG_OUT = A * SIG_IN; #X text 234 14 multiplies a n-dimensional signal-in-vector with a dynamic static (like sig~) signal-matrix to a n-dimensional signal-out-vector ; #X text 725 33 A is quadratic; #X text 662 50 dim(SIG_OUT) = dim(SIG_IN) = n; #X text 234 51 each matrix-column has only one one \, the other elements are zero; #X text 301 475 2.arg Nr. of outlets = rows; #X text 301 464 1.arg Nr. of inlets = columns; #X text 517 336 message "element"; #X text 531 365 2.) item column_index (1 .. nr_columns); #X text 531 353 1.) item row_index (0 .. nr_rows); #X text 446 111 message "bundle"; #X text 556 381 where the single one of the column will be placed; #X text 557 393 if (row-index == 0) -> the column has only zeros; #X text 449 126 (nr_inlets = nr_columns) row-indices (0 .. nr_row); #X text 454 162 if (row-index == 0) -> the column has only zeros; #X text 453 150 where the single one of each column will be placed ; #N canvas 176 206 818 475 block_______________________ 0; #X obj 564 88 block~ 128 2; #X obj 48 29 inlet~; #X obj 51 260 outlet~; #X obj 103 30 inlet~; #X obj 159 29 inlet~; #X obj 214 30 inlet~; #X obj 272 30 inlet~; #X obj 246 257 outlet~; #X obj 51 209 spec2_matrix_bundle_stat~ 5 2; #X obj 350 30 inlet; #X obj 586 308 for++ 0 127 0.1; #X obj 586 332 moses 64; #X msg 586 359 1 \$1; #X msg 637 358 0 \$1; #X obj 586 287 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 586 267 loadbang; #X obj 540 240 table \$0_rect 128; #X obj 586 385 tabwrite \$0_rect; #X obj 64 57 tabreceive~ \$0_rect; #X obj 48 79 *~; #X obj 116 81 tabreceive~ \$0_rect; #X obj 100 103 *~; #X obj 170 103 tabreceive~ \$0_rect; #X obj 154 125 *~; #X obj 220 124 tabreceive~ \$0_rect; #X obj 204 146 *~; #X obj 270 146 tabreceive~ \$0_rect; #X obj 254 168 *~; #X connect 1 0 19 0; #X connect 3 0 21 0; #X connect 4 0 23 0; #X connect 5 0 25 0; #X connect 6 0 27 0; #X connect 8 0 2 0; #X connect 8 1 7 0; #X connect 9 0 8 0; #X connect 10 0 11 0; #X connect 11 0 12 0; #X connect 11 1 13 0; #X connect 12 0 17 0; #X connect 13 0 17 0; #X connect 14 0 10 0; #X connect 15 0 14 0; #X connect 18 0 19 1; #X connect 19 0 8 0; #X connect 20 0 21 1; #X connect 21 0 8 1; #X connect 22 0 23 1; #X connect 23 0 8 2; #X connect 24 0 25 1; #X connect 25 0 8 3; #X connect 26 0 27 1; #X connect 27 0 8 4; #X restore 48 463 pd block_______________________; #X text 50 13 spec2_matrix_bundle_stat~; #X text 90 575 IEM KUG; #X text 74 563 musil; #X text 104 563 @; #X text 110 563 iem.at; #X text 73 585 Graz \, Austria; #X text 25 552 (c) Thomas Musil 2000 - 2006; #X text 234 83 it calculates matrix only with (blocksize/2 + 1) samples per signalvector; #X connect 0 0 2 0; #X connect 0 1 3 0; #X connect 1 0 0 0; #X connect 4 0 49 0; #X connect 5 0 49 1; #X connect 6 0 49 2; #X connect 7 0 49 3; #X connect 8 0 49 4; #X connect 9 0 10 0; #X connect 11 0 12 0; #X connect 13 0 49 5; #X connect 14 0 13 0; #X connect 15 0 13 0; #X connect 16 0 13 0; #X connect 17 0 13 0; #X connect 18 0 13 0; #X connect 19 0 13 0; #X connect 20 0 13 0; #X connect 21 0 13 0; #X connect 22 0 13 0; #X connect 23 0 13 0; #X connect 24 0 13 0; #X connect 25 0 13 0; #X connect 26 0 13 0; #X connect 28 0 27 0; #X connect 29 0 28 0; #X connect 30 0 28 1; #X connect 31 0 29 1; #X connect 32 0 29 0; #X connect 49 0 9 0; #X connect 49 1 11 0; iem_utils-v0.0.20180206/iem_spec2/GnuGPL.txt0000644000175000017500000004311012630366347020400 0ustar zmoelnigzmoelnig GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License. iem_utils-v0.0.20180206/iem_spec2/spec2_sum~-help.pd0000644000175000017500000000377512630366347022131 0ustar zmoelnigzmoelnig#N canvas 90 35 781 494 10; #X obj 42 70 dsp; #X obj 42 47 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 1 1 ; #X floatatom 42 111 5 0 0 0 - - -; #X floatatom 55 94 5 0 0 0 - - -; #N canvas 0 0 450 300 graph1 0; #X array array101 192 float 0; #X coords 0 50 191 -50 382 128 1; #X restore 319 224 graph; #X obj 46 156 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X text 202 216 no arguments; #X text 90 402 IEM KUG; #X text 74 390 musil; #X text 104 390 @; #X text 110 390 iem.at; #X text 73 412 Graz \, Austria; #X text 25 379 (c) Thomas Musil 2000 - 2006; #N canvas 0 0 754 332 init 0; #X obj 52 43 t f f; #X obj 50 -10 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 52 -36 loadbang; #X obj 57 147 tabwrite array100; #X msg 161 -9 \; array100 xticks 0 32 2; #X msg 174 75 \; array101 xticks 0 32 2; #X msg 165 30 \; array100 xlabel -1.1 0 32 64 96 128; #X obj 50 11 for++ 0 127; #X obj 56 107 / 128; #X msg 431 -9 \; array100 yticks 0 0.5 2; #X msg 435 30 \; array100 ylabel -6 -1 -0.5 0 0.5 1; #X msg 177 125 \; array101 xlabel -55 0 32 64 96 128 160 192; #X msg 444 75 \; array101 yticks 0 25 2; #X msg 447 125 \; array101 ylabel -6 -50 -25 0 25 50; #X connect 0 0 8 0; #X connect 0 1 3 1; #X connect 1 0 7 0; #X connect 2 0 1 0; #X connect 2 0 4 0; #X connect 2 0 6 0; #X connect 2 0 5 0; #X connect 2 0 11 0; #X connect 2 0 9 0; #X connect 2 0 10 0; #X connect 2 0 12 0; #X connect 2 0 13 0; #X connect 7 0 0 0; #X connect 8 0 3 0; #X restore 323 394 pd init; #N canvas 0 0 450 300 graph1 0; #X array array100 128 float 0; #X coords 0 1 127 -1 256 128 1; #X restore 319 62 graph; #X obj 84 192 tabplay~ array100; #X obj 46 252 tabwrite~ array101; #X obj 84 218 spec2_sum~; #X text 19 4 spec2_sum~; #X text 400 5 (blocksize/2 + 1) bins; #X text 161 4 accumulate the sum of the spectrum with; #X connect 0 0 2 0; #X connect 0 1 3 0; #X connect 1 0 0 0; #X connect 5 0 15 0; #X connect 5 0 16 0; #X connect 15 0 17 0; #X connect 17 0 16 0; iem_utils-v0.0.20180206/iem_spec2/spec2_sqrt~-help.pd0000644000175000017500000000162512630366347022306 0ustar zmoelnigzmoelnig#N canvas 52 28 437 304 10; #X text 218 120 no arg; #X text 89 234 IEM KUG; #X text 73 222 musil; #X text 103 222 @; #X text 109 222 iem.at; #X text 72 244 Graz \, Austria; #X text 24 211 (c) Thomas Musil 2000 - 2006; #X text 327 115 like; #X text 109 25 with (blocksize/2 + 1) bins; #X text 17 13 spec2_sqrt~; #X obj 144 120 spec2_sqrt~; #X obj 359 116 sqrt~; #X obj 143 98 sig~ 16; #X obj 143 148 print~; #X obj 111 119 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 29 97 dsp; #X obj 29 71 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0 1 ; #X floatatom 143 79 5 0 0 0 - - -; #X floatatom 29 142 5 0 0 0 - - -; #X floatatom 42 122 5 0 0 0 - - -; #X text 106 14 take square root value of a signal spectrum; #X connect 10 0 13 0; #X connect 12 0 10 0; #X connect 14 0 13 0; #X connect 15 0 18 0; #X connect 15 1 19 0; #X connect 16 0 15 0; #X connect 17 0 12 0; iem_utils-v0.0.20180206/iem_spec2/spec2_add_scalar~-help.pd0000644000175000017500000000064212630366347023370 0ustar zmoelnigzmoelnig#N canvas 52 28 575 275 10; #X text 83 169 IEM KUG; #X text 67 157 musil; #X text 97 157 @; #X text 103 157 iem.at; #X text 66 179 Graz \, Austria; #X text 18 146 (c) Thomas Musil 2000 - 2006; #X text 361 51 like; #X obj 412 52 +~ 0; #X text 134 53 1.arg: value to add; #X text 106 14 add a value to a signal spectrum with (blocksize/2 + 1) bins; #X obj 30 52 spec2+s~ 0; #X text 30 14 spec2+s~; iem_utils-v0.0.20180206/iem_tab/0000755000175000017500000000000013236306220016261 5ustar zmoelnigzmoelnigiem_utils-v0.0.20180206/iem_tab/tab_counter-help.pd0000644000175000017500000000523612630366350022056 0ustar zmoelnigzmoelnig#N canvas 115 92 872 576 10; #N canvas 0 22 450 300 (subpatch) 0; #X array src 100 float 1; #A 0 0 0 0 0 0 0 0 0 0 0.9 0 0 0 0 0 0 0 0 0 0.9 0 0 0 0 0 0 0 0 0 0.9 0 0 0 0 0 0 0 0 0 0.9 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0; #X coords 0 1 99 0 200 140 1; #X restore 544 234 graph; #N canvas 0 22 450 300 (subpatch) 0; #X array dst 100 float 0; #X coords 0 10 99 0 200 140 1; #X restore 544 413 graph; #X obj 53 146 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 55 398 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X text 219 367 1.arg: source-name; #X msg 146 317 dst dst; #X msg 101 296 src src; #X text 219 380 2.arg: destination-name; #X obj 55 359 tab_gt_scalar src dst; #X obj 53 121 tab_counter src dst; #X msg 82 93 reset; #X obj 53 33 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X msg 55 273 0 0 100; #N canvas 0 22 462 312 (subpatch) 0; #X msg 175 59 \; src const 0; #X msg 88 57 \; src \$1 0.9; #X floatatom 89 30 5 0 0 0 - - -; #X msg 88 127 \; dst ylabel -5.15 0 1 2 3 4 5 6 7 8 9 10; #X msg 87 93 \; dst yticks 0 1 1; #X obj 22 64 loadbang; #X connect 2 0 1 0; #X connect 5 0 4 0; #X connect 5 0 3 0; #X restore 496 285 pd; #X text 37 222 list of 3 floats:; #X text 78 455 IEM KUG; #X text 57 443 musil; #X text 92 443 @; #X text 100 443 iem.at; #X text 61 465 Graz \, Austria; #X text 49 233 1.) src onset; #X text 49 243 2.) dst onset; #X text 252 354 initial arguments:; #X text 64 379 output; #X text 158 296 xxx : change source name; #X text 199 318 xxx : change destination name; #X text 135 162 the minimum of both array lengths); #X text 12 3 tab_counter; #X msg 549 36 \; src 9 0.9 \; src 19 0.9 \; src 29 0.9 \; src 39 0.9 ; #X text 77 27 each element of the source array controls an increment counter in the destination array \, a nonzero value lets increment the counter value by one \, a zero value resets the counter value to zero.; #X text 124 93 resets all counter values to zero; #X text 122 148 (the number of samples which control counters are: ; #X text 49 253 3.) n samples to control n counters; #X text 13 432 (c) Thomas Musil 2000 - 2009; #X msg 684 37 \; src 9 -0.1 \; src 19 0 \; src 29 0 \; src 39 0.9; #X msg 686 133 \; src 9 0 \; src 19 0 \; src 29 0 \; src 39 0; #X msg 545 132 \; src 9 0 \; src 19 0.9 \; src 29 -0.1 \; src 39 0 ; #X text 536 15 4 indices incr.; #X text 677 14 2 indices incr.; #X text 537 112 2 indices incr.; #X text 695 114 reset; #X connect 5 0 8 0; #X connect 6 0 8 0; #X connect 8 0 3 0; #X connect 9 0 2 0; #X connect 10 0 9 0; #X connect 11 0 9 0; #X connect 12 0 8 0; iem_utils-v0.0.20180206/iem_tab/tab_rmstodb-help.pd0000644000175000017500000000457712630366350022060 0ustar zmoelnigzmoelnig#N canvas 369 22 790 417 10; #N canvas 0 22 450 300 (subpatch) 0; #X array src 100 float 1; #A 0 0.0214324 0.0214324 0.0214324 0.0214324 0.0214324 0.0214324 0.0357179 0.0357179 0.0428607 0.0428607 0.0428607 0.0500035 0.0642891 0.0714318 0.0785746 0.0857174 0.0857174 0.100003 0.100003 0.107146 0.107146 0.114289 0.114289 0.121431 0.121431 0.128574 0.128574 0.135717 0.14286 0.14286 0.14286 0.150002 0.157145 0.157145 0.171431 0.178574 0.185716 0.192859 0.200002 0.214287 0.214287 0.22143 0.228573 0.242859 0.242859 0.257144 0.257144 0.264287 0.278573 0.292858 0.300001 0.314286 0.335715 0.35 0.357143 0.364286 0.378571 0.392857 0.407143 0.414285 0.435714 0.442857 0.449999 0.457142 0.471428 0.485713 0.492856 0.499999 0.521427 0.52857 0.542856 0.542856 0.564284 0.578569 0.599998 0.621426 0.635712 0.642854 0.649997 0.671426 0.685711 0.699997 0.707139 0.714282 0.735711 0.757139 0.764282 0.771425 0.778567 0.799996 0.807138 0.821424 0.83571 0.864281 0.885709 0.885709 0.899995 0.935709 0.949994 0.957137; #X coords 0 1 99 0 200 140 1; #X restore 534 10 graph; #N canvas 0 22 450 300 (subpatch) 0; #X array dst 100 float 0; #X coords 0 100 99 0 200 140 1; #X restore 534 166 graph; #X obj 61 31 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 61 106 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 59 301 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X msg 59 211 50 20 50; #X text 44 154 list of 3 floats:; #X text 222 273 1.arg: source-name; #X text 222 286 2.arg: destination-name; #X msg 154 213 src src; #X msg 185 234 dst dst; #X text 78 365 IEM KUG; #X text 57 353 musil; #X text 92 353 @; #X text 100 353 iem.at; #X text 61 375 Graz \, Austria; #X text 56 165 1.) src onset; #X text 56 175 2.) dst onset; #X text 231 261 initial arguments:; #X text 68 283 output; #X text 208 213 xxx : change source name; #X text 240 233 xxx : change destination name; #X text 205 69 (the number of samples which are copied are:; #X text 218 83 the minimum of both array lengths); #X text 12 4 tab_rmstodb; #X obj 61 78 tab_rmstodb src dst; #X text 57 185 3.) n samples of rmstodb; #X obj 59 264 tab_rmstodb src dst; #X text 13 342 (c) Thomas Musil 2000 - 2010; #X text 90 29 calculates the rmstodb-value from src to dst; #X connect 2 0 25 0; #X connect 5 0 27 0; #X connect 9 0 27 0; #X connect 10 0 27 0; #X connect 25 0 3 0; #X connect 27 0 4 0; iem_utils-v0.0.20180206/iem_tab/tab_max_index-help.pd0000644000175000017500000000460312630366350022350 0ustar zmoelnigzmoelnig#N canvas 118 94 788 440 10; #N canvas 0 0 450 300 graph1 0; #X array src 100 float 1; #A 0 -0.442858 -0.414287 -0.385715 -0.342858 -0.314287 -0.257144 -0.128572 -0.0428573 0.128572 0.228572 0.285715 0.328572 0.400001 0.414287 0.457144 0.457144 0.442858 0.385715 0.314287 0.257144 0.214286 0.1 0.0428572 -0.0142858 -0.0428573 -0.114286 -0.142858 -0.200001 -0.242858 -0.285715 -0.328572 -0.342858 -0.37143 -0.385715 -0.414287 -0.414287 -0.414287 -0.414287 -0.400001 -0.357144 -0.314287 -0.257144 -0.185715 -0.0714288 0.0142857 0.0571429 0.185715 0.185715 0.200001 0.214286 0.214286 0.214286 0.228572 0.228572 0.214286 0.200001 0.185715 0.171429 0.142857 0.1 0.114286 0.0714285 -0.071429 -0.242858 -0.300001 -0.328573 -0.357144 -0.37143 -0.385715 -0.400001 -0.442858 -0.457144 -0.47143 -0.457144 -0.428573 -0.400001 -0.378573 -0.328572 -0.271429 -0.242858 -0.200001 -0.128572 -0.0428574 -0.0285717 0.0142858 0.114286 0.128572 0.185715 0.214286 0.257144 0.285715 0.314287 0.342858 0.357144 0.357144 0.357144 0.357144 0.357144 0.342858 0.328572; #X coords 0 1 99 -1 200 140 1; #X restore 529 24 graph; #X obj 61 31 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 61 106 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 59 294 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X text 205 270 1.arg: source-name; #X msg 101 213 src src; #X floatatom 109 103 5 0 0 0 - - -; #X floatatom 158 104 5 0 0 0 - - -; #X text 166 118 max; #X floatatom 107 320 5 0 0 0 - - -; #X floatatom 156 336 5 0 0 0 - - -; #X msg 59 193 35 50; #X obj 61 78 tab_max_index src; #X text 97 117 max_index; #X obj 59 262 tab_max_index src; #X text 75 384 IEM KUG; #X text 59 372 musil; #X text 89 372 @; #X text 95 372 iem.at; #X text 58 394 Graz \, Austria; #X text 10 361 (c) Thomas Musil 2000 - 2006; #X text 229 258 initial arguments:; #X text 65 280 output; #X text 152 213 xxx : change source name; #X text 11 6 tab_max_index; #X text 43 150 list of 2 floats:; #X text 55 160 1.) src onset; #X text 55 171 2.) n samples to calculate maximum; #X text 163 319 maximum value output; #X text 115 301 maximum index output; #X text 85 29 calculate maximum element and its index of array ; #X connect 1 0 12 0; #X connect 5 0 14 0; #X connect 11 0 14 0; #X connect 12 0 2 0; #X connect 12 1 6 0; #X connect 12 2 7 0; #X connect 14 0 3 0; #X connect 14 1 9 0; #X connect 14 2 10 0; iem_utils-v0.0.20180206/iem_tab/tab_mul_scalar-help.pd0000644000175000017500000000473212630366350022521 0ustar zmoelnigzmoelnig#N canvas 115 92 856 560 10; #N canvas 0 0 450 300 graph1 0; #X array src 100 float 1; #A 0 -0.442858 -0.414287 -0.385715 -0.342858 -0.314287 -0.257144 -0.128572 -0.0428573 0.128572 0.228572 0.285715 0.328572 0.400001 0.414287 0.457144 0.457144 0.442858 0.385715 0.314287 0.257144 0.214286 0.1 0.0428572 -0.0142858 -0.0428573 -0.114286 -0.142858 -0.200001 -0.242858 -0.285715 -0.328572 -0.342858 -0.37143 -0.385715 -0.414287 -0.414287 -0.414287 -0.414287 -0.400001 -0.357144 -0.314287 -0.257144 -0.185715 -0.0714288 0.0142857 0.0571429 0.171429 0.328572 0.400001 0.442858 0.47143 0.485715 0.485715 0.485715 0.485715 0.485715 0.442858 0.357144 0.242858 0.185715 0.114286 0.0714285 -0.071429 -0.242858 -0.300001 -0.328573 -0.357144 -0.37143 -0.385715 -0.400001 -0.442858 -0.457144 -0.47143 -0.457144 -0.428573 -0.400001 -0.378573 -0.328572 -0.271429 -0.242858 -0.200001 -0.128572 -0.0428574 -0.0285717 0.0142858 0.114286 0.128572 0.185715 0.214286 0.257144 0.285715 0.314287 0.342858 0.357144 0.357144 0.357144 0.357144 0.357144 0.342858 0.328572; #X coords 0 1 99 -1 200 140 1; #X restore 527 46 graph; #N canvas 0 0 450 300 graph1 0; #X array dst 100 float 0; #X coords 0 1 99 -1 200 140 1; #X restore 527 325 graph; #X obj 61 106 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 59 340 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X text 211 336 1.arg: source-name; #X msg 197 270 dst dst; #X msg 47 36 0.5; #X msg 145 247 src src; #X msg 82 37 -0.5; #X msg 48 227 50 20 50 -0.8; #X text 211 349 2.arg: destination-name; #X text 31 163 list of 4 floats:; #X text 78 475 IEM KUG; #X text 62 463 musil; #X text 92 463 @; #X text 98 463 iem.at; #X text 61 485 Graz \, Austria; #X text 13 452 (c) Thomas Musil 2000 - 2006; #X text 234 322 initial arguments:; #X text 71 322 output; #X text 250 271 xxx : change destination name; #X text 218 86 the minimum of both array lengths); #X text 197 246 xxx : change source name; #X text 42 179 1.) src onset; #X text 42 190 2.) dst onset; #X text 205 72 (the number of samples which were added are:; #X text 12 3 tab_mul_scalar; #X text 129 29 multiply the src-array with this scalar to dst-array ; #X obj 61 78 tab_mul_scalar src dst; #X obj 59 301 tab_mul_scalar src dst; #X text 42 200 3.) n samples to multiply; #X text 42 210 4.) multiplied scalar value; #X connect 5 0 29 0; #X connect 6 0 28 0; #X connect 7 0 29 0; #X connect 8 0 28 0; #X connect 9 0 29 0; #X connect 28 0 2 0; #X connect 29 0 3 0; iem_utils-v0.0.20180206/iem_tab/LICENSE.txt0000644000175000017500000000205212630366350020112 0ustar zmoelnigzmoelnigiem_tab - dynamic library for pd; handle array operations Copyright (C) 2000-2006 Thomas MUSIL [musil_at_iem.at] IEM - Institute of Electronic Music and Acoustics, Graz Inffeldgasse 10/3, 8010 Graz, Austria http://iem.at This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details ( GnuGPL.txt ). (e.g. http://www.gnu.org/copyleft/gpl.html) You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Graz, 15 Nov. 2006 Thomas Musiliem_utils-v0.0.20180206/iem_tab/src/0000755000175000017500000000000013236306220017050 5ustar zmoelnigzmoelnigiem_utils-v0.0.20180206/iem_tab/src/tab_sqrt.c0000644000175000017500000001200612630366350021041 0ustar zmoelnigzmoelnig/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_tab written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2009 */ #include "m_pd.h" #include "iemlib.h" #include "iem_tab.h" #include /* -------------------------- tab_sqrt ------------------------------ */ /* x_beg_mem_dst[i] = sqrt(x_beg_mem_src1[i]) */ typedef struct _tab_sqrt { t_object x_obj; int x_size_src1; int x_size_dst; int x_offset_src1; int x_offset_dst; iemarray_t *x_beg_mem_src1; iemarray_t *x_beg_mem_dst; t_symbol *x_sym_scr1; t_symbol *x_sym_dst; } t_tab_sqrt; static t_class *tab_sqrt_class; static void tab_sqrt_src(t_tab_sqrt *x, t_symbol *s) { x->x_sym_scr1 = s; } static void tab_sqrt_dst(t_tab_sqrt *x, t_symbol *s) { x->x_sym_dst = s; } static void tab_sqrt_bang(t_tab_sqrt *x) { int i, n; int ok_src, ok_dst; iemarray_t *vec_src, *vec_dst; ok_src = iem_tab_check_arrays(gensym("tab_sqrt"), x->x_sym_scr1, &x->x_beg_mem_src1, &x->x_size_src1, 0); ok_dst = iem_tab_check_arrays(gensym("tab_sqrt"), x->x_sym_dst, &x->x_beg_mem_dst, &x->x_size_dst, 0); if(ok_src && ok_dst) { if(x->x_size_src1 < x->x_size_dst) n = x->x_size_src1; else n = x->x_size_dst; vec_src = x->x_beg_mem_src1; vec_dst = x->x_beg_mem_dst; if(n) { t_garray *a; for(i=0; i 0 || PD_MINOR_VERSION > 43)) t_float g = q8_rsqrt(f); iemarray_setfloat(vec_dst, i, f*g*(1.5f - 0.5f * g * g * f)); #else iemarray_setfloat(vec_dst, i, sqrt(f)); #endif } } outlet_bang(x->x_obj.ob_outlet); a = (t_garray *)pd_findbyclass(x->x_sym_dst, garray_class); garray_redraw(a); } } } static void tab_sqrt_list(t_tab_sqrt *x, t_symbol *s, int argc, t_atom *argv) { int beg_src, beg_dst; int i, n; int ok_src, ok_dst; iemarray_t *vec_src, *vec_dst; if((argc >= 3) && IS_A_FLOAT(argv,0) && IS_A_FLOAT(argv,1) && IS_A_FLOAT(argv,2)) { beg_src = (int)atom_getintarg(0, argc, argv); beg_dst = (int)atom_getintarg(1, argc, argv); n = (int)atom_getintarg(2, argc, argv); if(beg_src < 0) beg_src = 0; if(beg_dst < 0) beg_dst = 0; if(n < 0) n = 0; ok_src = iem_tab_check_arrays(gensym("tab_sqrt"), x->x_sym_scr1, &x->x_beg_mem_src1, &x->x_size_src1, beg_src+n); ok_dst = iem_tab_check_arrays(gensym("tab_sqrt"), x->x_sym_dst, &x->x_beg_mem_dst, &x->x_size_dst, beg_dst+n); if(ok_src && ok_dst) { vec_src = x->x_beg_mem_src1 + beg_src; vec_dst = x->x_beg_mem_dst + beg_dst; if(n) { t_garray *a; for(i=0; i 0 || PD_MINOR_VERSION > 43)) t_float g = q8_rsqrt(f); iemarray_setfloat(vec_dst, i, f*g*(1.5f - 0.5f * g * g * f)); #else iemarray_setfloat(vec_dst, i, sqrt(f)); #endif } } outlet_bang(x->x_obj.ob_outlet); a = (t_garray *)pd_findbyclass(x->x_sym_dst, garray_class); garray_redraw(a); } } } else { post("tab_sqrt-ERROR: list need 3 float arguments:"); post(" source_offset + destination_offset + number_of_samples_to_sqrt"); } } static void tab_sqrt_free(t_tab_sqrt *x) { } static void *tab_sqrt_new(t_symbol *s, int argc, t_atom *argv) { t_tab_sqrt *x = (t_tab_sqrt *)pd_new(tab_sqrt_class); t_symbol *src, *dst; if((argc >= 2) && IS_A_SYMBOL(argv,0) && IS_A_SYMBOL(argv,1)) { src = (t_symbol *)atom_getsymbolarg(0, argc, argv); dst = (t_symbol *)atom_getsymbolarg(1, argc, argv); } else if((argc >= 1) && IS_A_SYMBOL(argv,0)) { src = (t_symbol *)atom_getsymbolarg(0, argc, argv); dst = src; } else { post("tab_sqrt-ERROR: need 2 symbols arguments:"); post(" source_array_name + destination_array_name"); return(0); } x->x_sym_scr1 = src; x->x_sym_dst = dst; outlet_new(&x->x_obj, &s_bang); return(x); } void tab_sqrt_setup(void) { tab_sqrt_class = class_new(gensym("tab_sqrt"), (t_newmethod)tab_sqrt_new, (t_method)tab_sqrt_free, sizeof(t_tab_sqrt), 0, A_GIMME, 0); class_addbang(tab_sqrt_class, (t_method)tab_sqrt_bang); class_addlist(tab_sqrt_class, (t_method)tab_sqrt_list); class_addmethod(tab_sqrt_class, (t_method)tab_sqrt_src, gensym("src"), A_DEFSYMBOL, 0); class_addmethod(tab_sqrt_class, (t_method)tab_sqrt_src, gensym("src1"), A_DEFSYMBOL, 0); class_addmethod(tab_sqrt_class, (t_method)tab_sqrt_dst, gensym("dst"), A_DEFSYMBOL, 0); } iem_utils-v0.0.20180206/iem_tab/src/tab_div.c0000644000175000017500000001312712630366350020637 0ustar zmoelnigzmoelnig/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_tab written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2009 */ #include "m_pd.h" #include "iemlib.h" #include "iem_tab.h" /* -------------------------- tab_div ------------------------------ */ /* x_beg_mem_dst[i] = x_beg_mem_src1[i]/x_offset_src2[i] */ typedef struct _tab_div { t_object x_obj; int x_size_src1; int x_size_src2; int x_size_dst; int x_offset_src1; int x_offset_src2; int x_offset_dst; iemarray_t *x_beg_mem_src1; iemarray_t *x_beg_mem_src2; iemarray_t *x_beg_mem_dst; t_symbol *x_sym_scr1; t_symbol *x_sym_scr2; t_symbol *x_sym_dst; } t_tab_div; static t_class *tab_div_class; static void tab_div_src1(t_tab_div *x, t_symbol *s) { x->x_sym_scr1 = s; } static void tab_div_src2(t_tab_div *x, t_symbol *s) { x->x_sym_scr2 = s; } static void tab_div_dst(t_tab_div *x, t_symbol *s) { x->x_sym_dst = s; } static void tab_div_bang(t_tab_div *x) { int i, n; int ok_src1, ok_src2, ok_dst; iemarray_t *vec_src1, *vec_src2, *vec_dst; ok_src1 = iem_tab_check_arrays(gensym("tab_div"), x->x_sym_scr1, &x->x_beg_mem_src1, &x->x_size_src1, 0); ok_src2 = iem_tab_check_arrays(gensym("tab_div"), x->x_sym_scr2, &x->x_beg_mem_src2, &x->x_size_src2, 0); ok_dst = iem_tab_check_arrays(gensym("tab_div"), x->x_sym_dst, &x->x_beg_mem_dst, &x->x_size_dst, 0); if(ok_src1 && ok_src2 && ok_dst) { if(x->x_size_src1 < x->x_size_dst) n = x->x_size_src1; else n = x->x_size_dst; if(x->x_size_src2 < n) n = x->x_size_src2; vec_src1 = x->x_beg_mem_src1; vec_src2 = x->x_beg_mem_src2; vec_dst = x->x_beg_mem_dst; if(n) { t_garray *a; for(i=0; ix_obj.ob_outlet); a = (t_garray *)pd_findbyclass(x->x_sym_dst, garray_class); garray_redraw(a); } } } static void tab_div_list(t_tab_div *x, t_symbol *s, int argc, t_atom *argv) { int beg_src1, beg_src2, beg_dst; int i, n; int ok_src1, ok_src2, ok_dst; iemarray_t *vec_src1, *vec_src2, *vec_dst; if((argc >= 4) && IS_A_FLOAT(argv,0) && IS_A_FLOAT(argv,1) && IS_A_FLOAT(argv,2) && IS_A_FLOAT(argv,3)) { beg_src1 = (int)atom_getintarg(0, argc, argv); beg_src2 = (int)atom_getintarg(1, argc, argv); beg_dst = (int)atom_getintarg(2, argc, argv); n = (int)atom_getintarg(3, argc, argv); if(beg_src1 < 0) beg_src1 = 0; if(beg_src2 < 0) beg_src2 = 0; if(beg_dst < 0) beg_dst = 0; if(n < 0) n = 0; ok_src1 = iem_tab_check_arrays(gensym("tab_div"), x->x_sym_scr1, &x->x_beg_mem_src1, &x->x_size_src1, beg_src1+n); ok_src2 = iem_tab_check_arrays(gensym("tab_div"), x->x_sym_scr2, &x->x_beg_mem_src2, &x->x_size_src2, beg_src2+n); ok_dst = iem_tab_check_arrays(gensym("tab_div"), x->x_sym_dst, &x->x_beg_mem_dst, &x->x_size_dst, beg_dst+n); if(ok_src1 && ok_src2 && ok_dst) { vec_src1 = x->x_beg_mem_src1 + beg_src1; vec_src2 = x->x_beg_mem_src2 + beg_src2; vec_dst = x->x_beg_mem_dst + beg_dst; if(n) { t_garray *a; for(i=0; ix_obj.ob_outlet); a = (t_garray *)pd_findbyclass(x->x_sym_dst, garray_class); garray_redraw(a); } } } else { post("tab_div-ERROR: list need 4 float arguments:"); post(" source1_offset + source2_offset + destination_offset + number_of_samples_to_div"); } } static void tab_div_free(t_tab_div *x) { } static void *tab_div_new(t_symbol *s, int argc, t_atom *argv) { t_tab_div *x = (t_tab_div *)pd_new(tab_div_class); t_symbol *src1, *src2, *dst; if((argc >= 3) && IS_A_SYMBOL(argv,0) && IS_A_SYMBOL(argv,1) && IS_A_SYMBOL(argv,2)) { src1 = (t_symbol *)atom_getsymbolarg(0, argc, argv); src2 = (t_symbol *)atom_getsymbolarg(1, argc, argv); dst = (t_symbol *)atom_getsymbolarg(2, argc, argv); } else if((argc >= 2) && IS_A_SYMBOL(argv,0) && IS_A_SYMBOL(argv,1)) { src1 = (t_symbol *)atom_getsymbolarg(0, argc, argv); dst = src1; src2 = (t_symbol *)atom_getsymbolarg(1, argc, argv); } else { post("tab_div-ERROR: need 3 symbols arguments:"); post(" source1_array_name + source2_array_name + destination_array_name"); return(0); } x->x_sym_scr1 = src1; x->x_sym_scr2 = src2; x->x_sym_dst = dst; outlet_new(&x->x_obj, &s_bang); return(x); } void tab_div_setup(void) { tab_div_class = class_new(gensym("tab_div"), (t_newmethod)tab_div_new, (t_method)tab_div_free, sizeof(t_tab_div), 0, A_GIMME, 0); class_addbang(tab_div_class, (t_method)tab_div_bang); class_addlist(tab_div_class, (t_method)tab_div_list); class_addmethod(tab_div_class, (t_method)tab_div_src1, gensym("src1"), A_DEFSYMBOL, 0); class_addmethod(tab_div_class, (t_method)tab_div_src2, gensym("src2"), A_DEFSYMBOL, 0); class_addmethod(tab_div_class, (t_method)tab_div_dst, gensym("dst"), A_DEFSYMBOL, 0); // class_sethelpsymbol(tab_div_class, gensym("iemhelp2/tab_div-help")); } iem_utils-v0.0.20180206/iem_tab/src/tab_counter.c0000644000175000017500000001314412630366350021533 0ustar zmoelnigzmoelnig/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_tab written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2009 */ #include "m_pd.h" #include "iemlib.h" #include "iem_tab.h" /* -------------------------- tab_counter ------------------------------ */ /* for(i=0; ix_sym_scr1 = s; } static void tab_counter_bang(t_tab_counter *x) { int i, n; int ok_src1, ok_dst; iemarray_t *vec_src1, *vec_dst; ok_src1 = iem_tab_check_arrays(gensym("tab_counter"), x->x_sym_scr1, &x->x_beg_mem_src1, &x->x_size_src1, 0); ok_dst = iem_tab_check_arrays(gensym("tab_counter"), x->x_sym_dst, &x->x_beg_mem_dst, &x->x_size_dst, 0); if(ok_src1 && ok_dst) { if(x->x_size_src1 < x->x_size_dst) n = x->x_size_src1; else n = x->x_size_dst; vec_src1 = x->x_beg_mem_src1; vec_dst = x->x_beg_mem_dst; if(n) { t_garray *a; for(i=0; ix_obj.ob_outlet); a = (t_garray *)pd_findbyclass(x->x_sym_dst, garray_class); garray_redraw(a); } } } static void tab_counter_dst(t_tab_counter *x, t_symbol *s) { x->x_sym_dst = s; } static void tab_counter_list(t_tab_counter *x, t_symbol *s, int argc, t_atom *argv) { int beg_src1, beg_dst; int i, n; int ok_src1, ok_dst; iemarray_t *vec_src1, *vec_dst; if((argc >= 3) && IS_A_FLOAT(argv,0) && IS_A_FLOAT(argv,1) && IS_A_FLOAT(argv,2)) { beg_src1 = (int)atom_getintarg(0, argc, argv); beg_dst = (int)atom_getintarg(1, argc, argv); n = (int)atom_getintarg(2, argc, argv); if(beg_src1 < 0) beg_src1 = 0; if(beg_dst < 0) beg_dst = 0; if(n < 0) n = 0; ok_src1 = iem_tab_check_arrays(gensym("tab_counter"), x->x_sym_scr1, &x->x_beg_mem_src1, &x->x_size_src1, beg_src1+n); ok_dst = iem_tab_check_arrays(gensym("tab_counter"), x->x_sym_dst, &x->x_beg_mem_dst, &x->x_size_dst, beg_dst+n); if(ok_src1 && ok_dst) { vec_src1 = x->x_beg_mem_src1 + beg_src1; vec_dst = x->x_beg_mem_dst + beg_dst; if(n) { t_garray *a; for(i=0; ix_obj.ob_outlet); a = (t_garray *)pd_findbyclass(x->x_sym_dst, garray_class); garray_redraw(a); } } } else { post("tab_counter-ERROR: list need 4 float arguments:"); post(" source1_offset + destination_offset + number_of_samples_to_add + add_scalar"); } } static void tab_counter_reset(t_tab_counter *x) { int beg_dst; int i, n; int ok_dst; iemarray_t *vec_dst; ok_dst = iem_tab_check_arrays(gensym("tab_counter"), x->x_sym_dst, &x->x_beg_mem_dst, &x->x_size_dst, 0); if(ok_dst) { n = x->x_size_dst; vec_dst = x->x_beg_mem_dst; if(n) { t_garray *a; for(i=0; ix_obj.ob_outlet); a = (t_garray *)pd_findbyclass(x->x_sym_dst, garray_class); garray_redraw(a); } } } static void tab_counter_free(t_tab_counter *x) { } static void *tab_counter_new(t_symbol *s, int argc, t_atom *argv) { t_tab_counter *x = (t_tab_counter *)pd_new(tab_counter_class); t_symbol *src1, *dst; if((argc >= 2) && IS_A_SYMBOL(argv,0) && IS_A_SYMBOL(argv,1)) { src1 = (t_symbol *)atom_getsymbolarg(0, argc, argv); dst = (t_symbol *)atom_getsymbolarg(1, argc, argv); } else if((argc >= 1) && IS_A_SYMBOL(argv,0)) { src1 = (t_symbol *)atom_getsymbolarg(0, argc, argv); dst = src1; } else { post("tab_counter-ERROR: need 2 symbol arguments:"); post(" source_array_name + destination_array_name"); return(0); } x->x_sym_scr1 = src1; x->x_sym_dst = dst; outlet_new(&x->x_obj, &s_bang); return(x); } void tab_counter_setup(void) { tab_counter_class = class_new(gensym("tab_counter"), (t_newmethod)tab_counter_new, (t_method)tab_counter_free, sizeof(t_tab_counter), 0, A_GIMME, 0); class_addbang(tab_counter_class, (t_method)tab_counter_bang); class_addlist(tab_counter_class, (t_method)tab_counter_list); class_addmethod(tab_counter_class, (t_method)tab_counter_src, gensym("src1"), A_DEFSYMBOL, 0); class_addmethod(tab_counter_class, (t_method)tab_counter_src, gensym("src"), A_DEFSYMBOL, 0); class_addmethod(tab_counter_class, (t_method)tab_counter_dst, gensym("dst"), A_DEFSYMBOL, 0); class_addmethod(tab_counter_class, (t_method)tab_counter_reset, gensym("reset"), 0); // class_sethelpsymbol(tab_counter_class, gensym("iemhelp2/tab_counter-help")); } iem_utils-v0.0.20180206/iem_tab/src/tab_cross_corr.c0000644000175000017500000001374612630366350022242 0ustar zmoelnigzmoelnig/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_tab written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2009 */ #include "m_pd.h" #include "iemlib.h" #include "iem_tab.h" /* -------------------------- tab_cross_corr ------------------------------ */ typedef struct _tab_cross_corr { t_object x_obj; int x_size_src1; int x_size_src2; int x_size_dst; int x_n; iemarray_t *x_beg_mem_src1; iemarray_t *x_beg_mem_src2; iemarray_t *x_beg_mem_dst; t_float x_factor; t_symbol *x_sym_scr1; t_symbol *x_sym_scr2; t_symbol *x_sym_dst; t_float x_delay; int x_counter; void *x_clock; } t_tab_cross_corr; static t_class *tab_cross_corr_class; static void tab_cross_corr_tick(t_tab_cross_corr *x) { x->x_counter++; if(x->x_counter < x->x_n) { iemarray_t *vec_src1, *vec_src2, *vec_dst; t_float sum; int j, m; vec_src1 = x->x_beg_mem_src1 + x->x_counter; vec_src2 = x->x_beg_mem_src2; vec_dst = x->x_beg_mem_dst + x->x_counter; m = x->x_size_src2; sum = 0.0f; for(j=0; jx_factor); clock_delay(x->x_clock, x->x_delay); } else { t_garray *a; clock_unset(x->x_clock); outlet_bang(x->x_obj.ob_outlet); a = (t_garray *)pd_findbyclass(x->x_sym_dst, garray_class); garray_redraw(a); } } static void tab_cross_corr_time(t_tab_cross_corr *x, t_floatarg dtime) { if(dtime < 0.0f) dtime = 0.0f; x->x_delay = dtime; } static void tab_cross_corr_factor(t_tab_cross_corr *x, t_floatarg factor) { x->x_factor = factor; } static void tab_cross_corr_src1(t_tab_cross_corr *x, t_symbol *s) { x->x_sym_scr1 = s; } static void tab_cross_corr_src2(t_tab_cross_corr *x, t_symbol *s) { x->x_sym_scr2 = s; } static void tab_cross_corr_dst(t_tab_cross_corr *x, t_symbol *s) { x->x_sym_dst = s; } static void tab_cross_corr_bang(t_tab_cross_corr *x) { int i, j, m, n; int ok_src1, ok_src2, ok_dst; iemarray_t *vec_src1, *vec_src2, *vec_dst; t_float sum, f; ok_src1 = iem_tab_check_arrays(gensym("tab_cross_corr"), x->x_sym_scr1, &x->x_beg_mem_src1, &x->x_size_src1, 0); ok_src2 = iem_tab_check_arrays(gensym("tab_cross_corr"), x->x_sym_scr2, &x->x_beg_mem_src2, &x->x_size_src2, 0); ok_dst = iem_tab_check_arrays(gensym("tab_cross_corr"), x->x_sym_dst, &x->x_beg_mem_dst, &x->x_size_dst, 0); if(ok_src1 && ok_src2 && ok_dst) { if(x->x_size_src1 > x->x_size_src2) n = x->x_size_src1 - x->x_size_src2; else n = 0; if(n > x->x_size_dst) x->x_n = x->x_size_dst; else x->x_n = n; f = x->x_factor; if(n) { if(x->x_delay == 0.0f) { t_garray *a; vec_src1 = x->x_beg_mem_src1; vec_src2 = x->x_beg_mem_src2; vec_dst = x->x_beg_mem_dst; m = x->x_size_src2; for(i=0; ix_obj.ob_outlet); a = (t_garray *)pd_findbyclass(x->x_sym_dst, garray_class); garray_redraw(a); } else { x->x_counter = 0; vec_src1 = x->x_beg_mem_src1 + x->x_counter; vec_src2 = x->x_beg_mem_src2; vec_dst = x->x_beg_mem_dst + x->x_counter; m = x->x_size_src2; sum = 0.0f; for(j=0; jx_clock, x->x_delay); } } } } static void tab_cross_corr_free(t_tab_cross_corr *x) { clock_free(x->x_clock); } static void *tab_cross_corr_new(t_symbol *s, int argc, t_atom *argv) { t_tab_cross_corr *x = (t_tab_cross_corr *)pd_new(tab_cross_corr_class); t_symbol *src1, *src2, *dst; t_float dtime=0.0f, factor=1.0f; if((argc >= 5) && IS_A_FLOAT(argv,4)) dtime = (t_float)atom_getfloatarg(4, argc, argv); if((argc >= 4) && IS_A_FLOAT(argv,3)) factor = (t_float)atom_getfloatarg(3, argc, argv); if((argc >= 3) && IS_A_SYMBOL(argv,0) && IS_A_SYMBOL(argv,1) && IS_A_SYMBOL(argv,2)) { src1 = (t_symbol *)atom_getsymbolarg(0, argc, argv); src2 = (t_symbol *)atom_getsymbolarg(1, argc, argv); dst = (t_symbol *)atom_getsymbolarg(2, argc, argv); } else { post("tab_cross_corr-ERROR: need 3 symbol + 2 float arguments:"); post(" source_reference_array_name + source_measure_array_name + destination_array_name + norm_factor + calculation-time-per-sample_ms"); return(0); } if(dtime < 0.0f) dtime = 0.0f; x->x_delay = dtime; x->x_factor = factor; x->x_sym_scr1 = src1; x->x_sym_scr2 = src2; x->x_sym_dst = dst; outlet_new(&x->x_obj, &s_bang); x->x_clock = clock_new(x, (t_method)tab_cross_corr_tick); return(x); } void tab_cross_corr_setup(void) { tab_cross_corr_class = class_new(gensym("tab_cross_corr"), (t_newmethod)tab_cross_corr_new, (t_method)tab_cross_corr_free, sizeof(t_tab_cross_corr), 0, A_GIMME, 0); class_addbang(tab_cross_corr_class, (t_method)tab_cross_corr_bang); class_addmethod(tab_cross_corr_class, (t_method)tab_cross_corr_time, gensym("time"), A_DEFFLOAT, 0); class_addmethod(tab_cross_corr_class, (t_method)tab_cross_corr_factor, gensym("factor"), A_DEFFLOAT, 0); class_addmethod(tab_cross_corr_class, (t_method)tab_cross_corr_src2, gensym("src2"), A_DEFSYMBOL, 0); class_addmethod(tab_cross_corr_class, (t_method)tab_cross_corr_src1, gensym("src1"), A_DEFSYMBOL, 0); class_addmethod(tab_cross_corr_class, (t_method)tab_cross_corr_dst, gensym("dst"), A_DEFSYMBOL, 0); // class_sethelpsymbol(tab_cross_corr_class, gensym("iemhelp2/tab_cross_corr-help")); } iem_utils-v0.0.20180206/iem_tab/src/tab_lt.c0000644000175000017500000001313612630366350020474 0ustar zmoelnigzmoelnig/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_tab written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2009 */ #include "m_pd.h" #include "iemlib.h" #include "iem_tab.h" /* -------------------------- tab_lt ------------------------------ */ /* if(x_beg_mem_src1[i] < x_beg_mem_src2[i]) */ /* x_beg_mem_dst[i] = 1.0f; */ /* else */ /* x_beg_mem_dst[i] = 0.0f; */ typedef struct _tab_lt { t_object x_obj; int x_size_src1; int x_size_src2; int x_size_dst; int x_offset_src1; int x_offset_src2; int x_offset_dst; iemarray_t *x_beg_mem_src1; iemarray_t *x_beg_mem_src2; iemarray_t *x_beg_mem_dst; t_symbol *x_sym_scr1; t_symbol *x_sym_scr2; t_symbol *x_sym_dst; } t_tab_lt; static t_class *tab_lt_class; static void tab_lt_src1(t_tab_lt *x, t_symbol *s) { x->x_sym_scr1 = s; } static void tab_lt_src2(t_tab_lt *x, t_symbol *s) { x->x_sym_scr2 = s; } static void tab_lt_dst(t_tab_lt *x, t_symbol *s) { x->x_sym_dst = s; } static void tab_lt_bang(t_tab_lt *x) { int i, n; int ok_src1, ok_src2, ok_dst; iemarray_t *vec_src1, *vec_src2, *vec_dst; ok_src1 = iem_tab_check_arrays(gensym("tab_lt"), x->x_sym_scr1, &x->x_beg_mem_src1, &x->x_size_src1, 0); ok_src2 = iem_tab_check_arrays(gensym("tab_lt"), x->x_sym_scr2, &x->x_beg_mem_src2, &x->x_size_src2, 0); ok_dst = iem_tab_check_arrays(gensym("tab_lt"), x->x_sym_dst, &x->x_beg_mem_dst, &x->x_size_dst, 0); if(ok_src1 && ok_src2 && ok_dst) { if(x->x_size_src1 < x->x_size_dst) n = x->x_size_src1; else n = x->x_size_dst; if(x->x_size_src2 < n) n = x->x_size_src2; vec_src1 = x->x_beg_mem_src1; vec_src2 = x->x_beg_mem_src2; vec_dst = x->x_beg_mem_dst; if(n) { t_garray *a; for(i=0; ix_obj.ob_outlet); a = (t_garray *)pd_findbyclass(x->x_sym_dst, garray_class); garray_redraw(a); } } } static void tab_lt_list(t_tab_lt *x, t_symbol *s, int argc, t_atom *argv) { int beg_src1, beg_src2, beg_dst; int i, n; int ok_src1, ok_src2, ok_dst; iemarray_t *vec_src1, *vec_src2, *vec_dst; if((argc >= 4) && IS_A_FLOAT(argv,0) && IS_A_FLOAT(argv,1) && IS_A_FLOAT(argv,2) && IS_A_FLOAT(argv,3)) { beg_src1 = (int)atom_getintarg(0, argc, argv); beg_src2 = (int)atom_getintarg(1, argc, argv); beg_dst = (int)atom_getintarg(2, argc, argv); n = (int)atom_getintarg(3, argc, argv); if(beg_src1 < 0) beg_src1 = 0; if(beg_src2 < 0) beg_src2 = 0; if(beg_dst < 0) beg_dst = 0; if(n < 0) n = 0; ok_src1 = iem_tab_check_arrays(gensym("tab_lt"), x->x_sym_scr1, &x->x_beg_mem_src1, &x->x_size_src1, beg_src1+n); ok_src2 = iem_tab_check_arrays(gensym("tab_lt"), x->x_sym_scr2, &x->x_beg_mem_src2, &x->x_size_src2, beg_src2+n); ok_dst = iem_tab_check_arrays(gensym("tab_lt"), x->x_sym_dst, &x->x_beg_mem_dst, &x->x_size_dst, beg_dst+n); if(ok_src1 && ok_src2 && ok_dst) { vec_src1 = x->x_beg_mem_src1 + beg_src1; vec_src2 = x->x_beg_mem_src2 + beg_src2; vec_dst = x->x_beg_mem_dst + beg_dst; if(n) { t_garray *a; for(i=0; ix_obj.ob_outlet); a = (t_garray *)pd_findbyclass(x->x_sym_dst, garray_class); garray_redraw(a); } } } else { post("tab_lt-ERROR: list need 4 float arguments:"); post(" source1_offset + source2_offset + destination_offset + number_of_samples_to_compare"); } } static void tab_lt_free(t_tab_lt *x) { } static void *tab_lt_new(t_symbol *s, int argc, t_atom *argv) { t_tab_lt *x = (t_tab_lt *)pd_new(tab_lt_class); t_symbol *src1, *src2, *dst; if((argc >= 3) && IS_A_SYMBOL(argv,0) && IS_A_SYMBOL(argv,1) && IS_A_SYMBOL(argv,2)) { src1 = (t_symbol *)atom_getsymbolarg(0, argc, argv); src2 = (t_symbol *)atom_getsymbolarg(1, argc, argv); dst = (t_symbol *)atom_getsymbolarg(2, argc, argv); } else if((argc >= 2) && IS_A_SYMBOL(argv,0) && IS_A_SYMBOL(argv,1)) { src1 = (t_symbol *)atom_getsymbolarg(0, argc, argv); dst = src1; src2 = (t_symbol *)atom_getsymbolarg(1, argc, argv); } else { post("tab_lt-ERROR: need 3 symbols arguments:"); post(" source1_array_name + source2_array_name + destination_array_name"); return(0); } x->x_sym_scr1 = src1; x->x_sym_scr2 = src2; x->x_sym_dst = dst; outlet_new(&x->x_obj, &s_bang); return(x); } void tab_lt_setup(void) { tab_lt_class = class_new(gensym("tab_lt"), (t_newmethod)tab_lt_new, (t_method)tab_lt_free, sizeof(t_tab_lt), 0, A_GIMME, 0); class_addbang(tab_lt_class, (t_method)tab_lt_bang); class_addlist(tab_lt_class, (t_method)tab_lt_list); class_addmethod(tab_lt_class, (t_method)tab_lt_src1, gensym("src1"), A_DEFSYMBOL, 0); class_addmethod(tab_lt_class, (t_method)tab_lt_src2, gensym("src2"), A_DEFSYMBOL, 0); class_addmethod(tab_lt_class, (t_method)tab_lt_dst, gensym("dst"), A_DEFSYMBOL, 0); // class_sethelpsymbol(tab_lt_class, gensym("iemhelp2/tab_lt-help")); } iem_utils-v0.0.20180206/iem_tab/src/tab_get_size.c0000644000175000017500000000361212630366350021664 0ustar zmoelnigzmoelnig/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_tab written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2009 */ #include "m_pd.h" #include "iemlib.h" #include "iem_tab.h" /* -------------------------- tab_get_size ------------------------------ */ typedef struct _tab_get_size { t_object x_obj; t_symbol *x_sym_src; } t_tab_get_size; static t_class *tab_get_size_class; static void tab_get_size_set(t_tab_get_size *x, t_symbol *s) { x->x_sym_src = s; } static void tab_get_size_bang(t_tab_get_size *x) { int ok_src, size_src; iemarray_t *beg_mem_src; ok_src = iem_tab_check_arrays(gensym("tab_get_size"), x->x_sym_src, &beg_mem_src, &size_src, 0); if(ok_src) { outlet_float(x->x_obj.ob_outlet, (t_float)size_src); } } static void tab_get_size_free(t_tab_get_size *x) { } static void *tab_get_size_new(t_symbol *s, int argc, t_atom *argv) { t_tab_get_size *x = (t_tab_get_size *)pd_new(tab_get_size_class); t_symbol *src; if((argc >= 1) && IS_A_SYMBOL(argv,0)) { src = (t_symbol *)atom_getsymbolarg(0, argc, argv); } else { post("tab_get_size-ERROR: need 1 symbol argument:"); post(" destination_array_name"); return(0); } x->x_sym_src = src; outlet_new(&x->x_obj, &s_float); return(x); } void tab_get_size_setup(void) { tab_get_size_class = class_new(gensym("tab_get_size"), (t_newmethod)tab_get_size_new, (t_method)tab_get_size_free, sizeof(t_tab_get_size), 0, A_GIMME, 0); class_addbang(tab_get_size_class, (t_method)tab_get_size_bang); class_addmethod(tab_get_size_class, (t_method)tab_get_size_set, gensym("set"), A_DEFSYMBOL, 0); class_addmethod(tab_get_size_class, (t_method)tab_get_size_set, gensym("get"), A_DEFSYMBOL, 0); // class_sethelpsymbol(tab_get_size_class, gensym("iemhelp2/tab_get_size-help")); } iem_utils-v0.0.20180206/iem_tab/src/makefile_d_ppc0000644000175000017500000000260212630366350021724 0ustar zmoelnigzmoelnigcurrent: all .SUFFIXES: .d_ppc PD_INSTALL_PATH = "/Applications/Pd.app/Contents/Resources" INCLUDE = -I. -I$(PD_INSTALL_PATH)/src CFLAGS =-DPD -O2 -Wall -W -Wshadow -Wstrict-prototypes \ -Wno-unused -Wno-parentheses -Wno-switch LFLAGS = -bundle -undefined suppress -flat_namespace # the sources SRC = tab_abs.c \ tab_add.c \ tab_add_scalar.c \ tab_carth2polar.c \ tab_complex_inv.c \ tab_complex_mul.c \ tab_const.c \ tab_conv.c \ tab_copy.c \ tab_counter.c \ tab_cross_corr.c \ tab_dbtopow.c \ tab_dbtorms.c \ tab_div.c \ tab_eq.c \ tab_eq_scalar.c \ tab_fft.c \ tab_find_exact_peaks.c \ tab_find_peaks.c \ tab_ge.c \ tab_ge_scalar.c \ tab_gt.c \ tab_gt_scalar.c \ tab_get_size.c \ tab_ifft.c \ tab_le.c \ tab_le_scalar.c \ tab_lt.c \ tab_lt_scalar.c \ tab_max_index.c \ tab_min_index.c \ tab_min_max.c \ tab_mul.c \ tab_mul_scalar.c \ tab_ne.c \ tab_ne_scalar.c \ tab_powtodb.c \ tab_reverse.c \ tab_rfft.c \ tab_rifft.c \ tab_rmstodb.c \ tab_sqrt.c \ tab_sub.c \ tab_sum.c \ iem_tab.c TARGET = iem_tab.d_ppc OBJ = $(SRC:.c=.o) # # ------------------ targets ------------------------------------ # clean: rm ../$(TARGET) rm *.o all: $(OBJ) @echo :: $(OBJ) $(CC) $(LFLAGS) -o $(TARGET) *.o strip -S -x $(TARGET) mv $(TARGET) .. $(OBJ) : %.o : %.c touch $*.c $(CC) $(CFLAGS) $(INCLUDE) -c -o $*.o $*.c iem_utils-v0.0.20180206/iem_tab/src/iem_tab.dsp0000644000175000017500000000474512630366350021201 0ustar zmoelnigzmoelnig# Microsoft Developer Studio Project File - Name="iem_tab" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** NICHT BEARBEITEN ** # TARGTYPE "Win32 (x86) External Target" 0x0106 CFG=iem_tab - Win32 Debug !MESSAGE Dies ist kein gültiges Makefile. Zum Erstellen dieses Projekts mit NMAKE !MESSAGE verwenden Sie den Befehl "Makefile exportieren" und führen Sie den Befehl !MESSAGE !MESSAGE NMAKE /f "iem_tab.mak". !MESSAGE !MESSAGE Sie können beim Ausführen von NMAKE eine Konfiguration angeben !MESSAGE durch Definieren des Makros CFG in der Befehlszeile. Zum Beispiel: !MESSAGE !MESSAGE NMAKE /f "iem_tab.mak" CFG="iem_tab - Win32 Debug" !MESSAGE !MESSAGE Für die Konfiguration stehen zur Auswahl: !MESSAGE !MESSAGE "iem_tab - Win32 Release" (basierend auf "Win32 (x86) External Target") !MESSAGE "iem_tab - Win32 Debug" (basierend auf "Win32 (x86) External Target") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" !IF "$(CFG)" == "iem_tab - Win32 Release" # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "Release" # PROP BASE Intermediate_Dir "Release" # PROP BASE Cmd_Line "NMAKE /f makefile_win" # PROP BASE Rebuild_Opt "/a" # PROP BASE Target_File "makefile_win.exe" # PROP BASE Bsc_Name "makefile_win.bsc" # PROP BASE Target_Dir "" # PROP Use_Debug_Libraries 0 # PROP Output_Dir "Release" # PROP Intermediate_Dir "Release" # PROP Cmd_Line "NMAKE /f makefile_win" # PROP Rebuild_Opt "/a" # PROP Target_File "iem_tab.exe" # PROP Bsc_Name "iem_tab.bsc" # PROP Target_Dir "" !ELSEIF "$(CFG)" == "iem_tab - Win32 Debug" # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "Debug" # PROP BASE Intermediate_Dir "Debug" # PROP BASE Cmd_Line "NMAKE /f makefile_win" # PROP BASE Rebuild_Opt "/a" # PROP BASE Target_File "makefile_win.exe" # PROP BASE Bsc_Name "makefile_win.bsc" # PROP BASE Target_Dir "" # PROP Use_Debug_Libraries 1 # PROP Output_Dir "Debug" # PROP Intermediate_Dir "Debug" # PROP Cmd_Line "NMAKE /f makefile_win" # PROP Rebuild_Opt "/a" # PROP Target_File "iem_tab.exe" # PROP Bsc_Name "iem_tab.bsc" # PROP Target_Dir "" !ENDIF # Begin Target # Name "iem_tab - Win32 Release" # Name "iem_tab - Win32 Debug" !IF "$(CFG)" == "iem_tab - Win32 Release" !ELSEIF "$(CFG)" == "iem_tab - Win32 Debug" !ENDIF # Begin Source File SOURCE=.\makefile_win # End Source File # End Target # End Project iem_utils-v0.0.20180206/iem_tab/src/tab_rifft.c0000644000175000017500000003057612630366350021176 0ustar zmoelnigzmoelnig/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_tab written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2009 */ #include "m_pd.h" #include "iemlib.h" #include "iem_tab.h" #include /* -------------------------- tab_rifft ------------------------------ */ /* complex spectral domain inverse FFT to real time domain */ typedef struct _tab_rifft { t_object x_obj; int x_size_src_re; int x_size_src_im; int x_size_dst; int x_offset_src_re; int x_offset_src_im; int x_offset_dst; int x_fftsize; iemarray_t *x_beg_mem_src_re; iemarray_t *x_beg_mem_src_im; iemarray_t *x_beg_mem_dst_re; iemarray_t *x_beg_mem_dst_im; TAB_COMPLEX *x_sin_cos; t_symbol *x_sym_src_re; t_symbol *x_sym_src_im; t_symbol *x_sym_dst; } t_tab_rifft; static t_class *tab_rifft_class; static void tab_rifft_init(t_tab_rifft *x) { int i, fftsize = x->x_fftsize; t_float f, g; TAB_COMPLEX *sincos = x->x_sin_cos; g = 2.0 * 3.141592653589793 / (t_float)fftsize; for(i=0; ix_fftsize) { x->x_sin_cos = (TAB_COMPLEX *)resizebytes(x->x_sin_cos, x->x_fftsize*sizeof(TAB_COMPLEX), i*sizeof(TAB_COMPLEX)); x->x_beg_mem_dst_im = (iemarray_t *)resizebytes(x->x_beg_mem_dst_im, x->x_fftsize*sizeof(iemarray_t), i*sizeof(iemarray_t)); x->x_fftsize = i; } tab_rifft_init(x); } static void tab_rifft_dst(t_tab_rifft *x, t_symbol *s) { x->x_sym_dst = s; } static void tab_rifft_src_re(t_tab_rifft *x, t_symbol *s) { x->x_sym_src_re = s; } static void tab_rifft_src_im(t_tab_rifft *x, t_symbol *s) { x->x_sym_src_im = s; } static void tab_rifft_bang(t_tab_rifft *x) { int i, j, k; int ok_src_re, ok_src_im, ok_dst; int w_index, w_inc, i_inc, v_index; int fftsize = x->x_fftsize; int fs1 = fftsize - 1; int fs2 = fftsize / 2; TAB_COMPLEX w; TAB_COMPLEX *sincos = x->x_sin_cos; iemarray_t *vec_src_re, *vec_src_im, *vec_dst_re, *vec_dst_im; t_float old1_re, old1_im, old2_re, old2_im, g; ok_src_re = iem_tab_check_arrays(gensym("tab_rifft"), x->x_sym_src_re, &x->x_beg_mem_src_re, &x->x_size_src_re, fftsize); ok_src_im = iem_tab_check_arrays(gensym("tab_rifft"), x->x_sym_src_im, &x->x_beg_mem_src_im, &x->x_size_src_im, fftsize); ok_dst = iem_tab_check_arrays(gensym("tab_rifft"), x->x_sym_dst, &x->x_beg_mem_dst_re, &x->x_size_dst, fftsize); if(ok_src_re && ok_src_im && ok_dst) { t_garray *a; vec_src_re=x->x_beg_mem_src_re; vec_src_im=x->x_beg_mem_src_im; vec_dst_re=x->x_beg_mem_dst_re; vec_dst_im=x->x_beg_mem_dst_im; iemarray_setfloat(vec_dst_re, 0, iemarray_getfloat(vec_src_re, 0)); iemarray_setfloat(vec_dst_im, 0, 0.0); for(j=1; j>= 1; } j = 0; for(i=1;i>= 1; } j = j + k; if(i < j) { old1_re = iemarray_getfloat(vec_dst_re, j); old1_im = iemarray_getfloat(vec_dst_im, j); iemarray_setfloat(vec_dst_re, j, iemarray_getfloat(vec_dst_re, i)); iemarray_setfloat(vec_dst_im, j, iemarray_getfloat(vec_dst_im, i)); iemarray_setfloat(vec_dst_re, i, old1_re); iemarray_setfloat(vec_dst_im, i, old1_im); } } // g = 2.0f / (t_float)fftsize; /* ein fehler tritt auf beim 0.sample, hier sollte nur mal 1.0 multipliziert werden wenn gelten soll : Energie im zeitfenster == Energie im Frequenz-dichte-fenster g = 1.0f; for(i = 0; i < fs2; i++) { vec_dst_re[i] *= g; vec_dst_im[i] *= g; } */ g = 1.0 / (t_float)fftsize; for(i = 0; i < fftsize; i++) { iemarray_setfloat(vec_dst_re, i, iemarray_getfloat(vec_dst_re, i)*g); } outlet_bang(x->x_obj.ob_outlet); a = (t_garray *)pd_findbyclass(x->x_sym_dst, garray_class); garray_redraw(a); } } static void tab_rifft_list(t_tab_rifft *x, t_symbol *s, int argc, t_atom *argv) { int beg_src_re, beg_src_im, beg_dst; int i, j, k; int ok_src_re, ok_src_im, ok_dst; int w_index, w_inc, i_inc, v_index; int fftsize = x->x_fftsize; int fs1 = fftsize - 1; int fs2 = fftsize / 2; TAB_COMPLEX w; TAB_COMPLEX *sincos = x->x_sin_cos; iemarray_t *vec_src_re, *vec_src_im, *vec_dst_re, *vec_dst_im; t_float old1_re, old1_im, old2_re, old2_im, g; if((argc >= 3) && IS_A_FLOAT(argv,0) && IS_A_FLOAT(argv,1) && IS_A_FLOAT(argv,2)) { beg_src_re = (int)atom_getintarg(0, argc, argv); beg_src_im = (int)atom_getintarg(1, argc, argv); beg_dst = (int)atom_getintarg(2, argc, argv); if(beg_src_re < 0) beg_src_re = 0; if(beg_src_im < 0) beg_src_im = 0; if(beg_dst < 0) beg_dst = 0; ok_src_re = iem_tab_check_arrays(gensym("tab_rifft"), x->x_sym_src_re, &x->x_beg_mem_src_re, &x->x_size_src_re, beg_src_re+fftsize); ok_src_im = iem_tab_check_arrays(gensym("tab_rifft"), x->x_sym_src_im, &x->x_beg_mem_src_im, &x->x_size_src_im, beg_src_im+fftsize); ok_dst = iem_tab_check_arrays(gensym("tab_rifft"), x->x_sym_dst, &x->x_beg_mem_dst_re, &x->x_size_dst, beg_dst+fftsize); if(ok_src_re && ok_src_im && ok_dst) { t_garray *a; vec_src_re=x->x_beg_mem_src_re + beg_src_re; vec_src_im=x->x_beg_mem_src_im + beg_src_im; vec_dst_re=x->x_beg_mem_dst_re + beg_dst; vec_dst_im=x->x_beg_mem_dst_im; for(j=0; j>= 1; } j = 0; for(i=1;i>= 1; } j = j + k; if(i < j) { old1_re = iemarray_getfloat(vec_dst_re, j); old1_im = iemarray_getfloat(vec_dst_im, j); iemarray_setfloat(vec_dst_re, j, iemarray_getfloat(vec_dst_re, i)); iemarray_setfloat(vec_dst_im, j, iemarray_getfloat(vec_dst_im, i)); iemarray_setfloat(vec_dst_re, i, old1_re); iemarray_setfloat(vec_dst_im, i, old1_im); } } // g = 2.0f / (t_float)fftsize; /* ein fehler tritt auf beim 0.sample, hier sollte nur mal 1.0 multipliziert werden wenn gelten soll : Energie im zeitfenster == Energie im Frequenz-dichte-fenster g = 1.0f; for(i = 0; i < fs2; i++) { vec_src_re[i] *= g; vec_src_im[i] *= g; } */ g = 1.0 / (t_float)fftsize; for(i = 0; i < fftsize; i++) { iemarray_setfloat(vec_dst_re, i, iemarray_getfloat(vec_dst_re, i)*g); } outlet_bang(x->x_obj.ob_outlet); a = (t_garray *)pd_findbyclass(x->x_sym_dst, garray_class); garray_redraw(a); } } else { post("tab_rifft-ERROR: list need 3 float arguments:"); post(" source_real_offset + source_imag_offset + destination_offset"); } } static void tab_rifft_free(t_tab_rifft *x) { freebytes(x->x_sin_cos, x->x_fftsize * sizeof(TAB_COMPLEX)); freebytes(x->x_beg_mem_dst_im, x->x_fftsize * sizeof(t_float)); } static void *tab_rifft_new(t_symbol *s, int argc, t_atom *argv) { t_tab_rifft *x = (t_tab_rifft *)pd_new(tab_rifft_class); t_symbol *src_re, *src_im, *dst; int fftsize, i=1; if((argc >= 4) && IS_A_SYMBOL(argv,0) && IS_A_SYMBOL(argv,1) && IS_A_SYMBOL(argv,2) && IS_A_FLOAT(argv,3)) { src_re = (t_symbol *)atom_getsymbolarg(0, argc, argv); src_im = (t_symbol *)atom_getsymbolarg(1, argc, argv); dst = (t_symbol *)atom_getsymbolarg(2, argc, argv); fftsize = (int)atom_getintarg(3, argc, argv); } else { post("tab_rifft-ERROR: need 3 symbols + 1 float arguments:"); post(" source_real_array_name + source_imag_array_name + destination_array_name + IFFT-size"); return(0); } if(fftsize < 8) fftsize = 8; while(i <= fftsize) i *= 2; i /= 2; fftsize = i; x->x_fftsize = fftsize; x->x_sym_src_re = src_re; x->x_sym_src_im = src_im; x->x_sym_dst = dst; x->x_sin_cos = (TAB_COMPLEX *)getbytes(x->x_fftsize * sizeof(TAB_COMPLEX)); x->x_beg_mem_dst_im = (iemarray_t *)getbytes(x->x_fftsize * sizeof(iemarray_t)); tab_rifft_init(x); outlet_new(&x->x_obj, &s_bang); return(x); } void tab_rifft_setup(void) { tab_rifft_class = class_new(gensym("tab_rifft"), (t_newmethod)tab_rifft_new, (t_method)tab_rifft_free, sizeof(t_tab_rifft), 0, A_GIMME, 0); class_addbang(tab_rifft_class, (t_method)tab_rifft_bang); class_addlist(tab_rifft_class, (t_method)tab_rifft_list); class_addmethod(tab_rifft_class, (t_method)tab_rifft_ifftsize, gensym("ifftsize"), A_DEFFLOAT, 0); class_addmethod(tab_rifft_class, (t_method)tab_rifft_src_re, gensym("src_re"), A_DEFSYMBOL, 0); class_addmethod(tab_rifft_class, (t_method)tab_rifft_src_im, gensym("src_im"), A_DEFSYMBOL, 0); class_addmethod(tab_rifft_class, (t_method)tab_rifft_src_re, gensym("src1"), A_DEFSYMBOL, 0); class_addmethod(tab_rifft_class, (t_method)tab_rifft_src_im, gensym("src2"), A_DEFSYMBOL, 0); class_addmethod(tab_rifft_class, (t_method)tab_rifft_dst, gensym("dst"), A_DEFSYMBOL, 0); class_addmethod(tab_rifft_class, (t_method)tab_rifft_dst, gensym("dst1"), A_DEFSYMBOL, 0); } iem_utils-v0.0.20180206/iem_tab/src/tab_abs.c0000644000175000017500000001046312630366350020622 0ustar zmoelnigzmoelnig/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_tab written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2009 */ #include "m_pd.h" #include "iemlib.h" #include "iem_tab.h" #include /* -------------------------- tab_abs ------------------------------ */ /* x_beg_mem_dst[i] = abs(x_beg_mem_src1[i]) */ typedef struct _tab_abs { t_object x_obj; int x_size_src1; int x_size_dst; int x_offset_src1; int x_offset_dst; iemarray_t *x_beg_mem_src1; iemarray_t *x_beg_mem_dst; t_symbol *x_sym_scr1; t_symbol *x_sym_dst; } t_tab_abs; static t_class *tab_abs_class; static void tab_abs_src(t_tab_abs *x, t_symbol *s) { x->x_sym_scr1 = s; } static void tab_abs_dst(t_tab_abs *x, t_symbol *s) { x->x_sym_dst = s; } static void tab_abs_bang(t_tab_abs *x) { int i, n; int ok_src, ok_dst; iemarray_t *vec_src, *vec_dst; ok_src = iem_tab_check_arrays(gensym("tab_abs"), x->x_sym_scr1, &x->x_beg_mem_src1, &x->x_size_src1, 0); ok_dst = iem_tab_check_arrays(gensym("tab_abs"), x->x_sym_dst, &x->x_beg_mem_dst, &x->x_size_dst, 0); if(ok_src && ok_dst) { if(x->x_size_src1 < x->x_size_dst) n = x->x_size_src1; else n = x->x_size_dst; vec_src = x->x_beg_mem_src1; vec_dst = x->x_beg_mem_dst; if(n) { t_garray *a; for(i=0; ix_obj.ob_outlet); a = (t_garray *)pd_findbyclass(x->x_sym_dst, garray_class); garray_redraw(a); } } } static void tab_abs_list(t_tab_abs *x, t_symbol *s, int argc, t_atom *argv) { int beg_src, beg_dst; int i, n; int ok_src, ok_dst; iemarray_t *vec_src, *vec_dst; if((argc >= 3) && IS_A_FLOAT(argv,0) && IS_A_FLOAT(argv,1) && IS_A_FLOAT(argv,2)) { beg_src = (int)atom_getintarg(0, argc, argv); beg_dst = (int)atom_getintarg(1, argc, argv); n = (int)atom_getintarg(2, argc, argv); if(beg_src < 0) beg_src = 0; if(beg_dst < 0) beg_dst = 0; if(n < 0) n = 0; ok_src = iem_tab_check_arrays(gensym("tab_abs"), x->x_sym_scr1, &x->x_beg_mem_src1, &x->x_size_src1, beg_src+n); ok_dst = iem_tab_check_arrays(gensym("tab_abs"), x->x_sym_dst, &x->x_beg_mem_dst, &x->x_size_dst, beg_dst+n); if(ok_src && ok_dst) { vec_src = x->x_beg_mem_src1 + beg_src; vec_dst = x->x_beg_mem_dst + beg_dst; if(n) { t_garray *a; for(i=0; ix_obj.ob_outlet); a = (t_garray *)pd_findbyclass(x->x_sym_dst, garray_class); garray_redraw(a); } } } else { post("tab_abs-ERROR: list need 3 float arguments:"); post(" source_offset + destination_offset + number_of_samples_to_abs"); } } static void tab_abs_free(t_tab_abs *x) { } static void *tab_abs_new(t_symbol *s, int argc, t_atom *argv) { t_tab_abs *x = (t_tab_abs *)pd_new(tab_abs_class); t_symbol *src, *dst; if((argc >= 2) && IS_A_SYMBOL(argv,0) && IS_A_SYMBOL(argv,1)) { src = (t_symbol *)atom_getsymbolarg(0, argc, argv); dst = (t_symbol *)atom_getsymbolarg(1, argc, argv); } else if((argc >= 1) && IS_A_SYMBOL(argv,0)) { src = (t_symbol *)atom_getsymbolarg(0, argc, argv); dst = src; } else { post("tab_abs-ERROR: need 2 symbols arguments:"); post(" source_array_name + destination_array_name"); return(0); } x->x_sym_scr1 = src; x->x_sym_dst = dst; outlet_new(&x->x_obj, &s_bang); return(x); } void tab_abs_setup(void) { tab_abs_class = class_new(gensym("tab_abs"), (t_newmethod)tab_abs_new, (t_method)tab_abs_free, sizeof(t_tab_abs), 0, A_GIMME, 0); class_addbang(tab_abs_class, (t_method)tab_abs_bang); class_addlist(tab_abs_class, (t_method)tab_abs_list); class_addmethod(tab_abs_class, (t_method)tab_abs_src, gensym("src"), A_DEFSYMBOL, 0); class_addmethod(tab_abs_class, (t_method)tab_abs_src, gensym("src1"), A_DEFSYMBOL, 0); class_addmethod(tab_abs_class, (t_method)tab_abs_dst, gensym("dst"), A_DEFSYMBOL, 0); // class_sethelpsymbol(tab_abs_class, gensym("iemhelp2/tab_abs-help")); } iem_utils-v0.0.20180206/iem_tab/src/tab_le_scalar.c0000644000175000017500000001177612630366350022012 0ustar zmoelnigzmoelnig/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_tab written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2009 */ #include "m_pd.h" #include "iemlib.h" #include "iem_tab.h" /* -------------------------- tab_le_scalar ------------------------------ */ /* if(x_beg_mem_src1[i] <= compare) */ /* x_beg_mem_dst[i] = 1.0f; */ /* else */ /* x_beg_mem_dst[i] += 0.0f; */ typedef struct _tab_le_scalar { t_object x_obj; int x_size_src1; int x_size_dst; int x_offset_src1; int x_offset_dst; iemarray_t *x_beg_mem_src1; iemarray_t *x_beg_mem_dst; t_symbol *x_sym_scr1; t_symbol *x_sym_dst; } t_tab_le_scalar; static t_class *tab_le_scalar_class; static void tab_le_scalar_src(t_tab_le_scalar *x, t_symbol *s) { x->x_sym_scr1 = s; } static void tab_le_scalar_float(t_tab_le_scalar *x, t_floatarg compare) { int i, n; int ok_src1, ok_dst; iemarray_t *vec_src1, *vec_dst; ok_src1 = iem_tab_check_arrays(gensym("tab_le_scalar"), x->x_sym_scr1, &x->x_beg_mem_src1, &x->x_size_src1, 0); ok_dst = iem_tab_check_arrays(gensym("tab_le_scalar"), x->x_sym_dst, &x->x_beg_mem_dst, &x->x_size_dst, 0); if(ok_src1 && ok_dst) { if(x->x_size_src1 < x->x_size_dst) n = x->x_size_src1; else n = x->x_size_dst; vec_src1 = x->x_beg_mem_src1; vec_dst = x->x_beg_mem_dst; if(n) { t_garray *a; for(i=0; ix_obj.ob_outlet); a = (t_garray *)pd_findbyclass(x->x_sym_dst, garray_class); garray_redraw(a); } } } static void tab_le_scalar_dst(t_tab_le_scalar *x, t_symbol *s) { x->x_sym_dst = s; } static void tab_le_scalar_list(t_tab_le_scalar *x, t_symbol *s, int argc, t_atom *argv) { int beg_src1, beg_dst; int i, n; int ok_src1, ok_dst; t_float compare; iemarray_t *vec_src1, *vec_dst; if((argc >= 4) && IS_A_FLOAT(argv,0) && IS_A_FLOAT(argv,1) && IS_A_FLOAT(argv,2) && IS_A_FLOAT(argv,3)) { beg_src1 = (int)atom_getintarg(0, argc, argv); beg_dst = (int)atom_getintarg(1, argc, argv); n = (int)atom_getintarg(2, argc, argv); compare = (t_float)atom_getfloatarg(3, argc, argv); if(beg_src1 < 0) beg_src1 = 0; if(beg_dst < 0) beg_dst = 0; if(n < 0) n = 0; ok_src1 = iem_tab_check_arrays(gensym("tab_le_scalar"), x->x_sym_scr1, &x->x_beg_mem_src1, &x->x_size_src1, beg_src1+n); ok_dst = iem_tab_check_arrays(gensym("tab_le_scalar"), x->x_sym_dst, &x->x_beg_mem_dst, &x->x_size_dst, beg_dst+n); if(ok_src1 && ok_dst) { vec_src1 = x->x_beg_mem_src1 + beg_src1; vec_dst = x->x_beg_mem_dst + beg_dst; if(n) { t_garray *a; for(i=0; ix_obj.ob_outlet); a = (t_garray *)pd_findbyclass(x->x_sym_dst, garray_class); garray_redraw(a); } } } else { post("tab_le_scalar-ERROR: list need 4 float arguments:"); post(" source1_offset + destination_offset + number_of_samples_to_compare + compare_scalar"); } } static void tab_le_scalar_free(t_tab_le_scalar *x) { } static void *tab_le_scalar_new(t_symbol *s, int argc, t_atom *argv) { t_tab_le_scalar *x = (t_tab_le_scalar *)pd_new(tab_le_scalar_class); t_symbol *src1, *dst; if((argc >= 2) && IS_A_SYMBOL(argv,0) && IS_A_SYMBOL(argv,1)) { src1 = (t_symbol *)atom_getsymbolarg(0, argc, argv); dst = (t_symbol *)atom_getsymbolarg(1, argc, argv); } else if((argc >= 1) && IS_A_SYMBOL(argv,0)) { src1 = (t_symbol *)atom_getsymbolarg(0, argc, argv); dst = src1; } else { post("tab_le_scalar-ERROR: need 2 symbol arguments:"); post(" source_array_name + destination_array_name"); return(0); } x->x_sym_scr1 = src1; x->x_sym_dst = dst; outlet_new(&x->x_obj, &s_bang); return(x); } void tab_le_scalar_setup(void) { tab_le_scalar_class = class_new(gensym("tab_le_scalar"), (t_newmethod)tab_le_scalar_new, (t_method)tab_le_scalar_free, sizeof(t_tab_le_scalar), 0, A_GIMME, 0); class_addfloat(tab_le_scalar_class, (t_method)tab_le_scalar_float); class_addlist(tab_le_scalar_class, (t_method)tab_le_scalar_list); class_addmethod(tab_le_scalar_class, (t_method)tab_le_scalar_src, gensym("src1"), A_DEFSYMBOL, 0); class_addmethod(tab_le_scalar_class, (t_method)tab_le_scalar_src, gensym("src"), A_DEFSYMBOL, 0); class_addmethod(tab_le_scalar_class, (t_method)tab_le_scalar_dst, gensym("dst"), A_DEFSYMBOL, 0); // class_sethelpsymbol(tab_le_scalar_class, gensym("iemhelp2/tab_le_scalar-help")); } iem_utils-v0.0.20180206/iem_tab/src/tab_rmstodb.c0000644000175000017500000001153112630366350021524 0ustar zmoelnigzmoelnig/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_tab written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2010 */ #include "m_pd.h" #include "iemlib.h" #include "iem_tab.h" #include #define IEMTABLOGTEN 2.302585092994046 /* -------------------------- tab_rmstodb ------------------------------ */ typedef struct _tab_rmstodb { t_object x_obj; int x_size_src1; int x_size_dst; int x_offset_src1; int x_offset_dst; iemarray_t *x_beg_mem_src1; iemarray_t *x_beg_mem_dst; t_symbol *x_sym_scr1; t_symbol *x_sym_dst; } t_tab_rmstodb; static t_class *tab_rmstodb_class; static void tab_rmstodb_src(t_tab_rmstodb *x, t_symbol *s) { x->x_sym_scr1 = s; } static void tab_rmstodb_dst(t_tab_rmstodb *x, t_symbol *s) { x->x_sym_dst = s; } static void tab_rmstodb_bang(t_tab_rmstodb *x) { int i, n; int ok_src, ok_dst; iemarray_t *vec_src, *vec_dst; ok_src = iem_tab_check_arrays(gensym("tab_rmstodb"), x->x_sym_scr1, &x->x_beg_mem_src1, &x->x_size_src1, 0); ok_dst = iem_tab_check_arrays(gensym("tab_rmstodb"), x->x_sym_dst, &x->x_beg_mem_dst, &x->x_size_dst, 0); if(ok_src && ok_dst) { if(x->x_size_src1 < x->x_size_dst) n = x->x_size_src1; else n = x->x_size_dst; vec_src = x->x_beg_mem_src1; vec_dst = x->x_beg_mem_dst; if(n) { t_garray *a; for(i=0; ix_obj.ob_outlet); a = (t_garray *)pd_findbyclass(x->x_sym_dst, garray_class); garray_redraw(a); } } } static void tab_rmstodb_list(t_tab_rmstodb *x, t_symbol *s, int argc, t_atom *argv) { int beg_src, beg_dst; int i, n; int ok_src, ok_dst; iemarray_t *vec_src, *vec_dst; if((argc >= 3) && IS_A_FLOAT(argv,0) && IS_A_FLOAT(argv,1) && IS_A_FLOAT(argv,2)) { beg_src = (int)atom_getintarg(0, argc, argv); beg_dst = (int)atom_getintarg(1, argc, argv); n = (int)atom_getintarg(2, argc, argv); if(beg_src < 0) beg_src = 0; if(beg_dst < 0) beg_dst = 0; if(n < 0) n = 0; ok_src = iem_tab_check_arrays(gensym("tab_rmstodb"), x->x_sym_scr1, &x->x_beg_mem_src1, &x->x_size_src1, beg_src+n); ok_dst = iem_tab_check_arrays(gensym("tab_rmstodb"), x->x_sym_dst, &x->x_beg_mem_dst, &x->x_size_dst, beg_dst+n); if(ok_src && ok_dst) { vec_src = x->x_beg_mem_src1 + beg_src; vec_dst = x->x_beg_mem_dst + beg_dst; if(n) { t_garray *a; for(i=0; ix_obj.ob_outlet); a = (t_garray *)pd_findbyclass(x->x_sym_dst, garray_class); garray_redraw(a); } } } else { post("tab_rmstodb-ERROR: list need 3 float arguments:"); post(" source_offset + destination_offset + number_of_samples_to_rmstodb"); } } static void tab_rmstodb_free(t_tab_rmstodb *x) { } static void *tab_rmstodb_new(t_symbol *s, int argc, t_atom *argv) { t_tab_rmstodb *x = (t_tab_rmstodb *)pd_new(tab_rmstodb_class); t_symbol *src, *dst; if((argc >= 2) && IS_A_SYMBOL(argv,0) && IS_A_SYMBOL(argv,1)) { src = (t_symbol *)atom_getsymbolarg(0, argc, argv); dst = (t_symbol *)atom_getsymbolarg(1, argc, argv); } else if((argc >= 1) && IS_A_SYMBOL(argv,0)) { src = (t_symbol *)atom_getsymbolarg(0, argc, argv); dst = src; } else { post("tab_rmstodb-ERROR: need 2 symbols arguments:"); post(" source_array_name + destination_array_name"); return(0); } x->x_sym_scr1 = src; x->x_sym_dst = dst; outlet_new(&x->x_obj, &s_bang); return(x); } void tab_rmstodb_setup(void) { tab_rmstodb_class = class_new(gensym("tab_rmstodb"), (t_newmethod)tab_rmstodb_new, (t_method)tab_rmstodb_free, sizeof(t_tab_rmstodb), 0, A_GIMME, 0); class_addbang(tab_rmstodb_class, (t_method)tab_rmstodb_bang); class_addlist(tab_rmstodb_class, (t_method)tab_rmstodb_list); class_addmethod(tab_rmstodb_class, (t_method)tab_rmstodb_src, gensym("src"), A_DEFSYMBOL, 0); class_addmethod(tab_rmstodb_class, (t_method)tab_rmstodb_src, gensym("src1"), A_DEFSYMBOL, 0); class_addmethod(tab_rmstodb_class, (t_method)tab_rmstodb_dst, gensym("dst"), A_DEFSYMBOL, 0); } iem_utils-v0.0.20180206/iem_tab/src/tab_ne.c0000644000175000017500000001314112630366350020453 0ustar zmoelnigzmoelnig/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_tab written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2009 */ #include "m_pd.h" #include "iemlib.h" #include "iem_tab.h" /* -------------------------- tab_ne ------------------------------ */ /* if(x_beg_mem_src1[i] != x_beg_mem_src2[i]) */ /* x_beg_mem_dst[i] = 1.0f; */ /* else */ /* x_beg_mem_dst[i] = 0.0f; */ typedef struct _tab_ne { t_object x_obj; int x_size_src1; int x_size_src2; int x_size_dst; int x_offset_src1; int x_offset_src2; int x_offset_dst; iemarray_t *x_beg_mem_src1; iemarray_t *x_beg_mem_src2; iemarray_t *x_beg_mem_dst; t_symbol *x_sym_scr1; t_symbol *x_sym_scr2; t_symbol *x_sym_dst; } t_tab_ne; static t_class *tab_ne_class; static void tab_ne_src1(t_tab_ne *x, t_symbol *s) { x->x_sym_scr1 = s; } static void tab_ne_src2(t_tab_ne *x, t_symbol *s) { x->x_sym_scr2 = s; } static void tab_ne_dst(t_tab_ne *x, t_symbol *s) { x->x_sym_dst = s; } static void tab_ne_bang(t_tab_ne *x) { int i, n; int ok_src1, ok_src2, ok_dst; iemarray_t *vec_src1, *vec_src2, *vec_dst; ok_src1 = iem_tab_check_arrays(gensym("tab_ne"), x->x_sym_scr1, &x->x_beg_mem_src1, &x->x_size_src1, 0); ok_src2 = iem_tab_check_arrays(gensym("tab_ne"), x->x_sym_scr2, &x->x_beg_mem_src2, &x->x_size_src2, 0); ok_dst = iem_tab_check_arrays(gensym("tab_ne"), x->x_sym_dst, &x->x_beg_mem_dst, &x->x_size_dst, 0); if(ok_src1 && ok_src2 && ok_dst) { if(x->x_size_src1 < x->x_size_dst) n = x->x_size_src1; else n = x->x_size_dst; if(x->x_size_src2 < n) n = x->x_size_src2; vec_src1 = x->x_beg_mem_src1; vec_src2 = x->x_beg_mem_src2; vec_dst = x->x_beg_mem_dst; if(n) { t_garray *a; for(i=0; ix_obj.ob_outlet); a = (t_garray *)pd_findbyclass(x->x_sym_dst, garray_class); garray_redraw(a); } } } static void tab_ne_list(t_tab_ne *x, t_symbol *s, int argc, t_atom *argv) { int beg_src1, beg_src2, beg_dst; int i, n; int ok_src1, ok_src2, ok_dst; iemarray_t *vec_src1, *vec_src2, *vec_dst; if((argc >= 4) && IS_A_FLOAT(argv,0) && IS_A_FLOAT(argv,1) && IS_A_FLOAT(argv,2) && IS_A_FLOAT(argv,3)) { beg_src1 = (int)atom_getintarg(0, argc, argv); beg_src2 = (int)atom_getintarg(1, argc, argv); beg_dst = (int)atom_getintarg(2, argc, argv); n = (int)atom_getintarg(3, argc, argv); if(beg_src1 < 0) beg_src1 = 0; if(beg_src2 < 0) beg_src2 = 0; if(beg_dst < 0) beg_dst = 0; if(n < 0) n = 0; ok_src1 = iem_tab_check_arrays(gensym("tab_ne"), x->x_sym_scr1, &x->x_beg_mem_src1, &x->x_size_src1, beg_src1+n); ok_src2 = iem_tab_check_arrays(gensym("tab_ne"), x->x_sym_scr2, &x->x_beg_mem_src2, &x->x_size_src2, beg_src2+n); ok_dst = iem_tab_check_arrays(gensym("tab_ne"), x->x_sym_dst, &x->x_beg_mem_dst, &x->x_size_dst, beg_dst+n); if(ok_src1 && ok_src2 && ok_dst) { vec_src1 = x->x_beg_mem_src1 + beg_src1; vec_src2 = x->x_beg_mem_src2 + beg_src2; vec_dst = x->x_beg_mem_dst + beg_dst; if(n) { t_garray *a; for(i=0; ix_obj.ob_outlet); a = (t_garray *)pd_findbyclass(x->x_sym_dst, garray_class); garray_redraw(a); } } } else { post("tab_ne-ERROR: list need 4 float arguments:"); post(" source1_offset + source2_offset + destination_offset + number_of_samples_to_compare"); } } static void tab_ne_free(t_tab_ne *x) { } static void *tab_ne_new(t_symbol *s, int argc, t_atom *argv) { t_tab_ne *x = (t_tab_ne *)pd_new(tab_ne_class); t_symbol *src1, *src2, *dst; if((argc >= 3) && IS_A_SYMBOL(argv,0) && IS_A_SYMBOL(argv,1) && IS_A_SYMBOL(argv,2)) { src1 = (t_symbol *)atom_getsymbolarg(0, argc, argv); src2 = (t_symbol *)atom_getsymbolarg(1, argc, argv); dst = (t_symbol *)atom_getsymbolarg(2, argc, argv); } else if((argc >= 2) && IS_A_SYMBOL(argv,0) && IS_A_SYMBOL(argv,1)) { src1 = (t_symbol *)atom_getsymbolarg(0, argc, argv); dst = src1; src2 = (t_symbol *)atom_getsymbolarg(1, argc, argv); } else { post("tab_ne-ERROR: need 3 symbols arguments:"); post(" source1_array_name + source2_array_name + destination_array_name"); return(0); } x->x_sym_scr1 = src1; x->x_sym_scr2 = src2; x->x_sym_dst = dst; outlet_new(&x->x_obj, &s_bang); return(x); } void tab_ne_setup(void) { tab_ne_class = class_new(gensym("tab_ne"), (t_newmethod)tab_ne_new, (t_method)tab_ne_free, sizeof(t_tab_ne), 0, A_GIMME, 0); class_addbang(tab_ne_class, (t_method)tab_ne_bang); class_addlist(tab_ne_class, (t_method)tab_ne_list); class_addmethod(tab_ne_class, (t_method)tab_ne_src1, gensym("src1"), A_DEFSYMBOL, 0); class_addmethod(tab_ne_class, (t_method)tab_ne_src2, gensym("src2"), A_DEFSYMBOL, 0); class_addmethod(tab_ne_class, (t_method)tab_ne_dst, gensym("dst"), A_DEFSYMBOL, 0); // class_sethelpsymbol(tab_ne_class, gensym("iemhelp2/tab_ne-help")); } iem_utils-v0.0.20180206/iem_tab/src/tab_lt_scalar.c0000644000175000017500000001177312630366350022026 0ustar zmoelnigzmoelnig/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_tab written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2009 */ #include "m_pd.h" #include "iemlib.h" #include "iem_tab.h" /* -------------------------- tab_lt_scalar ------------------------------ */ /* if(x_beg_mem_src1[i] < compare) */ /* x_beg_mem_dst[i] = 1.0f; */ /* else */ /* x_beg_mem_dst[i] += 0.0f; */ typedef struct _tab_lt_scalar { t_object x_obj; int x_size_src1; int x_size_dst; int x_offset_src1; int x_offset_dst; iemarray_t *x_beg_mem_src1; iemarray_t *x_beg_mem_dst; t_symbol *x_sym_scr1; t_symbol *x_sym_dst; } t_tab_lt_scalar; static t_class *tab_lt_scalar_class; static void tab_lt_scalar_src(t_tab_lt_scalar *x, t_symbol *s) { x->x_sym_scr1 = s; } static void tab_lt_scalar_float(t_tab_lt_scalar *x, t_floatarg compare) { int i, n; int ok_src1, ok_dst; iemarray_t *vec_src1, *vec_dst; ok_src1 = iem_tab_check_arrays(gensym("tab_lt_scalar"), x->x_sym_scr1, &x->x_beg_mem_src1, &x->x_size_src1, 0); ok_dst = iem_tab_check_arrays(gensym("tab_lt_scalar"), x->x_sym_dst, &x->x_beg_mem_dst, &x->x_size_dst, 0); if(ok_src1 && ok_dst) { if(x->x_size_src1 < x->x_size_dst) n = x->x_size_src1; else n = x->x_size_dst; vec_src1 = x->x_beg_mem_src1; vec_dst = x->x_beg_mem_dst; if(n) { t_garray *a; for(i=0; ix_obj.ob_outlet); a = (t_garray *)pd_findbyclass(x->x_sym_dst, garray_class); garray_redraw(a); } } } static void tab_lt_scalar_dst(t_tab_lt_scalar *x, t_symbol *s) { x->x_sym_dst = s; } static void tab_lt_scalar_list(t_tab_lt_scalar *x, t_symbol *s, int argc, t_atom *argv) { int beg_src1, beg_dst; int i, n; int ok_src1, ok_dst; t_float compare; iemarray_t *vec_src1, *vec_dst; if((argc >= 4) && IS_A_FLOAT(argv,0) && IS_A_FLOAT(argv,1) && IS_A_FLOAT(argv,2) && IS_A_FLOAT(argv,3)) { beg_src1 = (int)atom_getintarg(0, argc, argv); beg_dst = (int)atom_getintarg(1, argc, argv); n = (int)atom_getintarg(2, argc, argv); compare = (t_float)atom_getfloatarg(3, argc, argv); if(beg_src1 < 0) beg_src1 = 0; if(beg_dst < 0) beg_dst = 0; if(n < 0) n = 0; ok_src1 = iem_tab_check_arrays(gensym("tab_lt_scalar"), x->x_sym_scr1, &x->x_beg_mem_src1, &x->x_size_src1, beg_src1+n); ok_dst = iem_tab_check_arrays(gensym("tab_lt_scalar"), x->x_sym_dst, &x->x_beg_mem_dst, &x->x_size_dst, beg_dst+n); if(ok_src1 && ok_dst) { vec_src1 = x->x_beg_mem_src1 + beg_src1; vec_dst = x->x_beg_mem_dst + beg_dst; if(n) { t_garray *a; for(i=0; ix_obj.ob_outlet); a = (t_garray *)pd_findbyclass(x->x_sym_dst, garray_class); garray_redraw(a); } } } else { post("tab_lt_scalar-ERROR: list need 4 float arguments:"); post(" source1_offset + destination_offset + number_of_samples_to_compare + compare_scalar"); } } static void tab_lt_scalar_free(t_tab_lt_scalar *x) { } static void *tab_lt_scalar_new(t_symbol *s, int argc, t_atom *argv) { t_tab_lt_scalar *x = (t_tab_lt_scalar *)pd_new(tab_lt_scalar_class); t_symbol *src1, *dst; if((argc >= 2) && IS_A_SYMBOL(argv,0) && IS_A_SYMBOL(argv,1)) { src1 = (t_symbol *)atom_getsymbolarg(0, argc, argv); dst = (t_symbol *)atom_getsymbolarg(1, argc, argv); } else if((argc >= 1) && IS_A_SYMBOL(argv,0)) { src1 = (t_symbol *)atom_getsymbolarg(0, argc, argv); dst = src1; } else { post("tab_lt_scalar-ERROR: need 2 symbol arguments:"); post(" source_array_name + destination_array_name"); return(0); } x->x_sym_scr1 = src1; x->x_sym_dst = dst; outlet_new(&x->x_obj, &s_bang); return(x); } void tab_lt_scalar_setup(void) { tab_lt_scalar_class = class_new(gensym("tab_lt_scalar"), (t_newmethod)tab_lt_scalar_new, (t_method)tab_lt_scalar_free, sizeof(t_tab_lt_scalar), 0, A_GIMME, 0); class_addfloat(tab_lt_scalar_class, (t_method)tab_lt_scalar_float); class_addlist(tab_lt_scalar_class, (t_method)tab_lt_scalar_list); class_addmethod(tab_lt_scalar_class, (t_method)tab_lt_scalar_src, gensym("src1"), A_DEFSYMBOL, 0); class_addmethod(tab_lt_scalar_class, (t_method)tab_lt_scalar_src, gensym("src"), A_DEFSYMBOL, 0); class_addmethod(tab_lt_scalar_class, (t_method)tab_lt_scalar_dst, gensym("dst"), A_DEFSYMBOL, 0); // class_sethelpsymbol(tab_lt_scalar_class, gensym("iemhelp2/tab_lt_scalar-help")); } iem_utils-v0.0.20180206/iem_tab/src/makefile_vc9proj0000644000175000017500000000323612630366350022237 0ustar zmoelnigzmoelnigTARGET = iem_tab all: ..\$(TARGET).dll VIS_CPP_PATH = "$(PROGRAMFILES)\Microsoft Visual Studio 9.0\VC" VIS_SDK_PATH = "$(PROGRAMFILES)\Microsoft SDKs\Windows\v6.0A" PD_INST_PATH = "$(PROGRAMFILES)\pd" PD_WIN_INCLUDE_PATH = /I. /I..\..\include /I$(PD_INST_PATH)\src /I$(VIS_CPP_PATH)\include PD_WIN_C_FLAGS = /nologo /W3 /WX /DMSW /DNT /DPD /DWIN32 /DWINDOWS /DHAVE_G_CANVAS_H /Ox -D_CRT_SECURE_NO_WARNINGS PD_WIN_L_FLAGS = /nologo PD_WIN_LIB = /NODEFAULTLIB:libcmt /NODEFAULTLIB:oldnames /NODEFAULTLIB:kernel32 \ $(VIS_CPP_PATH)\lib\libcmt.lib \ $(VIS_CPP_PATH)\lib\oldnames.lib \ $(VIS_SDK_PATH)\lib\kernel32.lib \ $(PD_INST_PATH)\bin\pd.lib SRC = tab_abs.c \ tab_add.c \ tab_add_scalar.c \ tab_carth2polar.c \ tab_complex_inv.c \ tab_complex_mul.c \ tab_const.c \ tab_conv.c \ tab_copy.c \ tab_counter.c \ tab_cross_corr.c \ tab_dbtorms.c \ tab_dbtopow.c \ tab_div.c \ tab_eq.c \ tab_eq_scalar.c \ tab_fft.c \ tab_find_exact_peaks.c \ tab_find_peaks.c \ tab_ge.c \ tab_ge_scalar.c \ tab_gt.c \ tab_gt_scalar.c \ tab_get_size.c \ tab_ifft.c \ tab_le.c \ tab_le_scalar.c \ tab_lt.c \ tab_lt_scalar.c \ tab_max_index.c \ tab_min_index.c \ tab_min_max.c \ tab_mul.c \ tab_mul_scalar.c \ tab_ne.c \ tab_ne_scalar.c \ tab_powtodb.c \ tab_reverse.c \ tab_rmstodb.c \ tab_rfft.c \ tab_rifft.c \ tab_sqrt.c \ tab_sub.c \ tab_sum.c \ $(TARGET).c OBJ = $(SRC:.c=.obj) .c.obj: cl $(PD_WIN_C_FLAGS) $(PD_WIN_INCLUDE_PATH) /c $*.c ..\$(TARGET).dll: $(OBJ) link $(PD_WIN_L_FLAGS) /dll /export:$(TARGET)_setup \ /out:..\$(TARGET).dll $(OBJ) $(PD_WIN_LIB) clean: del *.obj iem_utils-v0.0.20180206/iem_tab/src/tab_mul_scalar.c0000644000175000017500000001130712630366350022175 0ustar zmoelnigzmoelnig/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_tab written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2009 */ #include "m_pd.h" #include "iemlib.h" #include "iem_tab.h" /* -------------------------- tab_mul_scalar ------------------------------ */ /* x_beg_mem_dst[i] = x_beg_mem_src1[i]*m */ typedef struct _tab_mul_scalar { t_object x_obj; int x_size_src1; int x_size_dst; int x_offset_src1; int x_offset_dst; iemarray_t *x_beg_mem_src1; iemarray_t *x_beg_mem_dst; t_symbol *x_sym_scr1; t_symbol *x_sym_dst; } t_tab_mul_scalar; static t_class *tab_mul_scalar_class; static void tab_mul_scalar_src(t_tab_mul_scalar *x, t_symbol *s) { x->x_sym_scr1 = s; } static void tab_mul_scalar_float(t_tab_mul_scalar *x, t_floatarg m) { int i, n; int ok_src1, ok_dst; iemarray_t *vec_src1, *vec_dst; ok_src1 = iem_tab_check_arrays(gensym("tab_mul_scalar"), x->x_sym_scr1, &x->x_beg_mem_src1, &x->x_size_src1, 0); ok_dst = iem_tab_check_arrays(gensym("tab_mul_scalar"), x->x_sym_dst, &x->x_beg_mem_dst, &x->x_size_dst, 0); if(ok_src1 && ok_dst) { if(x->x_size_src1 < x->x_size_dst) n = x->x_size_src1; else n = x->x_size_dst; vec_src1 = x->x_beg_mem_src1; vec_dst = x->x_beg_mem_dst; if(n) { t_garray *a; for(i=0; ix_obj.ob_outlet); a = (t_garray *)pd_findbyclass(x->x_sym_dst, garray_class); garray_redraw(a); } } } static void tab_mul_scalar_dst(t_tab_mul_scalar *x, t_symbol *s) { x->x_sym_dst = s; } static void tab_mul_scalar_list(t_tab_mul_scalar *x, t_symbol *s, int argc, t_atom *argv) { int beg_src1, beg_dst; int i, n; int ok_src1, ok_dst; t_float m; iemarray_t *vec_src1, *vec_dst; if((argc >= 4) && IS_A_FLOAT(argv,0) && IS_A_FLOAT(argv,1) && IS_A_FLOAT(argv,2) && IS_A_FLOAT(argv,3)) { beg_src1 = (int)atom_getintarg(0, argc, argv); beg_dst = (int)atom_getintarg(1, argc, argv); n = (int)atom_getintarg(2, argc, argv); m = (t_float)atom_getfloatarg(3, argc, argv); if(beg_src1 < 0) beg_src1 = 0; if(beg_dst < 0) beg_dst = 0; if(n < 0) n = 0; ok_src1 = iem_tab_check_arrays(gensym("tab_mul_scalar"), x->x_sym_scr1, &x->x_beg_mem_src1, &x->x_size_src1, beg_src1+n); ok_dst = iem_tab_check_arrays(gensym("tab_mul_scalar"), x->x_sym_dst, &x->x_beg_mem_dst, &x->x_size_dst, beg_dst+n); if(ok_src1 && ok_dst) { vec_src1 = x->x_beg_mem_src1 + beg_src1; vec_dst = x->x_beg_mem_dst + beg_dst; if(n) { t_garray *a; for(i=0; ix_obj.ob_outlet); a = (t_garray *)pd_findbyclass(x->x_sym_dst, garray_class); garray_redraw(a); } } } else { post("tab_mul_scalar-ERROR: list need 4 float arguments:"); post(" source1_offset + destination_offset + number_of_samples_to_mul + mul_scalar"); } } static void tab_mul_scalar_free(t_tab_mul_scalar *x) { } static void *tab_mul_scalar_new(t_symbol *s, int argc, t_atom *argv) { t_tab_mul_scalar *x = (t_tab_mul_scalar *)pd_new(tab_mul_scalar_class); t_symbol *src1, *dst; if((argc >= 2) && IS_A_SYMBOL(argv,0) && IS_A_SYMBOL(argv,1)) { src1 = (t_symbol *)atom_getsymbolarg(0, argc, argv); dst = (t_symbol *)atom_getsymbolarg(1, argc, argv); } else if((argc >= 1) && IS_A_SYMBOL(argv,0)) { src1 = (t_symbol *)atom_getsymbolarg(0, argc, argv); dst = src1; } else { post("tab_mul_scalar-ERROR: need 2 symbol arguments:"); post(" source_array_name + destination_array_name"); return(0); } x->x_sym_scr1 = src1; x->x_sym_dst = dst; outlet_new(&x->x_obj, &s_bang); return(x); } void tab_mul_scalar_setup(void) { tab_mul_scalar_class = class_new(gensym("tab_mul_scalar"), (t_newmethod)tab_mul_scalar_new, (t_method)tab_mul_scalar_free, sizeof(t_tab_mul_scalar), 0, A_GIMME, 0); class_addfloat(tab_mul_scalar_class, (t_method)tab_mul_scalar_float); class_addlist(tab_mul_scalar_class, (t_method)tab_mul_scalar_list); class_addmethod(tab_mul_scalar_class, (t_method)tab_mul_scalar_src, gensym("src1"), A_DEFSYMBOL, 0); class_addmethod(tab_mul_scalar_class, (t_method)tab_mul_scalar_src, gensym("src"), A_DEFSYMBOL, 0); class_addmethod(tab_mul_scalar_class, (t_method)tab_mul_scalar_dst, gensym("dst"), A_DEFSYMBOL, 0); // class_sethelpsymbol(tab_mul_scalar_class, gensym("iemhelp2/tab_mul_scalar-help")); } iem_utils-v0.0.20180206/iem_tab/src/tab_max_index.c0000644000175000017500000000741412630366350022033 0ustar zmoelnigzmoelnig/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_tab written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2009 */ #include "m_pd.h" #include "iemlib.h" #include "iem_tab.h" /* -------------------------- tab_max_index ------------------------------ */ typedef struct _tab_max_index { t_object x_obj; int x_size_src1; int x_offset_src1; iemarray_t *x_beg_mem_src1; t_symbol *x_sym_scr1; void *x_bang_out; void *x_max_out; void *x_max_index_out; } t_tab_max_index; static t_class *tab_max_index_class; static void tab_max_index_src(t_tab_max_index *x, t_symbol *s) { x->x_sym_scr1 = s; } static void tab_max_index_bang(t_tab_max_index *x) { int i, n; int ok_src, max_index=0; iemarray_t *vec_src; t_float max=-1.0e37; ok_src = iem_tab_check_arrays(gensym("tab_max_index"), x->x_sym_scr1, &x->x_beg_mem_src1, &x->x_size_src1, 0); if(ok_src) { n = x->x_size_src1; vec_src = x->x_beg_mem_src1; if(n) { for(i=0; i max) { max = iemarray_getfloat(vec_src, i); max_index = i; } } outlet_float(x->x_max_out, max); outlet_float(x->x_max_index_out, (t_float)max_index); outlet_bang(x->x_bang_out); } } } static void tab_max_index_list(t_tab_max_index *x, t_symbol *s, int argc, t_atom *argv) { int beg_src; int i, n; int ok_src, max_index=0; iemarray_t *vec_src; t_float max=-1.0e37; if((argc >= 2) && IS_A_FLOAT(argv,0) && IS_A_FLOAT(argv,1)) { beg_src = (int)atom_getintarg(0, argc, argv); n = (int)atom_getintarg(1, argc, argv); if(beg_src < 0) beg_src = 0; if(n < 0) n = 0; ok_src = iem_tab_check_arrays(gensym("tab_max_index"), x->x_sym_scr1, &x->x_beg_mem_src1, &x->x_size_src1, beg_src+n); if(ok_src) { vec_src = x->x_beg_mem_src1 + beg_src; if(n) { for(i=0; i max) { max = iemarray_getfloat(vec_src, i); max_index = i + beg_src; } } outlet_float(x->x_max_out, max); outlet_float(x->x_max_index_out, (t_float)max_index); outlet_bang(x->x_bang_out); } } } else { post("tab_max_index-ERROR: list need 2 float arguments:"); post(" source_offset + number_of_samples_to_calc_max_index"); } } static void tab_max_index_free(t_tab_max_index *x) { } static void *tab_max_index_new(t_symbol *s, int argc, t_atom *argv) { t_tab_max_index *x = (t_tab_max_index *)pd_new(tab_max_index_class); t_symbol *src; if((argc >= 1) && IS_A_SYMBOL(argv,0)) { src = (t_symbol *)atom_getsymbolarg(0, argc, argv); } else { post("tab_max_index-ERROR: need 1 symbol argument:"); post(" source_array_name"); return(0); } x->x_sym_scr1 = src; x->x_bang_out = outlet_new(&x->x_obj, &s_bang); x->x_max_index_out = outlet_new(&x->x_obj, &s_float); x->x_max_out = outlet_new(&x->x_obj, &s_float); return(x); } void tab_max_index_setup(void) { tab_max_index_class = class_new(gensym("tab_max_index"), (t_newmethod)tab_max_index_new, (t_method)tab_max_index_free, sizeof(t_tab_max_index), 0, A_GIMME, 0); class_addbang(tab_max_index_class, (t_method)tab_max_index_bang); class_addlist(tab_max_index_class, (t_method)tab_max_index_list); class_addmethod(tab_max_index_class, (t_method)tab_max_index_src, gensym("src"), A_DEFSYMBOL, 0); class_addmethod(tab_max_index_class, (t_method)tab_max_index_src, gensym("src1"), A_DEFSYMBOL, 0); // class_sethelpsymbol(tab_max_index_class, gensym("iemhelp2/tab_max_index-help")); } iem_utils-v0.0.20180206/iem_tab/src/tab_complex_inv.c0000644000175000017500000002025312630366350022376 0ustar zmoelnigzmoelnig/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_tab written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2009 */ #include "m_pd.h" #include "iemlib.h" #include "iem_tab.h" /* -------------------------- tab_complex_inv ------------------------------ */ /* x_beg_mem_dst_re[i] = x_beg_mem_src1_re[i] / (x_beg_mem_src1_re[i]*x_beg_mem_src1_re[i] + x_beg_mem_src1_im[i]*x_beg_mem_src1_im[i]) */ /* x_beg_mem_dst_im[i] = -x_beg_mem_src1_im[i] / (x_beg_mem_src1_re[i]*x_beg_mem_src1_re[i] + x_beg_mem_src1_im[i]*x_beg_mem_src1_im[i]) */ typedef struct _tab_complex_inv { t_object x_obj; int x_size_src1_re; int x_size_dst_re; int x_size_src1_im; int x_size_dst_im; int x_offset_src1_re; int x_offset_dst_re; int x_offset_src1_im; int x_offset_dst_im; iemarray_t *x_beg_mem_src1_re; iemarray_t *x_beg_mem_dst_re; iemarray_t *x_beg_mem_src1_im; iemarray_t *x_beg_mem_dst_im; t_symbol *x_sym_scr1_re; t_symbol *x_sym_dst_re; t_symbol *x_sym_scr1_im; t_symbol *x_sym_dst_im; } t_tab_complex_inv; static t_class *tab_complex_inv_class; static void tab_complex_inv_src1_re(t_tab_complex_inv *x, t_symbol *s) { x->x_sym_scr1_re = s; } static void tab_complex_inv_src1_im(t_tab_complex_inv *x, t_symbol *s) { x->x_sym_scr1_im = s; } static void tab_complex_inv_dst_re(t_tab_complex_inv *x, t_symbol *s) { x->x_sym_dst_re = s; } static void tab_complex_inv_dst_im(t_tab_complex_inv *x, t_symbol *s) { x->x_sym_dst_im = s; } static void tab_complex_inv_bang(t_tab_complex_inv *x) { int i, n; int ok_src1_re, ok_dst_re; int ok_src1_im, ok_dst_im; iemarray_t *vec_src1_re, *vec_dst_re; iemarray_t *vec_src1_im, *vec_dst_im; ok_src1_re = iem_tab_check_arrays(gensym("tab_complex_inv"), x->x_sym_scr1_re, &x->x_beg_mem_src1_re, &x->x_size_src1_re, 0); ok_dst_re = iem_tab_check_arrays(gensym("tab_complex_inv"), x->x_sym_dst_re, &x->x_beg_mem_dst_re, &x->x_size_dst_re, 0); ok_src1_im = iem_tab_check_arrays(gensym("tab_complex_inv"), x->x_sym_scr1_im, &x->x_beg_mem_src1_im, &x->x_size_src1_im, 0); ok_dst_im = iem_tab_check_arrays(gensym("tab_complex_inv"), x->x_sym_dst_im, &x->x_beg_mem_dst_im, &x->x_size_dst_im, 0); if(ok_src1_re && ok_dst_re && ok_src1_im && ok_dst_im) { if(x->x_size_src1_re < x->x_size_dst_re) n = x->x_size_src1_re; else n = x->x_size_dst_re; if(x->x_size_src1_im < n) n = x->x_size_src1_im; if(x->x_size_dst_im < n) n = x->x_size_dst_im; vec_src1_re = x->x_beg_mem_src1_re; vec_dst_re = x->x_beg_mem_dst_re; vec_src1_im = x->x_beg_mem_src1_im; vec_dst_im = x->x_beg_mem_dst_im; if(n) { t_garray *a; for(i=0; ix_obj.ob_outlet); a = (t_garray *)pd_findbyclass(x->x_sym_dst_re, garray_class); garray_redraw(a); a = (t_garray *)pd_findbyclass(x->x_sym_dst_im, garray_class); garray_redraw(a); } } } static void tab_complex_inv_list(t_tab_complex_inv *x, t_symbol *s, int argc, t_atom *argv) { int i, n; int beg_src1_re, beg_dst_re; int beg_src1_im, beg_dst_im; int ok_src1_re, ok_dst_re; int ok_src1_im, ok_dst_im; iemarray_t *vec_src1_re, *vec_dst_re; iemarray_t *vec_src1_im, *vec_dst_im; if((argc >= 5) && IS_A_FLOAT(argv,0) && IS_A_FLOAT(argv,1) && IS_A_FLOAT(argv,2) && IS_A_FLOAT(argv,3) && IS_A_FLOAT(argv,4)) { beg_src1_re = (int)atom_getintarg(0, argc, argv); beg_src1_im = (int)atom_getintarg(1, argc, argv); beg_dst_re = (int)atom_getintarg(2, argc, argv); beg_dst_im = (int)atom_getintarg(3, argc, argv); n = (int)atom_getintarg(4, argc, argv); if(beg_src1_re < 0) beg_src1_re = 0; if(beg_dst_re < 0) beg_dst_re = 0; if(beg_src1_im < 0) beg_src1_im = 0; if(beg_dst_im < 0) beg_dst_im = 0; if(n < 0) n = 0; ok_src1_re = iem_tab_check_arrays(gensym("tab_complex_inv"), x->x_sym_scr1_re, &x->x_beg_mem_src1_re, &x->x_size_src1_re, beg_src1_re+n); ok_dst_re = iem_tab_check_arrays(gensym("tab_complex_inv"), x->x_sym_dst_re, &x->x_beg_mem_dst_re, &x->x_size_dst_re, beg_dst_re+n); ok_src1_im = iem_tab_check_arrays(gensym("tab_complex_inv"), x->x_sym_scr1_im, &x->x_beg_mem_src1_im, &x->x_size_src1_im, beg_src1_im+n); ok_dst_im = iem_tab_check_arrays(gensym("tab_complex_inv"), x->x_sym_dst_im, &x->x_beg_mem_dst_im, &x->x_size_dst_im, beg_dst_im+n); if(ok_src1_re && ok_dst_re && ok_src1_im && ok_dst_im) { vec_src1_re = x->x_beg_mem_src1_re + beg_src1_re; vec_dst_re = x->x_beg_mem_dst_re + beg_dst_re; vec_src1_im = x->x_beg_mem_src1_im + beg_src1_im; vec_dst_im = x->x_beg_mem_dst_im + beg_dst_im; if(n) { t_garray *a; for(i=0; ix_obj.ob_outlet); a = (t_garray *)pd_findbyclass(x->x_sym_dst_re, garray_class); garray_redraw(a); a = (t_garray *)pd_findbyclass(x->x_sym_dst_im, garray_class); garray_redraw(a); } } } else { post("tab_complex_inv-ERROR: list need 5 float arguments:"); post(" source1_real_offset + source1_imag_offset + destination_real_offset + destination_imag_offset + number_of_samples_to_complex_mul"); } } static void tab_complex_inv_free(t_tab_complex_inv *x) { } static void *tab_complex_inv_new(t_symbol *s, int argc, t_atom *argv) { t_tab_complex_inv *x = (t_tab_complex_inv *)pd_new(tab_complex_inv_class); t_symbol *src1_re, *src2_re, *dst_re, *src1_im, *src2_im, *dst_im; if((argc >= 4) && IS_A_SYMBOL(argv,0) && IS_A_SYMBOL(argv,1) && IS_A_SYMBOL(argv,2) && IS_A_SYMBOL(argv,3)) { src1_re = (t_symbol *)atom_getsymbolarg(0, argc, argv); src1_im = (t_symbol *)atom_getsymbolarg(1, argc, argv); dst_re = (t_symbol *)atom_getsymbolarg(2, argc, argv); dst_im = (t_symbol *)atom_getsymbolarg(3, argc, argv); } else if((argc >= 2) && IS_A_SYMBOL(argv,0) && IS_A_SYMBOL(argv,1)) { src1_re = (t_symbol *)atom_getsymbolarg(0, argc, argv); src1_im = (t_symbol *)atom_getsymbolarg(1, argc, argv); dst_re = src1_re; dst_im = src1_im; } else { post("tab_complex_inv-ERROR: need 4 symbols arguments:"); post(" source1_real_array_name + source1_imag_array_name + destination_real_array_name + destination_imag_array_name"); return(0); } x->x_sym_scr1_re = src1_re; x->x_sym_scr1_im = src1_im; x->x_sym_dst_re = dst_re; x->x_sym_dst_im = dst_im; outlet_new(&x->x_obj, &s_bang); return(x); } void tab_complex_inv_setup(void) { tab_complex_inv_class = class_new(gensym("tab_complex_inv"), (t_newmethod)tab_complex_inv_new, (t_method)tab_complex_inv_free, sizeof(t_tab_complex_inv), 0, A_GIMME, 0); class_addbang(tab_complex_inv_class, (t_method)tab_complex_inv_bang); class_addlist(tab_complex_inv_class, (t_method)tab_complex_inv_list); class_addmethod(tab_complex_inv_class, (t_method)tab_complex_inv_src1_re, gensym("src1_re"), A_DEFSYMBOL, 0); class_addmethod(tab_complex_inv_class, (t_method)tab_complex_inv_src1_re, gensym("src_re"), A_DEFSYMBOL, 0); class_addmethod(tab_complex_inv_class, (t_method)tab_complex_inv_dst_re, gensym("dst_re"), A_DEFSYMBOL, 0); class_addmethod(tab_complex_inv_class, (t_method)tab_complex_inv_src1_im, gensym("src1_im"), A_DEFSYMBOL, 0); class_addmethod(tab_complex_inv_class, (t_method)tab_complex_inv_src1_im, gensym("src_im"), A_DEFSYMBOL, 0); class_addmethod(tab_complex_inv_class, (t_method)tab_complex_inv_dst_im, gensym("dst_im"), A_DEFSYMBOL, 0); } iem_utils-v0.0.20180206/iem_tab/src/tab_rfft.c0000644000175000017500000002663412630366350021025 0ustar zmoelnigzmoelnig/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_tab written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2009 */ #include "m_pd.h" #include "iemlib.h" #include "iem_tab.h" #include /* -------------------------- tab_rfft ------------------------------ */ /* real time domain FFT to complex spectral domain */ typedef struct _tab_rfft { t_object x_obj; int x_size_src1; int x_size_dst_re; int x_size_dst_im; int x_offset_src1; int x_offset_dst_re; int x_offset_dst_im; int x_fftsize; iemarray_t *x_beg_mem_src1; iemarray_t *x_beg_mem_dst_re; iemarray_t *x_beg_mem_dst_im; TAB_COMPLEX *x_sin_cos; t_symbol *x_sym_src1; t_symbol *x_sym_dst_re; t_symbol *x_sym_dst_im; } t_tab_rfft; static t_class *tab_rfft_class; static void tab_rfft_init(t_tab_rfft *x) { int i, fftsize = x->x_fftsize; t_float f, g; TAB_COMPLEX *sincos = x->x_sin_cos; g = 2.0 * 3.141592653589793 / (t_float)fftsize; for(i=0; ix_fftsize) { x->x_sin_cos = (TAB_COMPLEX *)resizebytes(x->x_sin_cos, x->x_fftsize*sizeof(TAB_COMPLEX), i*sizeof(TAB_COMPLEX)); x->x_fftsize = i; } tab_rfft_init(x); } static void tab_rfft_src(t_tab_rfft *x, t_symbol *s) { x->x_sym_src1 = s; } static void tab_rfft_dst_re(t_tab_rfft *x, t_symbol *s) { x->x_sym_dst_re = s; } static void tab_rfft_dst_im(t_tab_rfft *x, t_symbol *s) { x->x_sym_dst_im = s; } static void tab_rfft_bang(t_tab_rfft *x) { int i, j, k; int ok_src, ok_dst_re, ok_dst_im; int w_index, w_inc, i_inc, v_index; int fftsize = x->x_fftsize; int fs1 = fftsize - 1; int fs2 = fftsize / 2; TAB_COMPLEX w; TAB_COMPLEX *sincos = x->x_sin_cos; iemarray_t *vec_src, *vec_dst_re, *vec_dst_im; t_float old1_re, old1_im, old2_re, old2_im; ok_src = iem_tab_check_arrays(gensym("tab_rfft"), x->x_sym_src1, &x->x_beg_mem_src1, &x->x_size_src1, fftsize); ok_dst_re = iem_tab_check_arrays(gensym("tab_rfft"), x->x_sym_dst_re, &x->x_beg_mem_dst_re, &x->x_size_dst_re, fftsize); ok_dst_im = iem_tab_check_arrays(gensym("tab_rfft"), x->x_sym_dst_im, &x->x_beg_mem_dst_im, &x->x_size_dst_im, fftsize); if(ok_src && ok_dst_re && ok_dst_im) { t_garray *a; vec_src=x->x_beg_mem_src1; vec_dst_re=x->x_beg_mem_dst_re; vec_dst_im=x->x_beg_mem_dst_im; for(k=0; k>= 1; } j = 0; for(i=1;i>= 1; } j = j + k; if(i < j) { old1_re = iemarray_getfloat(vec_dst_re, j); old1_im = iemarray_getfloat(vec_dst_im, j); iemarray_setfloat(vec_dst_re, j, iemarray_getfloat(vec_dst_re, i)); iemarray_setfloat(vec_dst_im, j, iemarray_getfloat(vec_dst_im, i)); iemarray_setfloat(vec_dst_re, i, old1_re); iemarray_setfloat(vec_dst_im, i, old1_im); } } // g = 2.0f / (t_float)fftsize; /* ein fehler tritt auf beim 0.sample, hier sollte nur mal 1.0 multipliziert werden wenn gelten soll : Energie im zeitfenster == Energie im Frequenz-dichte-fenster g = 1.0f; for(i = 0; i < fs2; i++) { vec_dst_re[i] *= g; vec_dst_im[i] *= g; } */ iemarray_setfloat(vec_dst_im, 0, 0.0); iemarray_setfloat(vec_dst_im, fs2, 0.0); for(i = fs2+1; i < fftsize; i++) { iemarray_setfloat(vec_dst_re, i, 0.0); iemarray_setfloat(vec_dst_im, i, 0.0); } outlet_bang(x->x_obj.ob_outlet); a = (t_garray *)pd_findbyclass(x->x_sym_dst_re, garray_class); garray_redraw(a); a = (t_garray *)pd_findbyclass(x->x_sym_dst_im, garray_class); garray_redraw(a); } } static void tab_rfft_list(t_tab_rfft *x, t_symbol *s, int argc, t_atom *argv) { int beg_src, beg_dst_re, beg_dst_im; int i, j, k; int ok_src, ok_dst_re, ok_dst_im; int w_index, w_inc, i_inc, v_index; int fftsize = x->x_fftsize; int fs1 = fftsize - 1; int fs2 = fftsize / 2; TAB_COMPLEX w; TAB_COMPLEX *sincos = x->x_sin_cos; iemarray_t *vec_src, *vec_dst_re, *vec_dst_im; t_float old1_re, old1_im, old2_re, old2_im; if((argc >= 3) && IS_A_FLOAT(argv,0) && IS_A_FLOAT(argv,1) && IS_A_FLOAT(argv,2)) { beg_src = (int)atom_getintarg(0, argc, argv); beg_dst_re = (int)atom_getintarg(1, argc, argv); beg_dst_im = (int)atom_getintarg(2, argc, argv); if(beg_src < 0) beg_src = 0; if(beg_dst_re < 0) beg_dst_re = 0; if(beg_dst_im < 0) beg_dst_im = 0; ok_src = iem_tab_check_arrays(gensym("tab_rfft"), x->x_sym_src1, &x->x_beg_mem_src1, &x->x_size_src1, beg_src+fftsize); ok_dst_re = iem_tab_check_arrays(gensym("tab_rfft"), x->x_sym_dst_re, &x->x_beg_mem_dst_re, &x->x_size_dst_re, beg_dst_re+fftsize); ok_dst_im = iem_tab_check_arrays(gensym("tab_rfft"), x->x_sym_dst_im, &x->x_beg_mem_dst_im, &x->x_size_dst_im, beg_dst_im+fftsize); if(ok_src && ok_dst_re && ok_dst_im) { t_garray *a; vec_src=x->x_beg_mem_src1 + beg_src; vec_dst_re=x->x_beg_mem_dst_re + beg_dst_re; vec_dst_im=x->x_beg_mem_dst_im + beg_dst_im; for(k=0; k>= 1; } j = 0; for(i=1;i>= 1; } j = j + k; if(i < j) { old1_re = iemarray_getfloat(vec_dst_re, j); old1_im = iemarray_getfloat(vec_dst_im, j); iemarray_setfloat(vec_dst_re, j, iemarray_getfloat(vec_dst_re, i)); iemarray_setfloat(vec_dst_im, j, iemarray_getfloat(vec_dst_im, i)); iemarray_setfloat(vec_dst_re, i, old1_re); iemarray_setfloat(vec_dst_im, i, old1_im); } } // g = 2.0f / (t_float)fftsize; /* ein fehler tritt auf beim 0.sample, hier sollte nur mal 1.0 multipliziert werden wenn gelten soll : Energie im zeitfenster == Energie im Frequenz-dichte-fenster g = 1.0f; for(i = 0; i < fs2; i++) { vec_dst_re[i] *= g; vec_dst_im[i] *= g; } */ iemarray_setfloat(vec_dst_im, 0, 0.0); iemarray_setfloat(vec_dst_im, fs2, 0.0); for(i = fs2+1; i < fftsize; i++) { iemarray_setfloat(vec_dst_re, i, 0.0); iemarray_setfloat(vec_dst_im, i, 0.0); } outlet_bang(x->x_obj.ob_outlet); a = (t_garray *)pd_findbyclass(x->x_sym_dst_re, garray_class); garray_redraw(a); a = (t_garray *)pd_findbyclass(x->x_sym_dst_im, garray_class); garray_redraw(a); } } else { post("tab_rfft-ERROR: list need 3 float arguments:"); post(" source_offset + destination_real_offset + destination_imag_offset"); } } static void tab_rfft_free(t_tab_rfft *x) { freebytes(x->x_sin_cos, x->x_fftsize * sizeof(TAB_COMPLEX)); } static void *tab_rfft_new(t_symbol *s, int argc, t_atom *argv) { t_tab_rfft *x = (t_tab_rfft *)pd_new(tab_rfft_class); t_symbol *src, *dst_re, *dst_im; int fftsize, i=1; if((argc >= 4) && IS_A_SYMBOL(argv,0) && IS_A_SYMBOL(argv,1) && IS_A_SYMBOL(argv,2) && IS_A_FLOAT(argv,3)) { src = (t_symbol *)atom_getsymbolarg(0, argc, argv); dst_re = (t_symbol *)atom_getsymbolarg(1, argc, argv); dst_im = (t_symbol *)atom_getsymbolarg(2, argc, argv); fftsize = (int)atom_getintarg(3, argc, argv); } else { post("tab_rfft-ERROR: need 3 symbols + 1 float arguments:"); post(" source_array_name + destination_real_array_name + destination_imag_array_name + FFT-size"); return(0); } if(fftsize < 8) fftsize = 8; while(i <= fftsize) i *= 2; i /= 2; fftsize = i; x->x_fftsize = fftsize; x->x_sym_src1 = src; x->x_sym_dst_re = dst_re; x->x_sym_dst_im = dst_im; x->x_sin_cos = (TAB_COMPLEX *)getbytes(x->x_fftsize * sizeof(TAB_COMPLEX)); tab_rfft_init(x); outlet_new(&x->x_obj, &s_bang); return(x); } void tab_rfft_setup(void) { tab_rfft_class = class_new(gensym("tab_rfft"), (t_newmethod)tab_rfft_new, (t_method)tab_rfft_free, sizeof(t_tab_rfft), 0, A_GIMME, 0); class_addbang(tab_rfft_class, (t_method)tab_rfft_bang); class_addlist(tab_rfft_class, (t_method)tab_rfft_list); class_addmethod(tab_rfft_class, (t_method)tab_rfft_fftsize, gensym("fftsize"), A_DEFFLOAT, 0); class_addmethod(tab_rfft_class, (t_method)tab_rfft_src, gensym("src"), A_DEFSYMBOL, 0); class_addmethod(tab_rfft_class, (t_method)tab_rfft_src, gensym("src1"), A_DEFSYMBOL, 0); class_addmethod(tab_rfft_class, (t_method)tab_rfft_dst_re, gensym("dst_re"), A_DEFSYMBOL, 0); class_addmethod(tab_rfft_class, (t_method)tab_rfft_dst_im, gensym("dst_im"), A_DEFSYMBOL, 0); class_addmethod(tab_rfft_class, (t_method)tab_rfft_dst_re, gensym("dst1"), A_DEFSYMBOL, 0); class_addmethod(tab_rfft_class, (t_method)tab_rfft_dst_im, gensym("dst2"), A_DEFSYMBOL, 0); } iem_utils-v0.0.20180206/iem_tab/src/tab_reverse.c0000644000175000017500000001126512630366350021531 0ustar zmoelnigzmoelnig/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_tab written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2009 */ #include "m_pd.h" #include "iemlib.h" #include "iem_tab.h" /* -------------------------- tab_reverse ------------------------------ */ typedef struct _tab_reverse { t_object x_obj; int x_size_src1; int x_size_dst; int x_offset_src1; int x_offset_dst; iemarray_t *x_beg_mem_src1; iemarray_t *x_beg_mem_dst; t_symbol *x_sym_scr1; t_symbol *x_sym_dst; } t_tab_reverse; static t_class *tab_reverse_class; static void tab_reverse_src(t_tab_reverse *x, t_symbol *s) { x->x_sym_scr1 = s; } static void tab_reverse_dst(t_tab_reverse *x, t_symbol *s) { x->x_sym_dst = s; } static void tab_reverse_bang(t_tab_reverse *x) { int i, j, n, n2; int ok_src, ok_dst; iemarray_t *vec_src, *vec_dst; t_float f; ok_src = iem_tab_check_arrays(gensym("tab_reverse"), x->x_sym_scr1, &x->x_beg_mem_src1, &x->x_size_src1, 0); ok_dst = iem_tab_check_arrays(gensym("tab_reverse"), x->x_sym_dst, &x->x_beg_mem_dst, &x->x_size_dst, 0); if(ok_src && ok_dst) { if(x->x_size_src1 < x->x_size_dst) n = x->x_size_src1; else n = x->x_size_dst; vec_src = x->x_beg_mem_src1; vec_dst = x->x_beg_mem_dst; n2 = n/2; if(n) { t_garray *a; for(i=0, j=n-1; ix_obj.ob_outlet); a = (t_garray *)pd_findbyclass(x->x_sym_dst, garray_class); garray_redraw(a); } } } static void tab_reverse_list(t_tab_reverse *x, t_symbol *s, int argc, t_atom *argv) { int beg_src, beg_dst; int i, j, n, n2; int ok_src, ok_dst; iemarray_t *vec_src, *vec_dst; t_float f; if((argc >= 3) && IS_A_FLOAT(argv,0) && IS_A_FLOAT(argv,1) && IS_A_FLOAT(argv,2)) { beg_src = (int)atom_getintarg(0, argc, argv); beg_dst = (int)atom_getintarg(1, argc, argv); n = (int)atom_getintarg(2, argc, argv); if(beg_src < 0) beg_src = 0; if(beg_dst < 0) beg_dst = 0; if(n < 0) n = 0; ok_src = iem_tab_check_arrays(gensym("tab_reverse"), x->x_sym_scr1, &x->x_beg_mem_src1, &x->x_size_src1, beg_src+n); ok_dst = iem_tab_check_arrays(gensym("tab_reverse"), x->x_sym_dst, &x->x_beg_mem_dst, &x->x_size_dst, beg_dst+n); if(ok_src && ok_dst) { vec_src = x->x_beg_mem_src1 + beg_src; vec_dst = x->x_beg_mem_dst + beg_dst; n2 = n/2; if(n) { t_garray *a; for(i=0, j=n-1; ix_obj.ob_outlet); a = (t_garray *)pd_findbyclass(x->x_sym_dst, garray_class); garray_redraw(a); } } } else { post("tab_reverse-ERROR: list need 3 float arguments:"); post(" source_offset + destination_offset + number_of_samples_to_copy"); } } static void tab_reverse_free(t_tab_reverse *x) { } static void *tab_reverse_new(t_symbol *s, int argc, t_atom *argv) { t_tab_reverse *x = (t_tab_reverse *)pd_new(tab_reverse_class); t_symbol *src, *dst; if((argc >= 2) && IS_A_SYMBOL(argv,0) && IS_A_SYMBOL(argv,1)) { src = (t_symbol *)atom_getsymbolarg(0, argc, argv); dst = (t_symbol *)atom_getsymbolarg(1, argc, argv); } else if((argc >= 1) && IS_A_SYMBOL(argv,0)) { src = (t_symbol *)atom_getsymbolarg(0, argc, argv); dst = src; } else { post("tab_reverse-ERROR: need 2 symbols arguments:"); post(" source_array_name + destination_array_name"); return(0); } x->x_sym_scr1 = src; x->x_sym_dst = dst; outlet_new(&x->x_obj, &s_bang); return(x); } void tab_reverse_setup(void) { tab_reverse_class = class_new(gensym("tab_reverse"), (t_newmethod)tab_reverse_new, (t_method)tab_reverse_free, sizeof(t_tab_reverse), 0, A_GIMME, 0); class_addbang(tab_reverse_class, (t_method)tab_reverse_bang); class_addlist(tab_reverse_class, (t_method)tab_reverse_list); class_addmethod(tab_reverse_class, (t_method)tab_reverse_src, gensym("src"), A_DEFSYMBOL, 0); class_addmethod(tab_reverse_class, (t_method)tab_reverse_src, gensym("src1"), A_DEFSYMBOL, 0); class_addmethod(tab_reverse_class, (t_method)tab_reverse_dst, gensym("dst"), A_DEFSYMBOL, 0); // class_sethelpsymbol(tab_reverse_class, gensym("iemhelp2/tab_reverse-help")); } iem_utils-v0.0.20180206/iem_tab/src/VC7/0000755000175000017500000000000012630366350017456 5ustar zmoelnigzmoelnigiem_utils-v0.0.20180206/iem_tab/src/VC7/iem_tab.vcproj0000644000175000017500000000242112630366350022302 0ustar zmoelnigzmoelnig iem_utils-v0.0.20180206/iem_tab/src/VC7/makefile_vc7proj0000644000175000017500000000311412630366350022627 0ustar zmoelnigzmoelnigTARGET = iem_tab all: ..\$(TARGET).dll VIS_CPP_PATH = "C:\Programme\Microsoft Visual Studio .NET 2003\Vc7" VIS_SDK_PATH = "C:\Programme\Microsoft Visual Studio .NET 2003\Vc7\PlatformSDK" PD_INST_PATH = "C:\Programme\pd-0.42-5" PD_WIN_INCLUDE_PATH = /I. /I$(PD_INST_PATH)\src /I$(VIS_CPP_PATH)\include PD_WIN_C_FLAGS = /nologo /W3 /WX /DMSW /DNT /DPD /DWIN32 /DWINDOWS /Ox -D_CRT_SECURE_NO_WARNINGS PD_WIN_L_FLAGS = /nologo PD_WIN_LIB = /NODEFAULTLIB:libcmt /NODEFAULTLIB:oldnames /NODEFAULTLIB:kernel32 \ $(VIS_CPP_PATH)\lib\libcmt.lib \ $(VIS_CPP_PATH)\lib\oldnames.lib \ $(VIS_SDK_PATH)\lib\kernel32.lib \ $(PD_INST_PATH)\bin\pd.lib SRC = tab_abs.c \ tab_add.c \ tab_add_scalar.c \ tab_carth2polar.c \ tab_complex_inv.c \ tab_complex_mul.c \ tab_const.c \ tab_conv.c \ tab_copy.c \ tab_counter.c \ tab_cross_corr.c \ tab_div.c \ tab_eq.c \ tab_eq_scalar.c \ tab_fft.c \ tab_find_exact_peaks.c \ tab_find_peaks.c \ tab_ge.c \ tab_ge_scalar.c \ tab_gt.c \ tab_gt_scalar.c \ tab_get_size.c \ tab_ifft.c \ tab_le.c \ tab_le_scalar.c \ tab_lt.c \ tab_lt_scalar.c \ tab_max_index.c \ tab_min_index.c \ tab_min_max.c \ tab_mul.c \ tab_mul_scalar.c \ tab_ne.c \ tab_ne_scalar.c \ tab_reverse.c \ tab_rfft.c \ tab_rifft.c \ tab_sqrt.c \ tab_sub.c \ tab_sum.c \ iem_tab.c OBJ = $(SRC:.c=.obj) .c.obj: cl $(PD_WIN_C_FLAGS) $(PD_WIN_INCLUDE_PATH) /c $*.c ..\$(TARGET).dll: $(OBJ) link $(PD_WIN_L_FLAGS) /dll /export:$(TARGET)_setup \ /out:..\$(TARGET).dll $(OBJ) $(PD_WIN_LIB) clean: del *.obj iem_utils-v0.0.20180206/iem_tab/src/tab_le.c0000644000175000017500000001314012630366350020450 0ustar zmoelnigzmoelnig/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_tab written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2009 */ #include "m_pd.h" #include "iemlib.h" #include "iem_tab.h" /* -------------------------- tab_le ------------------------------ */ /* if(x_beg_mem_src1[i] <= x_beg_mem_src2[i]) */ /* x_beg_mem_dst[i] = 1.0f; */ /* else */ /* x_beg_mem_dst[i] = 0.0f; */ typedef struct _tab_le { t_object x_obj; int x_size_src1; int x_size_src2; int x_size_dst; int x_offset_src1; int x_offset_src2; int x_offset_dst; iemarray_t *x_beg_mem_src1; iemarray_t *x_beg_mem_src2; iemarray_t *x_beg_mem_dst; t_symbol *x_sym_scr1; t_symbol *x_sym_scr2; t_symbol *x_sym_dst; } t_tab_le; static t_class *tab_le_class; static void tab_le_src1(t_tab_le *x, t_symbol *s) { x->x_sym_scr1 = s; } static void tab_le_src2(t_tab_le *x, t_symbol *s) { x->x_sym_scr2 = s; } static void tab_le_dst(t_tab_le *x, t_symbol *s) { x->x_sym_dst = s; } static void tab_le_bang(t_tab_le *x) { int i, n; int ok_src1, ok_src2, ok_dst; iemarray_t *vec_src1, *vec_src2, *vec_dst; ok_src1 = iem_tab_check_arrays(gensym("tab_le"), x->x_sym_scr1, &x->x_beg_mem_src1, &x->x_size_src1, 0); ok_src2 = iem_tab_check_arrays(gensym("tab_le"), x->x_sym_scr2, &x->x_beg_mem_src2, &x->x_size_src2, 0); ok_dst = iem_tab_check_arrays(gensym("tab_le"), x->x_sym_dst, &x->x_beg_mem_dst, &x->x_size_dst, 0); if(ok_src1 && ok_src2 && ok_dst) { if(x->x_size_src1 < x->x_size_dst) n = x->x_size_src1; else n = x->x_size_dst; if(x->x_size_src2 < n) n = x->x_size_src2; vec_src1 = x->x_beg_mem_src1; vec_src2 = x->x_beg_mem_src2; vec_dst = x->x_beg_mem_dst; if(n) { t_garray *a; for(i=0; ix_obj.ob_outlet); a = (t_garray *)pd_findbyclass(x->x_sym_dst, garray_class); garray_redraw(a); } } } static void tab_le_list(t_tab_le *x, t_symbol *s, int argc, t_atom *argv) { int beg_src1, beg_src2, beg_dst; int i, n; int ok_src1, ok_src2, ok_dst; iemarray_t *vec_src1, *vec_src2, *vec_dst; if((argc >= 4) && IS_A_FLOAT(argv,0) && IS_A_FLOAT(argv,1) && IS_A_FLOAT(argv,2) && IS_A_FLOAT(argv,3)) { beg_src1 = (int)atom_getintarg(0, argc, argv); beg_src2 = (int)atom_getintarg(1, argc, argv); beg_dst = (int)atom_getintarg(2, argc, argv); n = (int)atom_getintarg(3, argc, argv); if(beg_src1 < 0) beg_src1 = 0; if(beg_src2 < 0) beg_src2 = 0; if(beg_dst < 0) beg_dst = 0; if(n < 0) n = 0; ok_src1 = iem_tab_check_arrays(gensym("tab_le"), x->x_sym_scr1, &x->x_beg_mem_src1, &x->x_size_src1, beg_src1+n); ok_src2 = iem_tab_check_arrays(gensym("tab_le"), x->x_sym_scr2, &x->x_beg_mem_src2, &x->x_size_src2, beg_src2+n); ok_dst = iem_tab_check_arrays(gensym("tab_le"), x->x_sym_dst, &x->x_beg_mem_dst, &x->x_size_dst, beg_dst+n); if(ok_src1 && ok_src2 && ok_dst) { vec_src1 = x->x_beg_mem_src1 + beg_src1; vec_src2 = x->x_beg_mem_src2 + beg_src2; vec_dst = x->x_beg_mem_dst + beg_dst; if(n) { t_garray *a; for(i=0; ix_obj.ob_outlet); a = (t_garray *)pd_findbyclass(x->x_sym_dst, garray_class); garray_redraw(a); } } } else { post("tab_le-ERROR: list need 4 float arguments:"); post(" source1_offset + source2_offset + destination_offset + number_of_samples_to_compare"); } } static void tab_le_free(t_tab_le *x) { } static void *tab_le_new(t_symbol *s, int argc, t_atom *argv) { t_tab_le *x = (t_tab_le *)pd_new(tab_le_class); t_symbol *src1, *src2, *dst; if((argc >= 3) && IS_A_SYMBOL(argv,0) && IS_A_SYMBOL(argv,1) && IS_A_SYMBOL(argv,2)) { src1 = (t_symbol *)atom_getsymbolarg(0, argc, argv); src2 = (t_symbol *)atom_getsymbolarg(1, argc, argv); dst = (t_symbol *)atom_getsymbolarg(2, argc, argv); } else if((argc >= 2) && IS_A_SYMBOL(argv,0) && IS_A_SYMBOL(argv,1)) { src1 = (t_symbol *)atom_getsymbolarg(0, argc, argv); dst = src1; src2 = (t_symbol *)atom_getsymbolarg(1, argc, argv); } else { post("tab_le-ERROR: need 3 symbols arguments:"); post(" source1_array_name + source2_array_name + destination_array_name"); return(0); } x->x_sym_scr1 = src1; x->x_sym_scr2 = src2; x->x_sym_dst = dst; outlet_new(&x->x_obj, &s_bang); return(x); } void tab_le_setup(void) { tab_le_class = class_new(gensym("tab_le"), (t_newmethod)tab_le_new, (t_method)tab_le_free, sizeof(t_tab_le), 0, A_GIMME, 0); class_addbang(tab_le_class, (t_method)tab_le_bang); class_addlist(tab_le_class, (t_method)tab_le_list); class_addmethod(tab_le_class, (t_method)tab_le_src1, gensym("src1"), A_DEFSYMBOL, 0); class_addmethod(tab_le_class, (t_method)tab_le_src2, gensym("src2"), A_DEFSYMBOL, 0); class_addmethod(tab_le_class, (t_method)tab_le_dst, gensym("dst"), A_DEFSYMBOL, 0); // class_sethelpsymbol(tab_le_class, gensym("iemhelp2/tab_le-help")); } iem_utils-v0.0.20180206/iem_tab/src/tab_dbtorms.c0000644000175000017500000001161412630366350021526 0ustar zmoelnigzmoelnig/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_tab written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2010 */ #include "m_pd.h" #include "iemlib.h" #include "iem_tab.h" #include #define IEMTABLOGTEN 2.302585092994046 /* -------------------------- tab_dbtorms ------------------------------ */ /* x_beg_mem_dst[i] = sqrt(x_beg_mem_src1[i]) */ typedef struct _tab_dbtorms { t_object x_obj; int x_size_src1; int x_size_dst; int x_offset_src1; int x_offset_dst; iemarray_t *x_beg_mem_src1; iemarray_t *x_beg_mem_dst; t_symbol *x_sym_scr1; t_symbol *x_sym_dst; } t_tab_dbtorms; static t_class *tab_dbtorms_class; static void tab_dbtorms_src(t_tab_dbtorms *x, t_symbol *s) { x->x_sym_scr1 = s; } static void tab_dbtorms_dst(t_tab_dbtorms *x, t_symbol *s) { x->x_sym_dst = s; } static void tab_dbtorms_bang(t_tab_dbtorms *x) { int i, n; int ok_src, ok_dst; iemarray_t *vec_src, *vec_dst; ok_src = iem_tab_check_arrays(gensym("tab_dbtorms"), x->x_sym_scr1, &x->x_beg_mem_src1, &x->x_size_src1, 0); ok_dst = iem_tab_check_arrays(gensym("tab_dbtorms"), x->x_sym_dst, &x->x_beg_mem_dst, &x->x_size_dst, 0); if(ok_src && ok_dst) { if(x->x_size_src1 < x->x_size_dst) n = x->x_size_src1; else n = x->x_size_dst; vec_src = x->x_beg_mem_src1; vec_dst = x->x_beg_mem_dst; if(n) { t_garray *a; for(i=0; i 485.0) f = 485.0; iemarray_setfloat(vec_dst, i, exp((IEMTABLOGTEN * 0.05) * (f-100.0))); } } outlet_bang(x->x_obj.ob_outlet); a = (t_garray *)pd_findbyclass(x->x_sym_dst, garray_class); garray_redraw(a); } } } static void tab_dbtorms_list(t_tab_dbtorms *x, t_symbol *s, int argc, t_atom *argv) { int beg_src, beg_dst; int i, n; int ok_src, ok_dst; iemarray_t *vec_src, *vec_dst; if((argc >= 3) && IS_A_FLOAT(argv,0) && IS_A_FLOAT(argv,1) && IS_A_FLOAT(argv,2)) { beg_src = (int)atom_getintarg(0, argc, argv); beg_dst = (int)atom_getintarg(1, argc, argv); n = (int)atom_getintarg(2, argc, argv); if(beg_src < 0) beg_src = 0; if(beg_dst < 0) beg_dst = 0; if(n < 0) n = 0; ok_src = iem_tab_check_arrays(gensym("tab_dbtorms"), x->x_sym_scr1, &x->x_beg_mem_src1, &x->x_size_src1, beg_src+n); ok_dst = iem_tab_check_arrays(gensym("tab_dbtorms"), x->x_sym_dst, &x->x_beg_mem_dst, &x->x_size_dst, beg_dst+n); if(ok_src && ok_dst) { vec_src = x->x_beg_mem_src1 + beg_src; vec_dst = x->x_beg_mem_dst + beg_dst; if(n) { t_garray *a; for(i=0; i 485.0) f = 485.0; iemarray_setfloat(vec_dst, i, exp((IEMTABLOGTEN * 0.05) * (f-100.0))); } } outlet_bang(x->x_obj.ob_outlet); a = (t_garray *)pd_findbyclass(x->x_sym_dst, garray_class); garray_redraw(a); } } } else { post("tab_dbtorms-ERROR: list need 3 float arguments:"); post(" source_offset + destination_offset + number_of_samples_to_dbtorms"); } } static void tab_dbtorms_free(t_tab_dbtorms *x) { } static void *tab_dbtorms_new(t_symbol *s, int argc, t_atom *argv) { t_tab_dbtorms *x = (t_tab_dbtorms *)pd_new(tab_dbtorms_class); t_symbol *src, *dst; if((argc >= 2) && IS_A_SYMBOL(argv,0) && IS_A_SYMBOL(argv,1)) { src = (t_symbol *)atom_getsymbolarg(0, argc, argv); dst = (t_symbol *)atom_getsymbolarg(1, argc, argv); } else if((argc >= 1) && IS_A_SYMBOL(argv,0)) { src = (t_symbol *)atom_getsymbolarg(0, argc, argv); dst = src; } else { post("tab_dbtorms-ERROR: need 2 symbols arguments:"); post(" source_array_name + destination_array_name"); return(0); } x->x_sym_scr1 = src; x->x_sym_dst = dst; outlet_new(&x->x_obj, &s_bang); return(x); } void tab_dbtorms_setup(void) { tab_dbtorms_class = class_new(gensym("tab_dbtorms"), (t_newmethod)tab_dbtorms_new, (t_method)tab_dbtorms_free, sizeof(t_tab_dbtorms), 0, A_GIMME, 0); class_addbang(tab_dbtorms_class, (t_method)tab_dbtorms_bang); class_addlist(tab_dbtorms_class, (t_method)tab_dbtorms_list); class_addmethod(tab_dbtorms_class, (t_method)tab_dbtorms_src, gensym("src"), A_DEFSYMBOL, 0); class_addmethod(tab_dbtorms_class, (t_method)tab_dbtorms_src, gensym("src1"), A_DEFSYMBOL, 0); class_addmethod(tab_dbtorms_class, (t_method)tab_dbtorms_dst, gensym("dst"), A_DEFSYMBOL, 0); } iem_utils-v0.0.20180206/iem_tab/src/tab_add_scalar.c0000644000175000017500000001133012630366350022124 0ustar zmoelnigzmoelnig/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_tab written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2009 */ #include "m_pd.h" #include "iemlib.h" #include "iem_tab.h" /* -------------------------- tab_add_scalar ------------------------------ */ /* x_beg_mem_dst[i] = x_beg_mem_src1[i] + add */ typedef struct _tab_add_scalar { t_object x_obj; int x_size_src1; int x_size_dst; int x_offset_src1; int x_offset_dst; iemarray_t *x_beg_mem_src1; iemarray_t *x_beg_mem_dst; t_symbol *x_sym_scr1; t_symbol *x_sym_dst; } t_tab_add_scalar; static t_class *tab_add_scalar_class; static void tab_add_scalar_src(t_tab_add_scalar *x, t_symbol *s) { x->x_sym_scr1 = s; } static void tab_add_scalar_float(t_tab_add_scalar *x, t_floatarg add) { int i, n; int ok_src1, ok_dst; iemarray_t *vec_src1, *vec_dst; ok_src1 = iem_tab_check_arrays(gensym("tab_add_scalar"), x->x_sym_scr1, &x->x_beg_mem_src1, &x->x_size_src1, 0); ok_dst = iem_tab_check_arrays(gensym("tab_add_scalar"), x->x_sym_dst, &x->x_beg_mem_dst, &x->x_size_dst, 0); if(ok_src1 && ok_dst) { if(x->x_size_src1 < x->x_size_dst) n = x->x_size_src1; else n = x->x_size_dst; vec_src1 = x->x_beg_mem_src1; vec_dst = x->x_beg_mem_dst; if(n) { t_garray *a; for(i=0; ix_obj.ob_outlet); a = (t_garray *)pd_findbyclass(x->x_sym_dst, garray_class); garray_redraw(a); } } } static void tab_add_scalar_dst(t_tab_add_scalar *x, t_symbol *s) { x->x_sym_dst = s; } static void tab_add_scalar_list(t_tab_add_scalar *x, t_symbol *s, int argc, t_atom *argv) { int beg_src1, beg_dst; int i, n; int ok_src1, ok_dst; iemarray_t *vec_src1, *vec_dst; t_float add; if((argc >= 4) && IS_A_FLOAT(argv,0) && IS_A_FLOAT(argv,1) && IS_A_FLOAT(argv,2) && IS_A_FLOAT(argv,3)) { beg_src1 = (int)atom_getintarg(0, argc, argv); beg_dst = (int)atom_getintarg(1, argc, argv); n = (int)atom_getintarg(2, argc, argv); add = (t_float)atom_getfloatarg(3, argc, argv); if(beg_src1 < 0) beg_src1 = 0; if(beg_dst < 0) beg_dst = 0; if(n < 0) n = 0; ok_src1 = iem_tab_check_arrays(gensym("tab_add_scalar"), x->x_sym_scr1, &x->x_beg_mem_src1, &x->x_size_src1, beg_src1+n); ok_dst = iem_tab_check_arrays(gensym("tab_add_scalar"), x->x_sym_dst, &x->x_beg_mem_dst, &x->x_size_dst, beg_dst+n); if(ok_src1 && ok_dst) { vec_src1 = x->x_beg_mem_src1 + beg_src1; vec_dst = x->x_beg_mem_dst + beg_dst; if(n) { t_garray *a; for(i=0; ix_obj.ob_outlet); a = (t_garray *)pd_findbyclass(x->x_sym_dst, garray_class); garray_redraw(a); } } } else { post("tab_add_scalar-ERROR: list need 4 float arguments:"); post(" source1_offset + destination_offset + number_of_samples_to_add + add_scalar"); } } static void tab_add_scalar_free(t_tab_add_scalar *x) { } static void *tab_add_scalar_new(t_symbol *s, int argc, t_atom *argv) { t_tab_add_scalar *x = (t_tab_add_scalar *)pd_new(tab_add_scalar_class); t_symbol *src1, *dst; if((argc >= 2) && IS_A_SYMBOL(argv,0) && IS_A_SYMBOL(argv,1)) { src1 = (t_symbol *)atom_getsymbolarg(0, argc, argv); dst = (t_symbol *)atom_getsymbolarg(1, argc, argv); } else if((argc >= 1) && IS_A_SYMBOL(argv,0)) { src1 = (t_symbol *)atom_getsymbolarg(0, argc, argv); dst = src1; } else { post("tab_add_scalar-ERROR: need 2 symbol arguments:"); post(" source_array_name + destination_array_name"); return(0); } x->x_sym_scr1 = src1; x->x_sym_dst = dst; outlet_new(&x->x_obj, &s_bang); return(x); } void tab_add_scalar_setup(void) { tab_add_scalar_class = class_new(gensym("tab_add_scalar"), (t_newmethod)tab_add_scalar_new, (t_method)tab_add_scalar_free, sizeof(t_tab_add_scalar), 0, A_GIMME, 0); class_addfloat(tab_add_scalar_class, (t_method)tab_add_scalar_float); class_addlist(tab_add_scalar_class, (t_method)tab_add_scalar_list); class_addmethod(tab_add_scalar_class, (t_method)tab_add_scalar_src, gensym("src1"), A_DEFSYMBOL, 0); class_addmethod(tab_add_scalar_class, (t_method)tab_add_scalar_src, gensym("src"), A_DEFSYMBOL, 0); class_addmethod(tab_add_scalar_class, (t_method)tab_add_scalar_dst, gensym("dst"), A_DEFSYMBOL, 0); // class_sethelpsymbol(tab_add_scalar_class, gensym("iemhelp2/tab_add_scalar-help")); } iem_utils-v0.0.20180206/iem_tab/src/makefile_linux0000644000175000017500000000276612630366350022011 0ustar zmoelnigzmoelnigcurrent: all .SUFFIXES: .pd_linux #edit or define outside PD_INCLUDE=/usr/local/src/pd/src INCLUDE = -I. -I$(PD_INCLUDE) LDFLAGS = -export-dynamic -shared LIB = -ldl -lm #select either the DBG and OPT compiler flags below: CFLAGS = -DPD -DUNIX -W -Wno-unused \ -Wno-parentheses -Wno-switch -O2 -funroll-loops -fomit-frame-pointer \ -fno-strict-aliasing -DDL_OPEN -fPIC SYSTEM = $(shell uname -m) # the sources SRC = \ tab_abs.c \ tab_add.c \ tab_add_scalar.c \ tab_carth2polar.c \ tab_complex_inv.c \ tab_complex_mul.c \ tab_const.c \ tab_conv.c \ tab_copy.c \ tab_counter.c \ tab_cross_corr.c \ tab_dbtopow.c \ tab_dbtorms.c \ tab_div.c \ tab_eq.c \ tab_eq_scalar.c \ tab_fft.c \ tab_find_exact_peaks.c \ tab_find_peaks.c \ tab_ge.c \ tab_ge_scalar.c \ tab_gt.c \ tab_gt_scalar.c \ tab_get_size.c \ tab_ifft.c \ tab_le.c \ tab_le_scalar.c \ tab_lt.c \ tab_lt_scalar.c \ tab_max_index.c \ tab_min_index.c \ tab_min_max.c \ tab_mul.c \ tab_mul_scalar.c \ tab_ne.c \ tab_ne_scalar.c \ tab_powtodb.c \ tab_reverse.c \ tab_rfft.c \ tab_rifft.c \ tab_rmstodb.c \ tab_sqrt.c \ tab_sub.c \ tab_sum.c \ iem_tab.c TARGET = iem_tab.pd_linux OBJ = $(SRC:.c=.o) # # ------------------ targets ------------------------------------ # clean: -rm ../$(TARGET) $(TARGET) -rm *.o all: $(OBJ) @echo :: $(OBJ) $(LD) $(LDFLAGS) -o $(TARGET) *.o $(LIB) strip --strip-unneeded $(TARGET) cp $(TARGET) .. $(OBJ) : %.o : %.c $(CC) $(CFLAGS) $(INCLUDE) -c -o $*.o $*.c iem_utils-v0.0.20180206/iem_tab/src/tab_ifft.c0000644000175000017500000003114712630366350021007 0ustar zmoelnigzmoelnig/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_tab written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2009 */ #include "m_pd.h" #include "iemlib.h" #include "iem_tab.h" #include /* -------------------------- tab_ifft ------------------------------ */ /* complex inverse FFT */ typedef struct _tab_ifft { t_object x_obj; int x_size_src_re; int x_size_src_im; int x_size_dst_re; int x_size_dst_im; int x_offset_src_re; int x_offset_src_im; int x_offset_dst_re; int x_offset_dst_im; int x_fftsize; iemarray_t *x_beg_mem_src_re; iemarray_t *x_beg_mem_src_im; iemarray_t *x_beg_mem_dst_re; iemarray_t *x_beg_mem_dst_im; TAB_COMPLEX *x_sin_cos; t_symbol *x_sym_src_re; t_symbol *x_sym_src_im; t_symbol *x_sym_dst_re; t_symbol *x_sym_dst_im; } t_tab_ifft; static t_class *tab_ifft_class; static void tab_ifft_init(t_tab_ifft *x) { int i, fftsize = x->x_fftsize; t_float f, g; TAB_COMPLEX *sincos = x->x_sin_cos; g = 2.0 * 3.141592653589793 / (t_float)fftsize; for(i=0; ix_fftsize) { x->x_sin_cos = (TAB_COMPLEX *)resizebytes(x->x_sin_cos, x->x_fftsize*sizeof(TAB_COMPLEX), i*sizeof(TAB_COMPLEX)); x->x_fftsize = i; } tab_ifft_init(x); } static void tab_ifft_dst_re(t_tab_ifft *x, t_symbol *s) { x->x_sym_dst_re = s; } static void tab_ifft_dst_im(t_tab_ifft *x, t_symbol *s) { x->x_sym_dst_im = s; } static void tab_ifft_src_re(t_tab_ifft *x, t_symbol *s) { x->x_sym_src_re = s; } static void tab_ifft_src_im(t_tab_ifft *x, t_symbol *s) { x->x_sym_src_im = s; } static void tab_ifft_bang(t_tab_ifft *x) { int i, j, k; int ok_src_re, ok_src_im, ok_dst_re, ok_dst_im; int w_index, w_inc, i_inc, v_index; int fftsize = x->x_fftsize; int fs1 = fftsize - 1; int fs2 = fftsize / 2; TAB_COMPLEX w; TAB_COMPLEX *sincos = x->x_sin_cos; iemarray_t *vec_src_re, *vec_src_im, *vec_dst_re, *vec_dst_im; t_float old1_re, old1_im, old2_re, old2_im, g; ok_src_re = iem_tab_check_arrays(gensym("tab_ifft"), x->x_sym_src_re, &x->x_beg_mem_src_re, &x->x_size_src_re, fftsize); ok_src_im = iem_tab_check_arrays(gensym("tab_ifft"), x->x_sym_src_im, &x->x_beg_mem_src_im, &x->x_size_src_im, fftsize); ok_dst_re = iem_tab_check_arrays(gensym("tab_ifft"), x->x_sym_dst_re, &x->x_beg_mem_dst_re, &x->x_size_dst_re, fftsize); ok_dst_im = iem_tab_check_arrays(gensym("tab_ifft"), x->x_sym_dst_im, &x->x_beg_mem_dst_im, &x->x_size_dst_im, fftsize); if(ok_src_re && ok_src_im && ok_dst_re && ok_dst_im) { t_garray *a; vec_src_re=x->x_beg_mem_src_re; vec_src_im=x->x_beg_mem_src_im; vec_dst_re=x->x_beg_mem_dst_re; vec_dst_im=x->x_beg_mem_dst_im; for(j=0; j>= 1; } j = 0; for(i=1;i>= 1; } j = j + k; if(i < j) { old1_re = iemarray_getfloat(vec_dst_re, j); old1_im = iemarray_getfloat(vec_dst_im, j); iemarray_setfloat(vec_dst_re, j, iemarray_getfloat(vec_dst_re, i)); iemarray_setfloat(vec_dst_im, j, iemarray_getfloat(vec_dst_im, i)); iemarray_setfloat(vec_dst_re, i, old1_re); iemarray_setfloat(vec_dst_im, i, old1_im); } } // g = 2.0f / (t_float)fftsize; /* ein fehler tritt auf beim 0.sample, hier sollte nur mal 1.0 multipliziert werden wenn gelten soll : Energie im zeitfenster == Energie im Frequenz-dichte-fenster g = 1.0f; for(i = 0; i < fs2; i++) { vec_dst_re[i] *= g; vec_dst_im[i] *= g; } */ g = 1.0 / (t_float)fftsize; for(i = 0; i < fftsize; i++) { iemarray_setfloat(vec_dst_re, i, iemarray_getfloat(vec_dst_re, i)*g); iemarray_setfloat(vec_dst_im, i, iemarray_getfloat(vec_dst_im, i)*g); } outlet_bang(x->x_obj.ob_outlet); a = (t_garray *)pd_findbyclass(x->x_sym_dst_re, garray_class); garray_redraw(a); a = (t_garray *)pd_findbyclass(x->x_sym_dst_im, garray_class); garray_redraw(a); } } static void tab_ifft_list(t_tab_ifft *x, t_symbol *s, int argc, t_atom *argv) { int beg_src_re, beg_src_im, beg_dst_re, beg_dst_im; int i, j, k; int ok_src_re, ok_src_im, ok_dst_re, ok_dst_im; int w_index, w_inc, i_inc, v_index; int fftsize = x->x_fftsize; int fs1 = fftsize - 1; int fs2 = fftsize / 2; TAB_COMPLEX w; TAB_COMPLEX *sincos = x->x_sin_cos; iemarray_t *vec_src_re, *vec_src_im, *vec_dst_re, *vec_dst_im; t_float old1_re, old1_im, old2_re, old2_im, g; if((argc >= 4) && IS_A_FLOAT(argv,0) && IS_A_FLOAT(argv,1) && IS_A_FLOAT(argv,2) && IS_A_FLOAT(argv,3)) { beg_src_re = (int)atom_getintarg(0, argc, argv); beg_src_im = (int)atom_getintarg(1, argc, argv); beg_dst_re = (int)atom_getintarg(2, argc, argv); beg_dst_im = (int)atom_getintarg(3, argc, argv); if(beg_src_re < 0) beg_src_re = 0; if(beg_src_im < 0) beg_src_im = 0; if(beg_dst_re < 0) beg_dst_re = 0; if(beg_dst_im < 0) beg_dst_im = 0; ok_src_re = iem_tab_check_arrays(gensym("tab_ifft"), x->x_sym_src_re, &x->x_beg_mem_src_re, &x->x_size_src_re, fftsize); ok_src_im = iem_tab_check_arrays(gensym("tab_ifft"), x->x_sym_src_im, &x->x_beg_mem_src_im, &x->x_size_src_im, fftsize); ok_dst_re = iem_tab_check_arrays(gensym("tab_ifft"), x->x_sym_dst_re, &x->x_beg_mem_dst_re, &x->x_size_dst_re, fftsize); ok_dst_im = iem_tab_check_arrays(gensym("tab_ifft"), x->x_sym_dst_im, &x->x_beg_mem_dst_im, &x->x_size_dst_im, fftsize); if(ok_src_re && ok_src_im && ok_dst_re && ok_dst_im) { t_garray *a; vec_src_re=x->x_beg_mem_src_re + beg_src_re; vec_src_im=x->x_beg_mem_src_im + beg_src_im; vec_dst_re=x->x_beg_mem_dst_re + beg_dst_re; vec_dst_im=x->x_beg_mem_dst_im + beg_dst_im; for(j=0; j>= 1; } j = 0; for(i=1;i>= 1; } j = j + k; if(i < j) { old1_re = iemarray_getfloat(vec_dst_re, j); old1_im = iemarray_getfloat(vec_dst_im, j); iemarray_setfloat(vec_dst_re, j, iemarray_getfloat(vec_dst_re, i)); iemarray_setfloat(vec_dst_im, j, iemarray_getfloat(vec_dst_im, i)); iemarray_setfloat(vec_dst_re, i, old1_re); iemarray_setfloat(vec_dst_im, i, old1_im); } } // g = 2.0f / (t_float)fftsize; /* ein fehler tritt auf beim 0.sample, hier sollte nur mal 1.0 multipliziert werden wenn gelten soll : Energie im zeitfenster == Energie im Frequenz-dichte-fenster g = 1.0f; for(i = 0; i < fs2; i++) { vec_dst_re[i] *= g; vec_dst_im[i] *= g; } */ g = 1.0 / (t_float)fftsize; for(i = 0; i < fftsize; i++) { iemarray_setfloat(vec_dst_re, i, iemarray_getfloat(vec_dst_re, i)*g); iemarray_setfloat(vec_dst_im, i, iemarray_getfloat(vec_dst_im, i)*g); } outlet_bang(x->x_obj.ob_outlet); a = (t_garray *)pd_findbyclass(x->x_sym_dst_re, garray_class); garray_redraw(a); a = (t_garray *)pd_findbyclass(x->x_sym_dst_im, garray_class); garray_redraw(a); } } else { post("tab_ifft-ERROR: list need 4 float arguments:"); post(" source_real_offset + source_imag_offset + destination_real_offset + destination_imag_offset"); } } static void tab_ifft_free(t_tab_ifft *x) { freebytes(x->x_sin_cos, x->x_fftsize * sizeof(TAB_COMPLEX)); } static void *tab_ifft_new(t_symbol *s, int argc, t_atom *argv) { t_tab_ifft *x = (t_tab_ifft *)pd_new(tab_ifft_class); t_symbol *src_re, *src_im, *dst_re, *dst_im; int fftsize, i=1; if((argc >= 5) && IS_A_SYMBOL(argv,0) && IS_A_SYMBOL(argv,1) && IS_A_SYMBOL(argv,2) && IS_A_SYMBOL(argv,3) && IS_A_FLOAT(argv,4)) { src_re = (t_symbol *)atom_getsymbolarg(0, argc, argv); src_im = (t_symbol *)atom_getsymbolarg(1, argc, argv); dst_re = (t_symbol *)atom_getsymbolarg(2, argc, argv); dst_im = (t_symbol *)atom_getsymbolarg(3, argc, argv); fftsize = (int)atom_getintarg(4, argc, argv); } else { post("tab_ifft-ERROR: need 4 symbols + 1 float arguments:"); post(" source_real_array_name + source_imag_array_name + destination_real_array_name + destination_imag_array_name + IFFT-size"); return(0); } if(fftsize < 8) fftsize = 8; while(i <= fftsize) i *= 2; i /= 2; fftsize = i; x->x_fftsize = fftsize; x->x_sym_src_re = src_re; x->x_sym_src_im = src_im; x->x_sym_dst_re = dst_re; x->x_sym_dst_im = dst_im; x->x_sin_cos = (TAB_COMPLEX *)getbytes(x->x_fftsize * sizeof(TAB_COMPLEX)); tab_ifft_init(x); outlet_new(&x->x_obj, &s_bang); return(x); } void tab_ifft_setup(void) { tab_ifft_class = class_new(gensym("tab_ifft"), (t_newmethod)tab_ifft_new, (t_method)tab_ifft_free, sizeof(t_tab_ifft), 0, A_GIMME, 0); class_addbang(tab_ifft_class, (t_method)tab_ifft_bang); class_addlist(tab_ifft_class, (t_method)tab_ifft_list); class_addmethod(tab_ifft_class, (t_method)tab_ifft_ifftsize, gensym("ifftsize"), A_DEFFLOAT, 0); class_addmethod(tab_ifft_class, (t_method)tab_ifft_src_re, gensym("src_re"), A_DEFSYMBOL, 0); class_addmethod(tab_ifft_class, (t_method)tab_ifft_src_im, gensym("src_im"), A_DEFSYMBOL, 0); class_addmethod(tab_ifft_class, (t_method)tab_ifft_src_re, gensym("src1"), A_DEFSYMBOL, 0); class_addmethod(tab_ifft_class, (t_method)tab_ifft_src_im, gensym("src2"), A_DEFSYMBOL, 0); class_addmethod(tab_ifft_class, (t_method)tab_ifft_dst_re, gensym("dst_re"), A_DEFSYMBOL, 0); class_addmethod(tab_ifft_class, (t_method)tab_ifft_dst_im, gensym("dst_im"), A_DEFSYMBOL, 0); class_addmethod(tab_ifft_class, (t_method)tab_ifft_dst_re, gensym("dst1"), A_DEFSYMBOL, 0); class_addmethod(tab_ifft_class, (t_method)tab_ifft_dst_im, gensym("dst2"), A_DEFSYMBOL, 0); } iem_utils-v0.0.20180206/iem_tab/src/tab_dbtopow.c0000644000175000017500000001152612630366350021534 0ustar zmoelnigzmoelnig/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_tab written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2010 */ #include "m_pd.h" #include "iemlib.h" #include "iem_tab.h" #include #define IEMTABLOGTEN 2.302585092994046 /* -------------------------- tab_dbtopow ------------------------------ */ typedef struct _tab_dbtopow { t_object x_obj; int x_size_src1; int x_size_dst; int x_offset_src1; int x_offset_dst; iemarray_t *x_beg_mem_src1; iemarray_t *x_beg_mem_dst; t_symbol *x_sym_scr1; t_symbol *x_sym_dst; } t_tab_dbtopow; static t_class *tab_dbtopow_class; static void tab_dbtopow_src(t_tab_dbtopow *x, t_symbol *s) { x->x_sym_scr1 = s; } static void tab_dbtopow_dst(t_tab_dbtopow *x, t_symbol *s) { x->x_sym_dst = s; } static void tab_dbtopow_bang(t_tab_dbtopow *x) { int i, n; int ok_src, ok_dst; iemarray_t *vec_src, *vec_dst; ok_src = iem_tab_check_arrays(gensym("tab_dbtopow"), x->x_sym_scr1, &x->x_beg_mem_src1, &x->x_size_src1, 0); ok_dst = iem_tab_check_arrays(gensym("tab_dbtopow"), x->x_sym_dst, &x->x_beg_mem_dst, &x->x_size_dst, 0); if(ok_src && ok_dst) { if(x->x_size_src1 < x->x_size_dst) n = x->x_size_src1; else n = x->x_size_dst; vec_src = x->x_beg_mem_src1; vec_dst = x->x_beg_mem_dst; if(n) { t_garray *a; for(i=0; i 870.0) f = 870.0; iemarray_setfloat(vec_dst, i, exp((IEMTABLOGTEN * 0.1) * (f-100.0))); } } outlet_bang(x->x_obj.ob_outlet); a = (t_garray *)pd_findbyclass(x->x_sym_dst, garray_class); garray_redraw(a); } } } static void tab_dbtopow_list(t_tab_dbtopow *x, t_symbol *s, int argc, t_atom *argv) { int beg_src, beg_dst; int i, n; int ok_src, ok_dst; iemarray_t *vec_src, *vec_dst; if((argc >= 3) && IS_A_FLOAT(argv,0) && IS_A_FLOAT(argv,1) && IS_A_FLOAT(argv,2)) { beg_src = (int)atom_getintarg(0, argc, argv); beg_dst = (int)atom_getintarg(1, argc, argv); n = (int)atom_getintarg(2, argc, argv); if(beg_src < 0) beg_src = 0; if(beg_dst < 0) beg_dst = 0; if(n < 0) n = 0; ok_src = iem_tab_check_arrays(gensym("tab_dbtopow"), x->x_sym_scr1, &x->x_beg_mem_src1, &x->x_size_src1, beg_src+n); ok_dst = iem_tab_check_arrays(gensym("tab_dbtopow"), x->x_sym_dst, &x->x_beg_mem_dst, &x->x_size_dst, beg_dst+n); if(ok_src && ok_dst) { vec_src = x->x_beg_mem_src1 + beg_src; vec_dst = x->x_beg_mem_dst + beg_dst; if(n) { t_garray *a; for(i=0; i 870.0) f = 870.0; iemarray_setfloat(vec_dst, i, exp((IEMTABLOGTEN * 0.1) * (f-100.0))); } } outlet_bang(x->x_obj.ob_outlet); a = (t_garray *)pd_findbyclass(x->x_sym_dst, garray_class); garray_redraw(a); } } } else { post("tab_dbtopow-ERROR: list need 3 float arguments:"); post(" source_offset + destination_offset + number_of_samples_to_dbtopow"); } } static void tab_dbtopow_free(t_tab_dbtopow *x) { } static void *tab_dbtopow_new(t_symbol *s, int argc, t_atom *argv) { t_tab_dbtopow *x = (t_tab_dbtopow *)pd_new(tab_dbtopow_class); t_symbol *src, *dst; if((argc >= 2) && IS_A_SYMBOL(argv,0) && IS_A_SYMBOL(argv,1)) { src = (t_symbol *)atom_getsymbolarg(0, argc, argv); dst = (t_symbol *)atom_getsymbolarg(1, argc, argv); } else if((argc >= 1) && IS_A_SYMBOL(argv,0)) { src = (t_symbol *)atom_getsymbolarg(0, argc, argv); dst = src; } else { post("tab_dbtopow-ERROR: need 2 symbols arguments:"); post(" source_array_name + destination_array_name"); return(0); } x->x_sym_scr1 = src; x->x_sym_dst = dst; outlet_new(&x->x_obj, &s_bang); return(x); } void tab_dbtopow_setup(void) { tab_dbtopow_class = class_new(gensym("tab_dbtopow"), (t_newmethod)tab_dbtopow_new, (t_method)tab_dbtopow_free, sizeof(t_tab_dbtopow), 0, A_GIMME, 0); class_addbang(tab_dbtopow_class, (t_method)tab_dbtopow_bang); class_addlist(tab_dbtopow_class, (t_method)tab_dbtopow_list); class_addmethod(tab_dbtopow_class, (t_method)tab_dbtopow_src, gensym("src"), A_DEFSYMBOL, 0); class_addmethod(tab_dbtopow_class, (t_method)tab_dbtopow_src, gensym("src1"), A_DEFSYMBOL, 0); class_addmethod(tab_dbtopow_class, (t_method)tab_dbtopow_dst, gensym("dst"), A_DEFSYMBOL, 0); } iem_utils-v0.0.20180206/iem_tab/src/VC6/0000755000175000017500000000000012630366350017455 5ustar zmoelnigzmoelnigiem_utils-v0.0.20180206/iem_tab/src/VC6/iem_tab.dsp0000644000175000017500000000474512630366350021577 0ustar zmoelnigzmoelnig# Microsoft Developer Studio Project File - Name="iem_tab" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** NICHT BEARBEITEN ** # TARGTYPE "Win32 (x86) External Target" 0x0106 CFG=iem_tab - Win32 Debug !MESSAGE Dies ist kein gültiges Makefile. Zum Erstellen dieses Projekts mit NMAKE !MESSAGE verwenden Sie den Befehl "Makefile exportieren" und führen Sie den Befehl !MESSAGE !MESSAGE NMAKE /f "iem_tab.mak". !MESSAGE !MESSAGE Sie können beim Ausführen von NMAKE eine Konfiguration angeben !MESSAGE durch Definieren des Makros CFG in der Befehlszeile. Zum Beispiel: !MESSAGE !MESSAGE NMAKE /f "iem_tab.mak" CFG="iem_tab - Win32 Debug" !MESSAGE !MESSAGE Für die Konfiguration stehen zur Auswahl: !MESSAGE !MESSAGE "iem_tab - Win32 Release" (basierend auf "Win32 (x86) External Target") !MESSAGE "iem_tab - Win32 Debug" (basierend auf "Win32 (x86) External Target") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" !IF "$(CFG)" == "iem_tab - Win32 Release" # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "Release" # PROP BASE Intermediate_Dir "Release" # PROP BASE Cmd_Line "NMAKE /f makefile_win" # PROP BASE Rebuild_Opt "/a" # PROP BASE Target_File "makefile_win.exe" # PROP BASE Bsc_Name "makefile_win.bsc" # PROP BASE Target_Dir "" # PROP Use_Debug_Libraries 0 # PROP Output_Dir "Release" # PROP Intermediate_Dir "Release" # PROP Cmd_Line "NMAKE /f makefile_win" # PROP Rebuild_Opt "/a" # PROP Target_File "iem_tab.exe" # PROP Bsc_Name "iem_tab.bsc" # PROP Target_Dir "" !ELSEIF "$(CFG)" == "iem_tab - Win32 Debug" # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "Debug" # PROP BASE Intermediate_Dir "Debug" # PROP BASE Cmd_Line "NMAKE /f makefile_win" # PROP BASE Rebuild_Opt "/a" # PROP BASE Target_File "makefile_win.exe" # PROP BASE Bsc_Name "makefile_win.bsc" # PROP BASE Target_Dir "" # PROP Use_Debug_Libraries 1 # PROP Output_Dir "Debug" # PROP Intermediate_Dir "Debug" # PROP Cmd_Line "NMAKE /f makefile_win" # PROP Rebuild_Opt "/a" # PROP Target_File "iem_tab.exe" # PROP Bsc_Name "iem_tab.bsc" # PROP Target_Dir "" !ENDIF # Begin Target # Name "iem_tab - Win32 Release" # Name "iem_tab - Win32 Debug" !IF "$(CFG)" == "iem_tab - Win32 Release" !ELSEIF "$(CFG)" == "iem_tab - Win32 Debug" !ENDIF # Begin Source File SOURCE=.\makefile_win # End Source File # End Target # End Project iem_utils-v0.0.20180206/iem_tab/src/VC6/makefile_win0000644000175000017500000000305112630366350022031 0ustar zmoelnigzmoelnig all: ..\iem_tab.dll VIS_CPP_PATH = "C:\Programme\Microsoft Visual Studio\Vc98" PD_INST_PATH = "C:\Programme\pd" PD_WIN_INCLUDE_PATH = /I. /I$(PD_INST_PATH)\src /I$(VIS_CPP_PATH)\include PD_WIN_C_FLAGS = /nologo /W3 /WX /DMSW /DNT /DPD /DWIN32 /DWINDOWS /Ox -DPA_LITTLE_ENDIAN PD_WIN_L_FLAGS = /nologo PD_WIN_LIB = /NODEFAULTLIB:libc /NODEFAULTLIB:oldnames /NODEFAULTLIB:kernel /NODEFAULTLIB:uuid \ $(VIS_CPP_PATH)\lib\libc.lib \ $(VIS_CPP_PATH)\lib\oldnames.lib \ $(VIS_CPP_PATH)\lib\kernel32.lib \ $(VIS_CPP_PATH)\lib\wsock32.lib \ $(VIS_CPP_PATH)\lib\winmm.lib \ $(PD_INST_PATH)\bin\pd.lib SRC = tab_abs.c \ tab_add.c \ tab_add_scalar.c \ tab_carth2polar.c \ tab_complex_inv.c \ tab_complex_mul.c \ tab_const.c \ tab_conv.c \ tab_copy.c \ tab_counter.c \ tab_cross_corr.c \ tab_div.c \ tab_eq.c \ tab_eq_scalar.c \ tab_fft.c \ tab_find_exact_peaks.c \ tab_find_peaks.c \ tab_ge.c \ tab_ge_scalar.c \ tab_gt.c \ tab_gt_scalar.c \ tab_get_size.c \ tab_ifft.c \ tab_le.c \ tab_le_scalar.c \ tab_lt.c \ tab_lt_scalar.c \ tab_max_index.c \ tab_min_index.c \ tab_min_max.c \ tab_mul.c \ tab_mul_scalar.c \ tab_ne.c \ tab_ne_scalar.c \ tab_reverse.c \ tab_rfft.c \ tab_rifft.c \ tab_sqrt.c \ tab_sub.c \ tab_sum.c \ iem_tab.c OBJ = $(SRC:.c=.obj) .c.obj: cl $(PD_WIN_C_FLAGS) $(PD_WIN_INCLUDE_PATH) /c $*.c ..\iem_tab.dll: $(OBJ) link $(PD_WIN_L_FLAGS) /dll /export:iem_tab_setup \ /out:..\iem_tab.dll $(OBJ) $(PD_WIN_LIB) clean: del *.obj iem_utils-v0.0.20180206/iem_tab/src/VC6/iem_tab.dsw0000644000175000017500000000106512630366350021576 0ustar zmoelnigzmoelnigMicrosoft Developer Studio Workspace File, Format Version 6.00 # WARNUNG: DIESE ARBEITSBEREICHSDATEI DARF NICHT BEARBEITET ODER GELÖSCHT WERDEN! ############################################################################### Project: "iem_tab"=.\iem_tab.dsp - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ }}} ############################################################################### Global: Package=<5> {{{ }}} Package=<3> {{{ }}} ############################################################################### iem_utils-v0.0.20180206/iem_tab/src/iemlib.h0000644000175000017500000000762412630366350020502 0ustar zmoelnigzmoelnig/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iemlib written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2012 */ #ifndef __IEMLIB_H__ #define __IEMLIB_H__ #define IS_A_NULL(atom,index) ((atom+index)->a_type == A_NULL) #define IS_A_POINTER(atom,index) ((atom+index)->a_type == A_POINTER) #define IS_A_FLOAT(atom,index) ((atom+index)->a_type == A_FLOAT) #define IS_A_SYMBOL(atom,index) ((atom+index)->a_type == A_SYMBOL) #define IS_A_DOLLAR(atom,index) ((atom+index)->a_type == A_DOLLAR) #define IS_A_DOLLSYM(atom,index) ((atom+index)->a_type == A_DOLLSYM) #define IS_A_SEMI(atom,index) ((atom+index)->a_type == A_SEMI) #define IS_A_COMMA(atom,index) ((atom+index)->a_type == A_COMMA) #define SETNULL(atom) ((atom)->a_type = A_NULL) /* now miller's code starts : for 4 point interpolation for lookup tables for denormal floats */ #ifdef MSW int sys_noloadbang; //t_symbol *iemgui_key_sym=0; #include #else extern int sys_noloadbang; //extern t_symbol *iemgui_key_sym; #include #endif #define DEFDELVS 64 #define XTRASAMPS 4 #define SAMPBLK 4 #define UNITBIT32 1572864. /* 3*2^19; bit 32 has place value 1 */ /* machine-dependent definitions. These ifdefs really should have been by CPU type and not by operating system! */ #ifdef IRIX /* big-endian. Most significant byte is at low address in memory */ #define HIOFFSET 0 /* word offset to find MSB */ #define LOWOFFSET 1 /* word offset to find LSB */ #define int32 long /* a data type that has 32 bits */ #endif /* IRIX */ #ifdef MSW /* little-endian; most significant byte is at highest address */ #define HIOFFSET 1 #define LOWOFFSET 0 #define int32 long #endif /* MSW */ #if defined(__FreeBSD__) || defined(__APPLE__) || defined(__FreeBSD_kernel__) #include #endif #if defined(__linux__) || defined(__CYGWIN__) || defined(__GNU__) || defined(ANDROID) #include #endif #if defined(__unix__) || defined(__APPLE__) #if !defined(BYTE_ORDER) || !defined(LITTLE_ENDIAN) #error No byte order defined #endif #if BYTE_ORDER == LITTLE_ENDIAN #define HIOFFSET 1 #define LOWOFFSET 0 #else #define HIOFFSET 0 /* word offset to find MSB */ #define LOWOFFSET 1 /* word offset to find LSB */ #endif /* __BYTE_ORDER */ #include #define int32 int32_t #endif /* __unix__ or __APPLE__*/ union tabfudge_d { double tf_d; int32 tf_i[2]; }; union tabfudge_f { float tf_f; long tf_l; }; #if defined __i386__ || defined __x86_64__ #define IEM_DENORMAL(f) ((((*(unsigned int*)&(f))&0x60000000)==0) || \ (((*(unsigned int*)&(f))&0x60000000)==0x60000000)) /* more stringent test: anything not between 1e-19 and 1e19 in absolute val */ #else #define IEM_DENORMAL(f) 0 #endif /* on 64bit systems we cannot use garray_getfloatarray... */ #if ((defined PD_MAJOR_VERSION && defined PD_MINOR_VERSION) && (PD_MAJOR_VERSION > 0 || PD_MINOR_VERSION > 40)) # define iemarray_t t_word # define iemarray_getarray garray_getfloatwords # define iemarray_getfloat(pointer, index) (pointer[index].w_float) # define iemarray_setfloat(pointer, index, fvalue) (pointer[index].w_float = fvalue) #else # define iemarray_t t_float # define iemarray_getarray garray_getfloatarray # define iemarray_getfloat(pointer, index) (pointer[index]) # define iemarray_setfloat(pointer, index, fvalue) (pointer[index] = fvalue) #endif #endif iem_utils-v0.0.20180206/iem_tab/src/tab_min_max.c0000644000175000017500000000734412630366350021511 0ustar zmoelnigzmoelnig/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_tab written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2009 */ #include "m_pd.h" #include "iemlib.h" #include "iem_tab.h" /* -------------------------- tab_min_max ------------------------------ */ typedef struct _tab_min_max { t_object x_obj; int x_size_src1; int x_offset_src1; iemarray_t *x_beg_mem_src1; t_symbol *x_sym_scr1; void *x_bang_out; void *x_min_out; void *x_max_out; } t_tab_min_max; static t_class *tab_min_max_class; static void tab_min_max_src(t_tab_min_max *x, t_symbol *s) { x->x_sym_scr1 = s; } static void tab_min_max_bang(t_tab_min_max *x) { int i, n; int ok_src; iemarray_t *vec_src; t_float min=1.0e37, max=-1.0e37; ok_src = iem_tab_check_arrays(gensym("tab_min_max"), x->x_sym_scr1, &x->x_beg_mem_src1, &x->x_size_src1, 0); if(ok_src) { n = x->x_size_src1; vec_src = x->x_beg_mem_src1; if(n) { for(i=0; i max) max = iemarray_getfloat(vec_src, i); if(iemarray_getfloat(vec_src, i) < min) min = iemarray_getfloat(vec_src, i); } outlet_float(x->x_max_out, max); outlet_float(x->x_min_out, min); outlet_bang(x->x_bang_out); } } } static void tab_min_max_list(t_tab_min_max *x, t_symbol *s, int argc, t_atom *argv) { int beg_src; int i, n; int ok_src; iemarray_t *vec_src; t_float min=1.0e37, max=-1.0e37; if((argc >= 2) && IS_A_FLOAT(argv,0) && IS_A_FLOAT(argv,1)) { beg_src = (int)atom_getintarg(0, argc, argv); n = (int)atom_getintarg(1, argc, argv); if(beg_src < 0) beg_src = 0; if(n < 0) n = 0; ok_src = iem_tab_check_arrays(gensym("tab_min_max"), x->x_sym_scr1, &x->x_beg_mem_src1, &x->x_size_src1, beg_src+n); if(ok_src) { vec_src = x->x_beg_mem_src1 + beg_src; if(n) { for(i=0; i max) max = iemarray_getfloat(vec_src, i); if(iemarray_getfloat(vec_src, i) < min) min = iemarray_getfloat(vec_src, i); } outlet_float(x->x_max_out, max); outlet_float(x->x_min_out, min); outlet_bang(x->x_bang_out); } } } else { post("tab_min_max-ERROR: list need 2 float arguments:"); post(" source_offset + number_of_samples_to_calc_min_max"); } } static void tab_min_max_free(t_tab_min_max *x) { } static void *tab_min_max_new(t_symbol *s, int argc, t_atom *argv) { t_tab_min_max *x = (t_tab_min_max *)pd_new(tab_min_max_class); t_symbol *src; if((argc >= 1) && IS_A_SYMBOL(argv,0)) { src = (t_symbol *)atom_getsymbolarg(0, argc, argv); } else { post("tab_min_max-ERROR: need 1 symbol argument:"); post(" source_array_name"); return(0); } x->x_sym_scr1 = src; x->x_bang_out = outlet_new(&x->x_obj, &s_bang); x->x_min_out = outlet_new(&x->x_obj, &s_float); x->x_max_out = outlet_new(&x->x_obj, &s_float); return(x); } void tab_min_max_setup(void) { tab_min_max_class = class_new(gensym("tab_min_max"), (t_newmethod)tab_min_max_new, (t_method)tab_min_max_free, sizeof(t_tab_min_max), 0, A_GIMME, 0); class_addbang(tab_min_max_class, (t_method)tab_min_max_bang); class_addlist(tab_min_max_class, (t_method)tab_min_max_list); class_addmethod(tab_min_max_class, (t_method)tab_min_max_src, gensym("src"), A_DEFSYMBOL, 0); class_addmethod(tab_min_max_class, (t_method)tab_min_max_src, gensym("src1"), A_DEFSYMBOL, 0); // class_sethelpsymbol(tab_min_max_class, gensym("iemhelp2/tab_min_max-help")); } iem_utils-v0.0.20180206/iem_tab/src/tab_conv.c0000644000175000017500000002726612630366350021033 0ustar zmoelnigzmoelnig/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_tab written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2009 */ #include "m_pd.h" #include "iemlib.h" #include "iem_tab.h" /* ---------------------------- tab_conv ------------------------------- */ /* for(i=0; ix_sym_scr1 = s; } static void tab_conv_src2(t_tab_conv *x, t_symbol *s) { x->x_sym_scr2 = s; } static void tab_conv_dst(t_tab_conv *x, t_symbol *s) { x->x_sym_dst = s; } static void tab_conv_bang(t_tab_conv *x) { int i, j, k, l, m, n, p, q; int ok_src1, ok_src2, ok_dst; iemarray_t *vec_sig, *vec_ir, *vec_dst; t_float sum=0.0f; ok_src1 = iem_tab_check_arrays(gensym("tab_conv"), x->x_sym_scr1, &x->x_beg_mem_src1, &x->x_size_src1, 0); ok_src2 = iem_tab_check_arrays(gensym("tab_conv"), x->x_sym_scr2, &x->x_beg_mem_src2, &x->x_size_src2, 0); ok_dst = iem_tab_check_arrays(gensym("tab_conv"), x->x_sym_dst, &x->x_beg_mem_dst, &x->x_size_dst, 0); if(ok_src1 && ok_src2 && ok_dst) { t_garray *a; if((x->x_size_src1+x->x_size_src2-1) <= x->x_size_dst)// ok, the last part of dst is zero { if(x->x_size_src1 > x->x_size_src2)// src2(t-tau) is impuls response { vec_sig = x->x_beg_mem_src1; vec_ir = x->x_beg_mem_src2; n = x->x_size_src1; m = x->x_size_src2; } else// src1(t-tau) is impuls response { vec_sig = x->x_beg_mem_src2; vec_ir = x->x_beg_mem_src1; n = x->x_size_src2; m = x->x_size_src1; } vec_dst = x->x_beg_mem_dst; for(i=1; i0; i--, k++) { sum = 0.0f; for(j=1; j<=i; j++) sum += iemarray_getfloat(vec_sig, -j) * iemarray_getfloat(vec_ir, j+k); iemarray_setfloat(vec_dst, 0, sum); vec_dst++; } } else { if(x->x_size_src1 > x->x_size_src2)// src2(t-tau) is impuls response { vec_sig = x->x_beg_mem_src1; vec_ir = x->x_beg_mem_src2; n = x->x_size_src1; m = x->x_size_src2; } else// src1(t-tau) is impuls response { vec_sig = x->x_beg_mem_src2; vec_ir = x->x_beg_mem_src1; n = x->x_size_src2; m = x->x_size_src1; } vec_dst = x->x_beg_mem_dst; p = x->x_size_dst; q = 0; for(i=1; i= p) goto tab_conv_bang_end; } l = n - m + 1; for(i=0; i= p) goto tab_conv_bang_end; } for(i=m-1, k=0; i>0; i--, k++) { sum = 0.0f; for(j=1; j<=i; j++) sum += iemarray_getfloat(vec_sig, -j) * iemarray_getfloat(vec_ir, j+k); iemarray_setfloat(vec_dst, 0, sum); vec_dst++; q++; if(q >= p) goto tab_conv_bang_end; } for(i=m-1; i>0; i--) { sum = 0.0f; for(j=0, k=i-1; j= p) goto tab_conv_bang_end; } } tab_conv_bang_end: outlet_bang(x->x_obj.ob_outlet); a = (t_garray *)pd_findbyclass(x->x_sym_dst, garray_class); garray_redraw(a); } } static void tab_conv_list(t_tab_conv *x, t_symbol *s, int argc, t_atom *argv) { int beg_src1, beg_src2, beg_dst; int n_src1, n_src2; int i, j, k, l, m, n, p; int ok_src1, ok_src2, ok_dst; iemarray_t *vec_sig, *vec_ir, *vec_dst; t_float sum=0.0; if((argc >= 5) && IS_A_FLOAT(argv,0) && IS_A_FLOAT(argv,1) && IS_A_FLOAT(argv,2) && IS_A_FLOAT(argv,3) && IS_A_FLOAT(argv,4)) { beg_src1 = (int)atom_getintarg(0, argc, argv); beg_src2 = (int)atom_getintarg(1, argc, argv); beg_dst = (int)atom_getintarg(2, argc, argv); n_src1 = (int)atom_getintarg(3, argc, argv); n_src2 = (int)atom_getintarg(4, argc, argv); if(beg_src1 < 0) beg_src1 = 0; if(beg_src2 < 0) beg_src2 = 0; if(beg_dst < 0) beg_dst = 0; if(n_src1 < 0) n_src1 = 0; if(n_src2 < 0) n_src2 = 0; ok_src1 = iem_tab_check_arrays(gensym("tab_conv"), x->x_sym_scr1, &x->x_beg_mem_src1, &x->x_size_src1, beg_src1+n_src1); ok_src2 = iem_tab_check_arrays(gensym("tab_conv"), x->x_sym_scr2, &x->x_beg_mem_src2, &x->x_size_src2, beg_src2+n_src2); ok_dst = iem_tab_check_arrays(gensym("tab_conv"), x->x_sym_dst, &x->x_beg_mem_dst, &x->x_size_dst, beg_dst+n_src1); if(ok_src1 && ok_src2 && ok_dst) { t_garray *a; if((x->x_size_src1+x->x_size_src2-1) <= x->x_size_dst)// ok, the last part of dst is zero { if(x->x_size_src1 > x->x_size_src2)// src2(t-tau) is impuls response { vec_sig = x->x_beg_mem_src1; vec_ir = x->x_beg_mem_src2; n = x->x_size_src1; m = x->x_size_src2; } else// src1(t-tau) is impuls response { vec_sig = x->x_beg_mem_src2; vec_ir = x->x_beg_mem_src1; n = x->x_size_src2; m = x->x_size_src1; } vec_dst = x->x_beg_mem_dst; l = m - 1; for(i=0; i=0; i--) { sum = 0.0; for(j=0, k=i-1; jx_size_src1 > x->x_size_src2)// src2(t-tau) is impuls response { vec_sig = x->x_beg_mem_src1; vec_ir = x->x_beg_mem_src2; n = x->x_size_src1; m = x->x_size_src2; } else// src1(t-tau) is impuls response { vec_sig = x->x_beg_mem_src2; vec_ir = x->x_beg_mem_src1; n = x->x_size_src2; m = x->x_size_src1; } vec_dst = x->x_beg_mem_dst; p = x->x_size_dst; k = 0; l = m - 1; for(i=0; i= p) goto tab_conv_list_end; } l = n - m + 1; for(i=0; i= p) goto tab_conv_list_end; } l = m - 1; for(i=l-1; i>=0; i--) { sum = 0.0; for(j=0, k=i-1; j= p) goto tab_conv_list_end; } } tab_conv_list_end: outlet_bang(x->x_obj.ob_outlet); a = (t_garray *)pd_findbyclass(x->x_sym_dst, garray_class); garray_redraw(a); } } else { post("tab_conv-ERROR: list need 5 float arguments:"); post(" source1_offset + source2_offset + destination_offset + number_of_samples_to_convolute + convolution_window_width"); } } static void tab_conv_free(t_tab_conv *x) { } static void *tab_conv_new(t_symbol *s, int argc, t_atom *argv) { t_tab_conv *x = (t_tab_conv *)pd_new(tab_conv_class); t_symbol *src1, *src2, *dst; if((argc >= 3) && IS_A_SYMBOL(argv,0) && IS_A_SYMBOL(argv,1) && IS_A_SYMBOL(argv,2)) { src1 = (t_symbol *)atom_getsymbolarg(0, argc, argv); src2 = (t_symbol *)atom_getsymbolarg(1, argc, argv); dst = (t_symbol *)atom_getsymbolarg(2, argc, argv); } else if((argc >= 2) && IS_A_SYMBOL(argv,0) && IS_A_SYMBOL(argv,1)) { src1 = (t_symbol *)atom_getsymbolarg(0, argc, argv); dst = src1; src2 = (t_symbol *)atom_getsymbolarg(1, argc, argv); } else { post("tab_conv-ERROR: need 3 symbols arguments:"); post(" source1_array_name + source2_array_name + destination_array_name"); return(0); } x->x_sym_scr1 = src1; x->x_sym_scr2 = src2; x->x_sym_dst = dst; outlet_new(&x->x_obj, &s_bang); return(x); } void tab_conv_setup(void) { tab_conv_class = class_new(gensym("tab_conv"), (t_newmethod)tab_conv_new, (t_method)tab_conv_free, sizeof(t_tab_conv), 0, A_GIMME, 0); class_addbang(tab_conv_class, (t_method)tab_conv_bang); // class_addlist(tab_conv_class, (t_method)tab_conv_list); class_addmethod(tab_conv_class, (t_method)tab_conv_src1, gensym("src1"), A_DEFSYMBOL, 0); class_addmethod(tab_conv_class, (t_method)tab_conv_src2, gensym("src2"), A_DEFSYMBOL, 0); class_addmethod(tab_conv_class, (t_method)tab_conv_dst, gensym("dst"), A_DEFSYMBOL, 0); } iem_utils-v0.0.20180206/iem_tab/src/tab_gt_scalar.c0000644000175000017500000001177312630366350022021 0ustar zmoelnigzmoelnig/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_tab written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2009 */ #include "m_pd.h" #include "iemlib.h" #include "iem_tab.h" /* -------------------------- tab_gt_scalar ------------------------------ */ /* if(x_beg_mem_src1[i] > compare) */ /* x_beg_mem_dst[i] = 1.0f; */ /* else */ /* x_beg_mem_dst[i] += 0.0f; */ typedef struct _tab_gt_scalar { t_object x_obj; int x_size_src1; int x_size_dst; int x_offset_src1; int x_offset_dst; iemarray_t *x_beg_mem_src1; iemarray_t *x_beg_mem_dst; t_symbol *x_sym_scr1; t_symbol *x_sym_dst; } t_tab_gt_scalar; static t_class *tab_gt_scalar_class; static void tab_gt_scalar_src(t_tab_gt_scalar *x, t_symbol *s) { x->x_sym_scr1 = s; } static void tab_gt_scalar_float(t_tab_gt_scalar *x, t_floatarg compare) { int i, n; int ok_src1, ok_dst; iemarray_t *vec_src1, *vec_dst; ok_src1 = iem_tab_check_arrays(gensym("tab_gt_scalar"), x->x_sym_scr1, &x->x_beg_mem_src1, &x->x_size_src1, 0); ok_dst = iem_tab_check_arrays(gensym("tab_gt_scalar"), x->x_sym_dst, &x->x_beg_mem_dst, &x->x_size_dst, 0); if(ok_src1 && ok_dst) { if(x->x_size_src1 < x->x_size_dst) n = x->x_size_src1; else n = x->x_size_dst; vec_src1 = x->x_beg_mem_src1; vec_dst = x->x_beg_mem_dst; if(n) { t_garray *a; for(i=0; i compare) iemarray_setfloat(vec_dst, i, 1.0f); else iemarray_setfloat(vec_dst, i, 0.0f); } outlet_bang(x->x_obj.ob_outlet); a = (t_garray *)pd_findbyclass(x->x_sym_dst, garray_class); garray_redraw(a); } } } static void tab_gt_scalar_dst(t_tab_gt_scalar *x, t_symbol *s) { x->x_sym_dst = s; } static void tab_gt_scalar_list(t_tab_gt_scalar *x, t_symbol *s, int argc, t_atom *argv) { int beg_src1, beg_dst; int i, n; int ok_src1, ok_dst; t_float compare; iemarray_t *vec_src1, *vec_dst; if((argc >= 4) && IS_A_FLOAT(argv,0) && IS_A_FLOAT(argv,1) && IS_A_FLOAT(argv,2) && IS_A_FLOAT(argv,3)) { beg_src1 = (int)atom_getintarg(0, argc, argv); beg_dst = (int)atom_getintarg(1, argc, argv); n = (int)atom_getintarg(2, argc, argv); compare = (t_float)atom_getfloatarg(3, argc, argv); if(beg_src1 < 0) beg_src1 = 0; if(beg_dst < 0) beg_dst = 0; if(n < 0) n = 0; ok_src1 = iem_tab_check_arrays(gensym("tab_gt_scalar"), x->x_sym_scr1, &x->x_beg_mem_src1, &x->x_size_src1, beg_src1+n); ok_dst = iem_tab_check_arrays(gensym("tab_gt_scalar"), x->x_sym_dst, &x->x_beg_mem_dst, &x->x_size_dst, beg_dst+n); if(ok_src1 && ok_dst) { vec_src1 = x->x_beg_mem_src1 + beg_src1; vec_dst = x->x_beg_mem_dst + beg_dst; if(n) { t_garray *a; for(i=0; i compare) iemarray_setfloat(vec_dst, i, 1.0f); else iemarray_setfloat(vec_dst, i, 0.0f); } outlet_bang(x->x_obj.ob_outlet); a = (t_garray *)pd_findbyclass(x->x_sym_dst, garray_class); garray_redraw(a); } } } else { post("tab_gt_scalar-ERROR: list need 4 float arguments:"); post(" source1_offset + destination_offset + number_of_samples_to_compare + compare_scalar"); } } static void tab_gt_scalar_free(t_tab_gt_scalar *x) { } static void *tab_gt_scalar_new(t_symbol *s, int argc, t_atom *argv) { t_tab_gt_scalar *x = (t_tab_gt_scalar *)pd_new(tab_gt_scalar_class); t_symbol *src1, *dst; if((argc >= 2) && IS_A_SYMBOL(argv,0) && IS_A_SYMBOL(argv,1)) { src1 = (t_symbol *)atom_getsymbolarg(0, argc, argv); dst = (t_symbol *)atom_getsymbolarg(1, argc, argv); } else if((argc >= 1) && IS_A_SYMBOL(argv,0)) { src1 = (t_symbol *)atom_getsymbolarg(0, argc, argv); dst = src1; } else { post("tab_gt_scalar-ERROR: need 2 symbol arguments:"); post(" source_array_name + destination_array_name"); return(0); } x->x_sym_scr1 = src1; x->x_sym_dst = dst; outlet_new(&x->x_obj, &s_bang); return(x); } void tab_gt_scalar_setup(void) { tab_gt_scalar_class = class_new(gensym("tab_gt_scalar"), (t_newmethod)tab_gt_scalar_new, (t_method)tab_gt_scalar_free, sizeof(t_tab_gt_scalar), 0, A_GIMME, 0); class_addfloat(tab_gt_scalar_class, (t_method)tab_gt_scalar_float); class_addlist(tab_gt_scalar_class, (t_method)tab_gt_scalar_list); class_addmethod(tab_gt_scalar_class, (t_method)tab_gt_scalar_src, gensym("src1"), A_DEFSYMBOL, 0); class_addmethod(tab_gt_scalar_class, (t_method)tab_gt_scalar_src, gensym("src"), A_DEFSYMBOL, 0); class_addmethod(tab_gt_scalar_class, (t_method)tab_gt_scalar_dst, gensym("dst"), A_DEFSYMBOL, 0); // class_sethelpsymbol(tab_gt_scalar_class, gensym("iemhelp2/tab_gt_scalar-help")); } iem_utils-v0.0.20180206/iem_tab/src/tab_min_index.c0000644000175000017500000000741312630366350022030 0ustar zmoelnigzmoelnig/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_tab written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2009 */ #include "m_pd.h" #include "iemlib.h" #include "iem_tab.h" /* -------------------------- tab_min_index ------------------------------ */ typedef struct _tab_min_index { t_object x_obj; int x_size_src1; int x_offset_src1; iemarray_t *x_beg_mem_src1; t_symbol *x_sym_scr1; void *x_bang_out; void *x_min_out; void *x_min_index_out; } t_tab_min_index; static t_class *tab_min_index_class; static void tab_min_index_src(t_tab_min_index *x, t_symbol *s) { x->x_sym_scr1 = s; } static void tab_min_index_bang(t_tab_min_index *x) { int i, n; int ok_src, min_index=0; iemarray_t *vec_src; t_float min=1.0e37; ok_src = iem_tab_check_arrays(gensym("tab_min_index"), x->x_sym_scr1, &x->x_beg_mem_src1, &x->x_size_src1, 0); if(ok_src) { n = x->x_size_src1; vec_src = x->x_beg_mem_src1; if(n) { for(i=0; ix_min_out, min); outlet_float(x->x_min_index_out, (t_float)min_index); outlet_bang(x->x_bang_out); } } } static void tab_min_index_list(t_tab_min_index *x, t_symbol *s, int argc, t_atom *argv) { int beg_src; int i, n; int ok_src, min_index=0; iemarray_t *vec_src; t_float min=1.0e37; if((argc >= 2) && IS_A_FLOAT(argv,0) && IS_A_FLOAT(argv,1)) { beg_src = (int)atom_getintarg(0, argc, argv); n = (int)atom_getintarg(1, argc, argv); if(beg_src < 0) beg_src = 0; if(n < 0) n = 0; ok_src = iem_tab_check_arrays(gensym("tab_min_index"), x->x_sym_scr1, &x->x_beg_mem_src1, &x->x_size_src1, beg_src+n); if(ok_src) { vec_src = x->x_beg_mem_src1 + beg_src; if(n) { for(i=0; ix_min_out, min); outlet_float(x->x_min_index_out, (t_float)min_index); outlet_bang(x->x_bang_out); } } } else { post("tab_min_index-ERROR: list need 2 float arguments:"); post(" source_offset + number_of_samples_to_calc_min_index"); } } static void tab_min_index_free(t_tab_min_index *x) { } static void *tab_min_index_new(t_symbol *s, int argc, t_atom *argv) { t_tab_min_index *x = (t_tab_min_index *)pd_new(tab_min_index_class); t_symbol *src; if((argc >= 1) && IS_A_SYMBOL(argv,0)) { src = (t_symbol *)atom_getsymbolarg(0, argc, argv); } else { post("tab_min_index-ERROR: need 1 symbol argument:"); post(" source_array_name"); return(0); } x->x_sym_scr1 = src; x->x_bang_out = outlet_new(&x->x_obj, &s_bang); x->x_min_index_out = outlet_new(&x->x_obj, &s_float); x->x_min_out = outlet_new(&x->x_obj, &s_float); return(x); } void tab_min_index_setup(void) { tab_min_index_class = class_new(gensym("tab_min_index"), (t_newmethod)tab_min_index_new, (t_method)tab_min_index_free, sizeof(t_tab_min_index), 0, A_GIMME, 0); class_addbang(tab_min_index_class, (t_method)tab_min_index_bang); class_addlist(tab_min_index_class, (t_method)tab_min_index_list); class_addmethod(tab_min_index_class, (t_method)tab_min_index_src, gensym("src"), A_DEFSYMBOL, 0); class_addmethod(tab_min_index_class, (t_method)tab_min_index_src, gensym("src1"), A_DEFSYMBOL, 0); // class_sethelpsymbol(tab_min_index_class, gensym("iemhelp2/tab_min_index-help")); } iem_utils-v0.0.20180206/iem_tab/src/tab_find_peaks.c0000644000175000017500000002702012630366350022155 0ustar zmoelnigzmoelnig/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_tab written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2009 */ #include "m_pd.h" #include "iemlib.h" #include "iem_tab.h" /* -------------------------- tab_find_peaks ------------------------------ */ #define IEMLIB_TAB_FIND_PEAKS_SORT_MODE_AMP 0 #define IEMLIB_TAB_FIND_PEAKS_SORT_MODE_FREQ 1 typedef struct _tab_find_peaks { t_object x_obj; int x_size_src1; int x_offset_src1; iemarray_t *x_beg_mem_src1; int x_work_alloc; int *x_beg_mem_work1; t_float *x_beg_mem_work2; int x_sort_mode; t_float x_hdiff; int x_min_width; int x_max_width; int x_n_peaks; t_symbol *x_sym_scr1; t_outlet *x_bang_out; t_outlet *x_sort_index_out; t_outlet *x_peak_value_out; t_outlet *x_peak_index_out; } t_tab_find_peaks; static t_class *tab_find_peaks_class; static void tab_find_peaks_max_peaks(t_tab_find_peaks *x, t_floatarg fmax_peaks) { int max_peaks = (int)fmax_peaks; if(max_peaks <= 0) max_peaks = 1; x->x_n_peaks = max_peaks; } static void tab_find_peaks_width_range(t_tab_find_peaks *x, t_symbol *s, int argc, t_atom *argv) { int minw, maxw, h; if((argc >= 2) && IS_A_FLOAT(argv,0) && IS_A_FLOAT(argv,1)) { minw = (int)atom_getintarg(0, argc, argv); maxw = (int)atom_getintarg(1, argc, argv); if(minw <= 0) minw = 1; if(maxw <= 0) maxw = 1; if(minw > maxw) { h = minw; minw = maxw; maxw = h; } x->x_min_width = minw; x->x_max_width = maxw; } } static void tab_find_peaks_abs_min_height_diff(t_tab_find_peaks *x, t_floatarg height_diff) { if(height_diff < 0.0f) height_diff *= -1.0f; x->x_hdiff = height_diff; } static void tab_find_peaks_amp_sort(t_tab_find_peaks *x) { x->x_sort_mode = IEMLIB_TAB_FIND_PEAKS_SORT_MODE_AMP; } static void tab_find_peaks_freq_sort(t_tab_find_peaks *x) { x->x_sort_mode = IEMLIB_TAB_FIND_PEAKS_SORT_MODE_FREQ; } static void tab_find_peaks_src(t_tab_find_peaks *x, t_symbol *s) { x->x_sym_scr1 = s; } static void tab_find_peaks_bang(t_tab_find_peaks *x) { int i, n, w, ww; int ok_src, peak_index=0; iemarray_t *vec_src; t_float *vec_work2; int *vec_work1; t_float max=-1.0e37; int max_peaks=x->x_n_peaks; int min_width=x->x_min_width; int max_width=x->x_max_width; t_float abs_min_height_diff=x->x_hdiff; ok_src = iem_tab_check_arrays(gensym("tab_find_peaks"), x->x_sym_scr1, &x->x_beg_mem_src1, &x->x_size_src1, 0); if(ok_src) { n = x->x_size_src1; if(n) { if(!x->x_work_alloc) { x->x_beg_mem_work1 = (int *)getbytes(n * sizeof(int)); x->x_beg_mem_work2 = (t_float *)getbytes(n * sizeof(t_float)); x->x_work_alloc = n; } else if(n != x->x_work_alloc) { x->x_beg_mem_work1 = (int *)resizebytes(x->x_beg_mem_work1, x->x_work_alloc*sizeof(int), n*sizeof(int)); x->x_beg_mem_work2 = (t_float *)resizebytes(x->x_beg_mem_work2, x->x_work_alloc*sizeof(t_float), n*sizeof(t_float)); x->x_work_alloc = n; } vec_src = x->x_beg_mem_src1; vec_work1 = x->x_beg_mem_work1; vec_work2 = x->x_beg_mem_work2; if(x->x_sort_mode == IEMLIB_TAB_FIND_PEAKS_SORT_MODE_FREQ) // FREQ_SORT BEGIN { int sort_index=1,old=0,j; for(i=0; ix_peak_value_out, iemarray_getfloat(vec_src, i)); outlet_float(x->x_peak_index_out, (t_float)peak_index); outlet_float(x->x_sort_index_out, sort_index); sort_index++; } else i = n+1; } old = vec_work1[i]; } outlet_bang(x->x_bang_out); } // FREQ_SORT END else if(x->x_sort_mode == IEMLIB_TAB_FIND_PEAKS_SORT_MODE_AMP) // AMP_SORT BEGIN { int sort_index=1,old=0,j; for(i=0; i max) { max = vec_work2[i]; peak_index = i; } } } if(peak_index >= 0) { outlet_float(x->x_peak_value_out, max); outlet_float(x->x_peak_index_out, (t_float)peak_index); outlet_float(x->x_sort_index_out, sort_index); vec_work1[peak_index] = 0; vec_work2[peak_index] = 0.0f; j=peak_index+1; while(vec_work1[j]) { vec_work1[j] = 0; j++; } j=peak_index-1; while(vec_work1[j]) { vec_work1[j] = 0; j--; } } else sort_index = max_peaks+1; } outlet_bang(x->x_bang_out); } } // AMP_SORT END } /* [n] zu [n-1] u. [n+1] (ww=0)(w=1)(beg=1)(end=n-1) [n-1] u. [n] zu [n-2] u. [n+1] (ww=0)(w=2)(beg=2)(end=n-1) [n] u. [n+1] zu [n-1] u. [n+2] (ww=1)(w=2)(beg=1)(end=n-2) [n-2] u. [n-1] u. [n] zu [n-3] u. [n+1] (ww=0)(w=3)(beg=3)(end=n-1) [n-1] u. [n] u. [n+1] zu [n-2] u. [n+2] (ww=1)(w=3)(beg=2)(end=n-2) [n] u. [n+1] u. [n+2] zu [n-1] u. [n+3] (ww=2)(w=3)(beg=1)(end=n-3) */ } /*static void tab_find_peaks_list(t_tab_find_peaks *x, t_symbol *s, int argc, t_atom *argv) { int beg_src; int i, n; int ok_src, max_index=0; t_float *vec_src; t_float max=-1.0e37; if((argc >= 2) && IS_A_FLOAT(argv,0) && IS_A_FLOAT(argv,1)) { beg_src = (int)atom_getintarg(0, argc, argv); n = (int)atom_getintarg(1, argc, argv); if(beg_src < 0) beg_src = 0; if(n < 0) n = 0; ok_src = iem_tab_check_arrays(gensym("tab_find_peaks"), x->x_sym_scr1, &x->x_beg_mem_src1, &x->x_size_src1, beg_src+n); if(ok_src) { vec_src = x->x_beg_mem_src1 + beg_src; if(n) { for(i=0; i max) { max = vec_src[i]; max_index = i + beg_src; } } outlet_float(x->x_peak_value_out, max); outlet_float(x->x_peak_index_out, (t_float)max_index); outlet_bang(x->x_bang_out); } } } else { post("tab_find_peaks-ERROR: list need 2 float arguments:"); post(" source_offset + number_of_samples_to_calc_max_index"); } }*/ static void tab_find_peaks_free(t_tab_find_peaks *x) { if(x->x_work_alloc) { freebytes(x->x_beg_mem_work1, x->x_work_alloc * sizeof(int)); freebytes(x->x_beg_mem_work2, x->x_work_alloc * sizeof(t_float)); } } static void *tab_find_peaks_new(t_symbol *s, int argc, t_atom *argv) { t_tab_find_peaks *x = (t_tab_find_peaks *)pd_new(tab_find_peaks_class); t_symbol *src; if((argc >= 1) && IS_A_SYMBOL(argv,0)) { src = (t_symbol *)atom_getsymbolarg(0, argc, argv); } else { post("tab_find_peaks-ERROR: need 1 symbol argument:"); post(" source_array_name"); return(0); } x->x_work_alloc = 0; x->x_beg_mem_work1 = (int *)0; x->x_beg_mem_work2 = (t_float *)0; x->x_sym_scr1 = src; x->x_bang_out = (t_outlet *)outlet_new(&x->x_obj, &s_bang); // ready x->x_sort_index_out = (t_outlet *)outlet_new(&x->x_obj, &s_float); // sort index x->x_peak_index_out = (t_outlet *)outlet_new(&x->x_obj, &s_float); // freq x->x_peak_value_out = (t_outlet *)outlet_new(&x->x_obj, &s_float); // value return(x); } void tab_find_peaks_setup(void) { tab_find_peaks_class = class_new(gensym("tab_find_peaks"), (t_newmethod)tab_find_peaks_new, (t_method)tab_find_peaks_free, sizeof(t_tab_find_peaks), 0, A_GIMME, 0); class_addbang(tab_find_peaks_class, (t_method)tab_find_peaks_bang); /*class_addlist(tab_find_peaks_class, (t_method)tab_find_peaks_list);*/ class_addmethod(tab_find_peaks_class, (t_method)tab_find_peaks_src, gensym("src"), A_DEFSYMBOL, 0); class_addmethod(tab_find_peaks_class, (t_method)tab_find_peaks_src, gensym("src1"), A_DEFSYMBOL, 0); class_addmethod(tab_find_peaks_class, (t_method)tab_find_peaks_max_peaks, gensym("max_peaks"), A_DEFFLOAT, 0); class_addmethod(tab_find_peaks_class, (t_method)tab_find_peaks_width_range, gensym("width_range"), A_GIMME, 0); class_addmethod(tab_find_peaks_class, (t_method)tab_find_peaks_abs_min_height_diff, gensym("abs_min_height_diff"), A_DEFFLOAT, 0); class_addmethod(tab_find_peaks_class, (t_method)tab_find_peaks_amp_sort, gensym("amp_sort"), 0); class_addmethod(tab_find_peaks_class, (t_method)tab_find_peaks_freq_sort, gensym("freq_sort"), 0); // class_sethelpsymbol(tab_find_peaks_class, gensym("iemhelp2/tab_find_peaks-help")); } iem_utils-v0.0.20180206/iem_tab/src/tab_powtodb.c0000644000175000017500000001161212630366350021530 0ustar zmoelnigzmoelnig/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_tab written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2010 */ #include "m_pd.h" #include "iemlib.h" #include "iem_tab.h" #include #define IEMTABLOGTEN 2.302585092994046 /* -------------------------- tab_powtodb ------------------------------ */ /* x_beg_mem_dst[i] = sqrt(x_beg_mem_src1[i]) */ typedef struct _tab_powtodb { t_object x_obj; int x_size_src1; int x_size_dst; int x_offset_src1; int x_offset_dst; iemarray_t *x_beg_mem_src1; iemarray_t *x_beg_mem_dst; t_symbol *x_sym_scr1; t_symbol *x_sym_dst; } t_tab_powtodb; static t_class *tab_powtodb_class; static void tab_powtodb_src(t_tab_powtodb *x, t_symbol *s) { x->x_sym_scr1 = s; } static void tab_powtodb_dst(t_tab_powtodb *x, t_symbol *s) { x->x_sym_dst = s; } static void tab_powtodb_bang(t_tab_powtodb *x) { int i, n; int ok_src, ok_dst; iemarray_t *vec_src, *vec_dst; ok_src = iem_tab_check_arrays(gensym("tab_powtodb"), x->x_sym_scr1, &x->x_beg_mem_src1, &x->x_size_src1, 0); ok_dst = iem_tab_check_arrays(gensym("tab_powtodb"), x->x_sym_dst, &x->x_beg_mem_dst, &x->x_size_dst, 0); if(ok_src && ok_dst) { if(x->x_size_src1 < x->x_size_dst) n = x->x_size_src1; else n = x->x_size_dst; vec_src = x->x_beg_mem_src1; vec_dst = x->x_beg_mem_dst; if(n) { t_garray *a; for(i=0; ix_obj.ob_outlet); a = (t_garray *)pd_findbyclass(x->x_sym_dst, garray_class); garray_redraw(a); } } } static void tab_powtodb_list(t_tab_powtodb *x, t_symbol *s, int argc, t_atom *argv) { int beg_src, beg_dst; int i, n; int ok_src, ok_dst; iemarray_t *vec_src, *vec_dst; if((argc >= 3) && IS_A_FLOAT(argv,0) && IS_A_FLOAT(argv,1) && IS_A_FLOAT(argv,2)) { beg_src = (int)atom_getintarg(0, argc, argv); beg_dst = (int)atom_getintarg(1, argc, argv); n = (int)atom_getintarg(2, argc, argv); if(beg_src < 0) beg_src = 0; if(beg_dst < 0) beg_dst = 0; if(n < 0) n = 0; ok_src = iem_tab_check_arrays(gensym("tab_powtodb"), x->x_sym_scr1, &x->x_beg_mem_src1, &x->x_size_src1, beg_src+n); ok_dst = iem_tab_check_arrays(gensym("tab_powtodb"), x->x_sym_dst, &x->x_beg_mem_dst, &x->x_size_dst, beg_dst+n); if(ok_src && ok_dst) { vec_src = x->x_beg_mem_src1 + beg_src; vec_dst = x->x_beg_mem_dst + beg_dst; if(n) { t_garray *a; for(i=0; ix_obj.ob_outlet); a = (t_garray *)pd_findbyclass(x->x_sym_dst, garray_class); garray_redraw(a); } } } else { post("tab_powtodb-ERROR: list need 3 float arguments:"); post(" source_offset + destination_offset + number_of_samples_to_sqrt"); } } static void tab_powtodb_free(t_tab_powtodb *x) { } static void *tab_powtodb_new(t_symbol *s, int argc, t_atom *argv) { t_tab_powtodb *x = (t_tab_powtodb *)pd_new(tab_powtodb_class); t_symbol *src, *dst; if((argc >= 2) && IS_A_SYMBOL(argv,0) && IS_A_SYMBOL(argv,1)) { src = (t_symbol *)atom_getsymbolarg(0, argc, argv); dst = (t_symbol *)atom_getsymbolarg(1, argc, argv); } else if((argc >= 1) && IS_A_SYMBOL(argv,0)) { src = (t_symbol *)atom_getsymbolarg(0, argc, argv); dst = src; } else { post("tab_powtodb-ERROR: need 2 symbols arguments:"); post(" source_array_name + destination_array_name"); return(0); } x->x_sym_scr1 = src; x->x_sym_dst = dst; outlet_new(&x->x_obj, &s_bang); return(x); } void tab_powtodb_setup(void) { tab_powtodb_class = class_new(gensym("tab_powtodb"), (t_newmethod)tab_powtodb_new, (t_method)tab_powtodb_free, sizeof(t_tab_powtodb), 0, A_GIMME, 0); class_addbang(tab_powtodb_class, (t_method)tab_powtodb_bang); class_addlist(tab_powtodb_class, (t_method)tab_powtodb_list); class_addmethod(tab_powtodb_class, (t_method)tab_powtodb_src, gensym("src"), A_DEFSYMBOL, 0); class_addmethod(tab_powtodb_class, (t_method)tab_powtodb_src, gensym("src1"), A_DEFSYMBOL, 0); class_addmethod(tab_powtodb_class, (t_method)tab_powtodb_dst, gensym("dst"), A_DEFSYMBOL, 0); } iem_utils-v0.0.20180206/iem_tab/src/makefile_d_fat0000644000175000017500000000265712630366350021726 0ustar zmoelnigzmoelnigcurrent: all .SUFFIXES: .d_fat PD_INSTALL_PATH = "/Applications/Pd.app/Contents/Resources" INCLUDE = -I. -I$(PD_INSTALL_PATH)/src CFLAGS =-DPD -O2 -Wall -W -Wshadow -Wstrict-prototypes \ -Wno-unused -Wno-parentheses -Wno-switch LFLAGS = -bundle -undefined suppress -flat_namespace # the sources SRC = \ tab_abs.c \ tab_add.c \ tab_add_scalar.c \ tab_carth2polar.c \ tab_complex_inv.c \ tab_complex_mul.c \ tab_const.c \ tab_conv.c \ tab_copy.c \ tab_counter.c \ tab_cross_corr.c \ tab_dbtopow.c \ tab_dbtorms.c \ tab_div.c \ tab_eq.c \ tab_eq_scalar.c \ tab_fft.c \ tab_find_exact_peaks.c \ tab_find_peaks.c \ tab_ge.c \ tab_ge_scalar.c \ tab_gt.c \ tab_gt_scalar.c \ tab_get_size.c \ tab_ifft.c \ tab_le.c \ tab_le_scalar.c \ tab_lt.c \ tab_lt_scalar.c \ tab_max_index.c \ tab_min_index.c \ tab_min_max.c \ tab_mul.c \ tab_mul_scalar.c \ tab_ne.c \ tab_ne_scalar.c \ tab_powtodb.c \ tab_reverse.c \ tab_rfft.c \ tab_rifft.c \ tab_rmstodb.c \ tab_sqrt.c \ tab_sub.c \ tab_sum.c \ iem_tab.c TARGET = iem_tab.d_fat OBJ = $(SRC:.c=.o) # # ------------------ targets ------------------------------------ # clean: rm ../$(TARGET) rm *.o all: $(OBJ) @echo :: $(OBJ) $(CC) -arch i386 -arch ppc $(LFLAGS) -o $(TARGET) *.o strip -S -x $(TARGET) mv $(TARGET) .. $(OBJ) : %.o : %.c touch $*.c $(CC) -arch i386 -arch ppc $(CFLAGS) $(INCLUDE) -c -o $*.o $*.c iem_utils-v0.0.20180206/iem_tab/src/iem_tab.h0000644000175000017500000000072412630366350020633 0ustar zmoelnigzmoelnig/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_tab written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2009 */ #ifndef __IEMTAB_H__ #define __IEMTAB_H__ typedef struct { t_float real; t_float imag; } TAB_COMPLEX; int iem_tab_check_arrays(t_symbol *obj_name, t_symbol *array_name, iemarray_t **beg_mem, int *array_size, int max_index); #endif iem_utils-v0.0.20180206/iem_tab/src/tab_ne_scalar.c0000644000175000017500000001177612630366350022014 0ustar zmoelnigzmoelnig/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_tab written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2009 */ #include "m_pd.h" #include "iemlib.h" #include "iem_tab.h" /* -------------------------- tab_ne_scalar ------------------------------ */ /* if(x_beg_mem_src1[i] != compare) */ /* x_beg_mem_dst[i] = 1.0f; */ /* else */ /* x_beg_mem_dst[i] += 0.0f; */ typedef struct _tab_ne_scalar { t_object x_obj; int x_size_src1; int x_size_dst; int x_offset_src1; int x_offset_dst; iemarray_t *x_beg_mem_src1; iemarray_t *x_beg_mem_dst; t_symbol *x_sym_scr1; t_symbol *x_sym_dst; } t_tab_ne_scalar; static t_class *tab_ne_scalar_class; static void tab_ne_scalar_src(t_tab_ne_scalar *x, t_symbol *s) { x->x_sym_scr1 = s; } static void tab_ne_scalar_float(t_tab_ne_scalar *x, t_floatarg compare) { int i, n; int ok_src1, ok_dst; iemarray_t *vec_src1, *vec_dst; ok_src1 = iem_tab_check_arrays(gensym("tab_ne_scalar"), x->x_sym_scr1, &x->x_beg_mem_src1, &x->x_size_src1, 0); ok_dst = iem_tab_check_arrays(gensym("tab_ne_scalar"), x->x_sym_dst, &x->x_beg_mem_dst, &x->x_size_dst, 0); if(ok_src1 && ok_dst) { if(x->x_size_src1 < x->x_size_dst) n = x->x_size_src1; else n = x->x_size_dst; vec_src1 = x->x_beg_mem_src1; vec_dst = x->x_beg_mem_dst; if(n) { t_garray *a; for(i=0; ix_obj.ob_outlet); a = (t_garray *)pd_findbyclass(x->x_sym_dst, garray_class); garray_redraw(a); } } } static void tab_ne_scalar_dst(t_tab_ne_scalar *x, t_symbol *s) { x->x_sym_dst = s; } static void tab_ne_scalar_list(t_tab_ne_scalar *x, t_symbol *s, int argc, t_atom *argv) { int beg_src1, beg_dst; int i, n; int ok_src1, ok_dst; t_float compare; iemarray_t *vec_src1, *vec_dst; if((argc >= 4) && IS_A_FLOAT(argv,0) && IS_A_FLOAT(argv,1) && IS_A_FLOAT(argv,2) && IS_A_FLOAT(argv,3)) { beg_src1 = (int)atom_getintarg(0, argc, argv); beg_dst = (int)atom_getintarg(1, argc, argv); n = (int)atom_getintarg(2, argc, argv); compare = (t_float)atom_getfloatarg(3, argc, argv); if(beg_src1 < 0) beg_src1 = 0; if(beg_dst < 0) beg_dst = 0; if(n < 0) n = 0; ok_src1 = iem_tab_check_arrays(gensym("tab_ne_scalar"), x->x_sym_scr1, &x->x_beg_mem_src1, &x->x_size_src1, beg_src1+n); ok_dst = iem_tab_check_arrays(gensym("tab_ne_scalar"), x->x_sym_dst, &x->x_beg_mem_dst, &x->x_size_dst, beg_dst+n); if(ok_src1 && ok_dst) { vec_src1 = x->x_beg_mem_src1 + beg_src1; vec_dst = x->x_beg_mem_dst + beg_dst; if(n) { t_garray *a; for(i=0; ix_obj.ob_outlet); a = (t_garray *)pd_findbyclass(x->x_sym_dst, garray_class); garray_redraw(a); } } } else { post("tab_ne_scalar-ERROR: list need 4 float arguments:"); post(" source1_offset + destination_offset + number_of_samples_to_compare + compare_scalar"); } } static void tab_ne_scalar_free(t_tab_ne_scalar *x) { } static void *tab_ne_scalar_new(t_symbol *s, int argc, t_atom *argv) { t_tab_ne_scalar *x = (t_tab_ne_scalar *)pd_new(tab_ne_scalar_class); t_symbol *src1, *dst; if((argc >= 2) && IS_A_SYMBOL(argv,0) && IS_A_SYMBOL(argv,1)) { src1 = (t_symbol *)atom_getsymbolarg(0, argc, argv); dst = (t_symbol *)atom_getsymbolarg(1, argc, argv); } else if((argc >= 1) && IS_A_SYMBOL(argv,0)) { src1 = (t_symbol *)atom_getsymbolarg(0, argc, argv); dst = src1; } else { post("tab_ne_scalar-ERROR: need 2 symbol arguments:"); post(" source_array_name + destination_array_name"); return(0); } x->x_sym_scr1 = src1; x->x_sym_dst = dst; outlet_new(&x->x_obj, &s_bang); return(x); } void tab_ne_scalar_setup(void) { tab_ne_scalar_class = class_new(gensym("tab_ne_scalar"), (t_newmethod)tab_ne_scalar_new, (t_method)tab_ne_scalar_free, sizeof(t_tab_ne_scalar), 0, A_GIMME, 0); class_addfloat(tab_ne_scalar_class, (t_method)tab_ne_scalar_float); class_addlist(tab_ne_scalar_class, (t_method)tab_ne_scalar_list); class_addmethod(tab_ne_scalar_class, (t_method)tab_ne_scalar_src, gensym("src1"), A_DEFSYMBOL, 0); class_addmethod(tab_ne_scalar_class, (t_method)tab_ne_scalar_src, gensym("src"), A_DEFSYMBOL, 0); class_addmethod(tab_ne_scalar_class, (t_method)tab_ne_scalar_dst, gensym("dst"), A_DEFSYMBOL, 0); // class_sethelpsymbol(tab_ne_scalar_class, gensym("iemhelp2/tab_ne_scalar-help")); } iem_utils-v0.0.20180206/iem_tab/src/VC9/0000755000175000017500000000000012630366350017460 5ustar zmoelnigzmoelnigiem_utils-v0.0.20180206/iem_tab/src/VC9/makefile_vc9proj0000644000175000017500000000307212630366350022636 0ustar zmoelnigzmoelnigTARGET = iem_tab all: ..\$(TARGET).dll VIS_CPP_PATH = "C:\Program Files\Microsoft Visual Studio 9.0\VC" VIS_SDK_PATH = "C:\Program Files\Microsoft SDKs\Windows\v6.0A" PD_INST_PATH = "C:\Program Files\pd-0.43.0" PD_WIN_INCLUDE_PATH = /I. /I$(PD_INST_PATH)\src /I$(VIS_CPP_PATH)\include PD_WIN_C_FLAGS = /nologo /W3 /WX /DMSW /DNT /DPD /DWIN32 /DWINDOWS /Ox -D_CRT_SECURE_NO_WARNINGS PD_WIN_L_FLAGS = /nologo PD_WIN_LIB = /NODEFAULTLIB:libcmt /NODEFAULTLIB:oldnames /NODEFAULTLIB:kernel32 \ $(VIS_CPP_PATH)\lib\libcmt.lib \ $(VIS_CPP_PATH)\lib\oldnames.lib \ $(VIS_SDK_PATH)\lib\kernel32.lib \ $(PD_INST_PATH)\bin\pd.lib SRC = tab_abs.c \ tab_add.c \ tab_add_scalar.c \ tab_carth2polar.c \ tab_complex_inv.c \ tab_complex_mul.c \ tab_const.c \ tab_conv.c \ tab_copy.c \ tab_counter.c \ tab_cross_corr.c \ tab_div.c \ tab_eq.c \ tab_eq_scalar.c \ tab_fft.c \ tab_find_exact_peaks.c \ tab_find_peaks.c \ tab_ge.c \ tab_ge_scalar.c \ tab_gt.c \ tab_gt_scalar.c \ tab_get_size.c \ tab_ifft.c \ tab_le.c \ tab_le_scalar.c \ tab_lt.c \ tab_lt_scalar.c \ tab_max_index.c \ tab_min_index.c \ tab_min_max.c \ tab_mul.c \ tab_mul_scalar.c \ tab_ne.c \ tab_ne_scalar.c \ tab_reverse.c \ tab_rfft.c \ tab_rifft.c \ tab_sqrt.c \ tab_sub.c \ tab_sum.c \ iem_tab.c OBJ = $(SRC:.c=.obj) .c.obj: cl $(PD_WIN_C_FLAGS) $(PD_WIN_INCLUDE_PATH) /c $*.c ..\$(TARGET).dll: $(OBJ) link $(PD_WIN_L_FLAGS) /dll /export:$(TARGET)_setup \ /out:..\$(TARGET).dll $(OBJ) $(PD_WIN_LIB) clean: del *.obj iem_utils-v0.0.20180206/iem_tab/src/VC9/iem_tab.vcproj0000644000175000017500000000356512630366350022316 0ustar zmoelnigzmoelnig iem_utils-v0.0.20180206/iem_tab/src/VC9/iem_tab.sln0000644000175000017500000000155712630366350021606 0ustar zmoelnigzmoelnig Microsoft Visual Studio Solution File, Format Version 10.00 # Visual Studio 2008 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "iem_tab", "iem_tab.vcproj", "{6A44952F-0D55-44EE-9032-928368583BEC}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Win32 = Debug|Win32 Release|Win32 = Release|Win32 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {6A44952F-0D55-44EE-9032-928368583BEC}.Debug|Win32.ActiveCfg = Debug|Win32 {6A44952F-0D55-44EE-9032-928368583BEC}.Debug|Win32.Build.0 = Debug|Win32 {6A44952F-0D55-44EE-9032-928368583BEC}.Release|Win32.ActiveCfg = Release|Win32 {6A44952F-0D55-44EE-9032-928368583BEC}.Release|Win32.Build.0 = Release|Win32 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection EndGlobal iem_utils-v0.0.20180206/iem_tab/src/tab_eq_scalar.c0000644000175000017500000001177612630366350022017 0ustar zmoelnigzmoelnig/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_tab written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2009 */ #include "m_pd.h" #include "iemlib.h" #include "iem_tab.h" /* -------------------------- tab_eq_scalar ------------------------------ */ /* if(x_beg_mem_src1[i] == compare) */ /* x_beg_mem_dst[i] = 1.0f; */ /* else */ /* x_beg_mem_dst[i] += 0.0f; */ typedef struct _tab_eq_scalar { t_object x_obj; int x_size_src1; int x_size_dst; int x_offset_src1; int x_offset_dst; iemarray_t *x_beg_mem_src1; iemarray_t *x_beg_mem_dst; t_symbol *x_sym_scr1; t_symbol *x_sym_dst; } t_tab_eq_scalar; static t_class *tab_eq_scalar_class; static void tab_eq_scalar_src(t_tab_eq_scalar *x, t_symbol *s) { x->x_sym_scr1 = s; } static void tab_eq_scalar_float(t_tab_eq_scalar *x, t_floatarg compare) { int i, n; int ok_src1, ok_dst; iemarray_t *vec_src1, *vec_dst; ok_src1 = iem_tab_check_arrays(gensym("tab_eq_scalar"), x->x_sym_scr1, &x->x_beg_mem_src1, &x->x_size_src1, 0); ok_dst = iem_tab_check_arrays(gensym("tab_eq_scalar"), x->x_sym_dst, &x->x_beg_mem_dst, &x->x_size_dst, 0); if(ok_src1 && ok_dst) { if(x->x_size_src1 < x->x_size_dst) n = x->x_size_src1; else n = x->x_size_dst; vec_src1 = x->x_beg_mem_src1; vec_dst = x->x_beg_mem_dst; if(n) { t_garray *a; for(i=0; ix_obj.ob_outlet); a = (t_garray *)pd_findbyclass(x->x_sym_dst, garray_class); garray_redraw(a); } } } static void tab_eq_scalar_dst(t_tab_eq_scalar *x, t_symbol *s) { x->x_sym_dst = s; } static void tab_eq_scalar_list(t_tab_eq_scalar *x, t_symbol *s, int argc, t_atom *argv) { int beg_src1, beg_dst; int i, n; int ok_src1, ok_dst; iemarray_t *vec_src1, *vec_dst; t_float compare; if((argc >= 4) && IS_A_FLOAT(argv,0) && IS_A_FLOAT(argv,1) && IS_A_FLOAT(argv,2) && IS_A_FLOAT(argv,3)) { beg_src1 = (int)atom_getintarg(0, argc, argv); beg_dst = (int)atom_getintarg(1, argc, argv); n = (int)atom_getintarg(2, argc, argv); compare = (t_float)atom_getfloatarg(3, argc, argv); if(beg_src1 < 0) beg_src1 = 0; if(beg_dst < 0) beg_dst = 0; if(n < 0) n = 0; ok_src1 = iem_tab_check_arrays(gensym("tab_eq_scalar"), x->x_sym_scr1, &x->x_beg_mem_src1, &x->x_size_src1, beg_src1+n); ok_dst = iem_tab_check_arrays(gensym("tab_eq_scalar"), x->x_sym_dst, &x->x_beg_mem_dst, &x->x_size_dst, beg_dst+n); if(ok_src1 && ok_dst) { vec_src1 = x->x_beg_mem_src1 + beg_src1; vec_dst = x->x_beg_mem_dst + beg_dst; if(n) { t_garray *a; for(i=0; ix_obj.ob_outlet); a = (t_garray *)pd_findbyclass(x->x_sym_dst, garray_class); garray_redraw(a); } } } else { post("tab_eq_scalar-ERROR: list need 4 float arguments:"); post(" source1_offset + destination_offset + number_of_samples_to_compare + compare_scalar"); } } static void tab_eq_scalar_free(t_tab_eq_scalar *x) { } static void *tab_eq_scalar_new(t_symbol *s, int argc, t_atom *argv) { t_tab_eq_scalar *x = (t_tab_eq_scalar *)pd_new(tab_eq_scalar_class); t_symbol *src1, *dst; if((argc >= 2) && IS_A_SYMBOL(argv,0) && IS_A_SYMBOL(argv,1)) { src1 = (t_symbol *)atom_getsymbolarg(0, argc, argv); dst = (t_symbol *)atom_getsymbolarg(1, argc, argv); } else if((argc >= 1) && IS_A_SYMBOL(argv,0)) { src1 = (t_symbol *)atom_getsymbolarg(0, argc, argv); dst = src1; } else { post("tab_eq_scalar-ERROR: need 2 symbol arguments:"); post(" source_array_name + destination_array_name"); return(0); } x->x_sym_scr1 = src1; x->x_sym_dst = dst; outlet_new(&x->x_obj, &s_bang); return(x); } void tab_eq_scalar_setup(void) { tab_eq_scalar_class = class_new(gensym("tab_eq_scalar"), (t_newmethod)tab_eq_scalar_new, (t_method)tab_eq_scalar_free, sizeof(t_tab_eq_scalar), 0, A_GIMME, 0); class_addfloat(tab_eq_scalar_class, (t_method)tab_eq_scalar_float); class_addlist(tab_eq_scalar_class, (t_method)tab_eq_scalar_list); class_addmethod(tab_eq_scalar_class, (t_method)tab_eq_scalar_src, gensym("src1"), A_DEFSYMBOL, 0); class_addmethod(tab_eq_scalar_class, (t_method)tab_eq_scalar_src, gensym("src"), A_DEFSYMBOL, 0); class_addmethod(tab_eq_scalar_class, (t_method)tab_eq_scalar_dst, gensym("dst"), A_DEFSYMBOL, 0); // class_sethelpsymbol(tab_eq_scalar_class, gensym("iemhelp2/tab_eq_scalar-help")); } iem_utils-v0.0.20180206/iem_tab/src/tab_gt.c0000644000175000017500000001313512630366350020466 0ustar zmoelnigzmoelnig/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_tab written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2009 */ #include "m_pd.h" #include "iemlib.h" #include "iem_tab.h" /* -------------------------- tab_gt ------------------------------ */ /* if(x_beg_mem_src1[i] > x_beg_mem_src2[i]) */ /* x_beg_mem_dst[i] = 1.0f; */ /* else */ /* x_beg_mem_dst[i] = 0.0f; */ typedef struct _tab_gt { t_object x_obj; int x_size_src1; int x_size_src2; int x_size_dst; int x_offset_src1; int x_offset_src2; int x_offset_dst; iemarray_t *x_beg_mem_src1; iemarray_t *x_beg_mem_src2; iemarray_t *x_beg_mem_dst; t_symbol *x_sym_scr1; t_symbol *x_sym_scr2; t_symbol *x_sym_dst; } t_tab_gt; static t_class *tab_gt_class; static void tab_gt_src1(t_tab_gt *x, t_symbol *s) { x->x_sym_scr1 = s; } static void tab_gt_src2(t_tab_gt *x, t_symbol *s) { x->x_sym_scr2 = s; } static void tab_gt_dst(t_tab_gt *x, t_symbol *s) { x->x_sym_dst = s; } static void tab_gt_bang(t_tab_gt *x) { int i, n; int ok_src1, ok_src2, ok_dst; iemarray_t *vec_src1, *vec_src2, *vec_dst; ok_src1 = iem_tab_check_arrays(gensym("tab_gt"), x->x_sym_scr1, &x->x_beg_mem_src1, &x->x_size_src1, 0); ok_src2 = iem_tab_check_arrays(gensym("tab_gt"), x->x_sym_scr2, &x->x_beg_mem_src2, &x->x_size_src2, 0); ok_dst = iem_tab_check_arrays(gensym("tab_gt"), x->x_sym_dst, &x->x_beg_mem_dst, &x->x_size_dst, 0); if(ok_src1 && ok_src2 && ok_dst) { if(x->x_size_src1 < x->x_size_dst) n = x->x_size_src1; else n = x->x_size_dst; if(x->x_size_src2 < n) n = x->x_size_src2; vec_src1 = x->x_beg_mem_src1; vec_src2 = x->x_beg_mem_src2; vec_dst = x->x_beg_mem_dst; if(n) { t_garray *a; for(i=0; i iemarray_getfloat(vec_src2, i)) iemarray_setfloat(vec_dst, i, 1.0f); else iemarray_setfloat(vec_dst, i, 0.0f); } outlet_bang(x->x_obj.ob_outlet); a = (t_garray *)pd_findbyclass(x->x_sym_dst, garray_class); garray_redraw(a); } } } static void tab_gt_list(t_tab_gt *x, t_symbol *s, int argc, t_atom *argv) { int beg_src1, beg_src2, beg_dst; int i, n; int ok_src1, ok_src2, ok_dst; iemarray_t *vec_src1, *vec_src2, *vec_dst; if((argc >= 4) && IS_A_FLOAT(argv,0) && IS_A_FLOAT(argv,1) && IS_A_FLOAT(argv,2) && IS_A_FLOAT(argv,3)) { beg_src1 = (int)atom_getintarg(0, argc, argv); beg_src2 = (int)atom_getintarg(1, argc, argv); beg_dst = (int)atom_getintarg(2, argc, argv); n = (int)atom_getintarg(3, argc, argv); if(beg_src1 < 0) beg_src1 = 0; if(beg_src2 < 0) beg_src2 = 0; if(beg_dst < 0) beg_dst = 0; if(n < 0) n = 0; ok_src1 = iem_tab_check_arrays(gensym("tab_gt"), x->x_sym_scr1, &x->x_beg_mem_src1, &x->x_size_src1, beg_src1+n); ok_src2 = iem_tab_check_arrays(gensym("tab_gt"), x->x_sym_scr2, &x->x_beg_mem_src2, &x->x_size_src2, beg_src2+n); ok_dst = iem_tab_check_arrays(gensym("tab_gt"), x->x_sym_dst, &x->x_beg_mem_dst, &x->x_size_dst, beg_dst+n); if(ok_src1 && ok_src2 && ok_dst) { vec_src1 = x->x_beg_mem_src1 + beg_src1; vec_src2 = x->x_beg_mem_src2 + beg_src2; vec_dst = x->x_beg_mem_dst + beg_dst; if(n) { t_garray *a; for(i=0; i iemarray_getfloat(vec_src2, i)) iemarray_setfloat(vec_dst, i, 1.0f); else iemarray_setfloat(vec_dst, i, 0.0f); } outlet_bang(x->x_obj.ob_outlet); a = (t_garray *)pd_findbyclass(x->x_sym_dst, garray_class); garray_redraw(a); } } } else { post("tab_gt-ERROR: list need 4 float arguments:"); post(" source1_offset + source2_offset + destination_offset + number_of_samples_to_compare"); } } static void tab_gt_free(t_tab_gt *x) { } static void *tab_gt_new(t_symbol *s, int argc, t_atom *argv) { t_tab_gt *x = (t_tab_gt *)pd_new(tab_gt_class); t_symbol *src1, *src2, *dst; if((argc >= 3) && IS_A_SYMBOL(argv,0) && IS_A_SYMBOL(argv,1) && IS_A_SYMBOL(argv,2)) { src1 = (t_symbol *)atom_getsymbolarg(0, argc, argv); src2 = (t_symbol *)atom_getsymbolarg(1, argc, argv); dst = (t_symbol *)atom_getsymbolarg(2, argc, argv); } else if((argc >= 2) && IS_A_SYMBOL(argv,0) && IS_A_SYMBOL(argv,1)) { src1 = (t_symbol *)atom_getsymbolarg(0, argc, argv); dst = src1; src2 = (t_symbol *)atom_getsymbolarg(1, argc, argv); } else { post("tab_gt-ERROR: need 3 symbols arguments:"); post(" source1_array_name + source2_array_name + destination_array_name"); return(0); } x->x_sym_scr1 = src1; x->x_sym_scr2 = src2; x->x_sym_dst = dst; outlet_new(&x->x_obj, &s_bang); return(x); } void tab_gt_setup(void) { tab_gt_class = class_new(gensym("tab_gt"), (t_newmethod)tab_gt_new, (t_method)tab_gt_free, sizeof(t_tab_gt), 0, A_GIMME, 0); class_addbang(tab_gt_class, (t_method)tab_gt_bang); class_addlist(tab_gt_class, (t_method)tab_gt_list); class_addmethod(tab_gt_class, (t_method)tab_gt_src1, gensym("src1"), A_DEFSYMBOL, 0); class_addmethod(tab_gt_class, (t_method)tab_gt_src2, gensym("src2"), A_DEFSYMBOL, 0); class_addmethod(tab_gt_class, (t_method)tab_gt_dst, gensym("dst"), A_DEFSYMBOL, 0); // class_sethelpsymbol(tab_gt_class, gensym("iemhelp2/tab_gt-help")); } iem_utils-v0.0.20180206/iem_tab/src/tab_find_exact_peaks.c0000644000175000017500000002760212630366350023347 0ustar zmoelnigzmoelnig/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_tab written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2009 */ #include "m_pd.h" #include "iemlib.h" #include "iem_tab.h" /* -------------------------- tab_find_exact_peaks ------------------------------ */ #define IEMLIB_TAB_FIND_EXACT_PEAKS_SORT_MODE_AMP 0 #define IEMLIB_TAB_FIND_EXACT_PEAKS_SORT_MODE_FREQ 1 typedef struct _tab_find_exact_peaks { t_object x_obj; int x_size_src1; int x_offset_src1; iemarray_t *x_beg_mem_src1; int x_work_alloc; int *x_beg_mem_work1; t_float *x_beg_mem_work2; int x_sort_mode; t_float x_hdiff; int x_min_width; int x_max_width; int x_n_peaks; t_symbol *x_sym_scr1; t_outlet *x_bang_out; t_outlet *x_sort_index_out; t_outlet *x_peak_value_out; t_outlet *x_peak_index_out; } t_tab_find_exact_peaks; static t_class *tab_find_exact_peaks_class; static void tab_find_exact_peaks_max_peaks(t_tab_find_exact_peaks *x, t_floatarg fmax_peaks) { int max_peaks = (int)fmax_peaks; if(max_peaks <= 0) max_peaks = 1; x->x_n_peaks = max_peaks; } static void tab_find_exact_peaks_width_range(t_tab_find_exact_peaks *x, t_symbol *s, int argc, t_atom *argv) { int minw, maxw, h; if((argc >= 2) && IS_A_FLOAT(argv,0) && IS_A_FLOAT(argv,1)) { minw = (int)atom_getintarg(0, argc, argv); maxw = (int)atom_getintarg(1, argc, argv); if(minw <= 0) minw = 1; if(maxw <= 0) maxw = 1; if(minw > maxw) { h = minw; minw = maxw; maxw = h; } x->x_min_width = minw; x->x_max_width = maxw; } } static void tab_find_exact_peaks_abs_min_height_diff(t_tab_find_exact_peaks *x, t_floatarg height_diff) { if(height_diff < 0.0f) height_diff *= -1.0f; x->x_hdiff = height_diff; } static void tab_find_exact_peaks_amp_sort(t_tab_find_exact_peaks *x) { x->x_sort_mode = IEMLIB_TAB_FIND_EXACT_PEAKS_SORT_MODE_AMP; } static void tab_find_exact_peaks_freq_sort(t_tab_find_exact_peaks *x) { x->x_sort_mode = IEMLIB_TAB_FIND_EXACT_PEAKS_SORT_MODE_FREQ; } static void tab_find_exact_peaks_src(t_tab_find_exact_peaks *x, t_symbol *s) { x->x_sym_scr1 = s; } static void tab_find_exact_peaks_bang(t_tab_find_exact_peaks *x) { int i, n, w, ww; int ok_src, peak_index=0; t_float *vec_work2; iemarray_t *vec_src; int *vec_work1; t_float max=-1.0e37; int max_peaks=x->x_n_peaks; int min_width=x->x_min_width; int max_width=x->x_max_width; t_float abs_min_height_diff=x->x_hdiff; ok_src = iem_tab_check_arrays(gensym("tab_find_exact_peaks"), x->x_sym_scr1, &x->x_beg_mem_src1, &x->x_size_src1, 0); if(ok_src) { n = x->x_size_src1; if(n) { if(!x->x_work_alloc) { x->x_beg_mem_work1 = (int *)getbytes(n * sizeof(int)); x->x_beg_mem_work2 = (t_float *)getbytes(n * sizeof(t_float)); x->x_work_alloc = n; } else if(n != x->x_work_alloc) { x->x_beg_mem_work1 = (int *)resizebytes(x->x_beg_mem_work1, x->x_work_alloc*sizeof(int), n*sizeof(int)); x->x_beg_mem_work2 = (t_float *)resizebytes(x->x_beg_mem_work2, x->x_work_alloc*sizeof(t_float), n*sizeof(t_float)); x->x_work_alloc = n; } vec_src = x->x_beg_mem_src1; vec_work1 = x->x_beg_mem_work1; vec_work2 = x->x_beg_mem_work2; if(x->x_sort_mode == IEMLIB_TAB_FIND_EXACT_PEAKS_SORT_MODE_FREQ) // FREQ_SORT BEGIN { int sort_index=1,old=0,j; for(i=0; ix_peak_value_out, iemarray_getfloat(vec_src, i)); outlet_float(x->x_peak_index_out, (t_float)peak_index); outlet_float(x->x_sort_index_out, sort_index); sort_index++; } else i = n+1; } old = vec_work1[i]; } outlet_bang(x->x_bang_out); } // FREQ_SORT END else if(x->x_sort_mode == IEMLIB_TAB_FIND_EXACT_PEAKS_SORT_MODE_AMP) // AMP_SORT BEGIN { int sort_index=1,old=0,j; for(i=0; i max) { max = vec_work2[i]; peak_index = i; } } } if(peak_index >= 0) { outlet_float(x->x_peak_value_out, max); outlet_float(x->x_peak_index_out, (t_float)peak_index); outlet_float(x->x_sort_index_out, sort_index); vec_work1[peak_index] = 0; vec_work2[peak_index] = 0.0f; j=peak_index+1; while(vec_work1[j]) { vec_work1[j] = 0; j++; } j=peak_index-1; while(vec_work1[j]) { vec_work1[j] = 0; j--; } } else sort_index = max_peaks+1; } outlet_bang(x->x_bang_out); } } // AMP_SORT END } /* [n] zu [n-1] u. [n+1] (ww=0)(w=1)(beg=1)(end=n-1) [n-1] u. [n] zu [n-2] u. [n+1] (ww=0)(w=2)(beg=2)(end=n-1) [n] u. [n+1] zu [n-1] u. [n+2] (ww=1)(w=2)(beg=1)(end=n-2) [n-2] u. [n-1] u. [n] zu [n-3] u. [n+1] (ww=0)(w=3)(beg=3)(end=n-1) [n-1] u. [n] u. [n+1] zu [n-2] u. [n+2] (ww=1)(w=3)(beg=2)(end=n-2) [n] u. [n+1] u. [n+2] zu [n-1] u. [n+3] (ww=2)(w=3)(beg=1)(end=n-3) */ } /*static void tab_find_exact_peaks_list(t_tab_find_exact_peaks *x, t_symbol *s, int argc, t_atom *argv) { int beg_src; int i, n; int ok_src, max_index=0; t_float *vec_src; t_float max=-1.0e37; if((argc >= 2) && IS_A_FLOAT(argv,0) && IS_A_FLOAT(argv,1)) { beg_src = (int)atom_getintarg(0, argc, argv); n = (int)atom_getintarg(1, argc, argv); if(beg_src < 0) beg_src = 0; if(n < 0) n = 0; ok_src = iem_tab_check_arrays(gensym("tab_find_exact_peaks"), x->x_sym_scr1, &x->x_beg_mem_src1, &x->x_size_src1, beg_src+n); if(ok_src) { vec_src = x->x_beg_mem_src1 + beg_src; if(n) { for(i=0; i max) { max = vec_src[i]; max_index = i + beg_src; } } outlet_float(x->x_peak_value_out, max); outlet_float(x->x_peak_index_out, (t_float)max_index); outlet_bang(x->x_bang_out); } } } else { post("tab_find_exact_peaks-ERROR: list need 2 float arguments:"); post(" source_offset + number_of_samples_to_calc_max_index"); } }*/ static void tab_find_exact_peaks_free(t_tab_find_exact_peaks *x) { if(x->x_work_alloc) { freebytes(x->x_beg_mem_work1, x->x_work_alloc * sizeof(int)); freebytes(x->x_beg_mem_work2, x->x_work_alloc * sizeof(t_float)); } } static void *tab_find_exact_peaks_new(t_symbol *s, int argc, t_atom *argv) { t_tab_find_exact_peaks *x = (t_tab_find_exact_peaks *)pd_new(tab_find_exact_peaks_class); t_symbol *src; if((argc >= 1) && IS_A_SYMBOL(argv,0)) { src = (t_symbol *)atom_getsymbolarg(0, argc, argv); } else { post("tab_find_exact_peaks-ERROR: need 1 symbol argument:"); post(" source_array_name"); return(0); } x->x_work_alloc = 0; x->x_beg_mem_work1 = (int *)0; x->x_beg_mem_work2 = (t_float *)0; x->x_sym_scr1 = src; x->x_bang_out = (t_outlet *)outlet_new(&x->x_obj, &s_bang); // ready x->x_sort_index_out = (t_outlet *)outlet_new(&x->x_obj, &s_float); // sort index x->x_peak_index_out = (t_outlet *)outlet_new(&x->x_obj, &s_float); // freq x->x_peak_value_out = (t_outlet *)outlet_new(&x->x_obj, &s_float); // value return(x); } void tab_find_exact_peaks_setup(void) { tab_find_exact_peaks_class = class_new(gensym("tab_find_exact_peaks"), (t_newmethod)tab_find_exact_peaks_new, (t_method)tab_find_exact_peaks_free, sizeof(t_tab_find_exact_peaks), 0, A_GIMME, 0); class_addbang(tab_find_exact_peaks_class, (t_method)tab_find_exact_peaks_bang); /*class_addlist(tab_find_exact_peaks_class, (t_method)tab_find_exact_peaks_list);*/ class_addmethod(tab_find_exact_peaks_class, (t_method)tab_find_exact_peaks_src, gensym("src"), A_DEFSYMBOL, 0); class_addmethod(tab_find_exact_peaks_class, (t_method)tab_find_exact_peaks_src, gensym("src1"), A_DEFSYMBOL, 0); class_addmethod(tab_find_exact_peaks_class, (t_method)tab_find_exact_peaks_max_peaks, gensym("max_peaks"), A_DEFFLOAT, 0); class_addmethod(tab_find_exact_peaks_class, (t_method)tab_find_exact_peaks_width_range, gensym("width_range"), A_GIMME, 0); class_addmethod(tab_find_exact_peaks_class, (t_method)tab_find_exact_peaks_abs_min_height_diff, gensym("abs_min_height_diff"), A_DEFFLOAT, 0); class_addmethod(tab_find_exact_peaks_class, (t_method)tab_find_exact_peaks_amp_sort, gensym("amp_sort"), 0); class_addmethod(tab_find_exact_peaks_class, (t_method)tab_find_exact_peaks_freq_sort, gensym("freq_sort"), 0); // class_sethelpsymbol(tab_find_exact_peaks_class, gensym("iemhelp2/help-tab_find_exact_peaks")); } iem_utils-v0.0.20180206/iem_tab/src/tab_eq.c0000644000175000017500000001314012630366350020455 0ustar zmoelnigzmoelnig/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_tab written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2009 */ #include "m_pd.h" #include "iemlib.h" #include "iem_tab.h" /* -------------------------- tab_eq ------------------------------ */ /* if(x_beg_mem_src1[i] == x_beg_mem_src2[i]) */ /* x_beg_mem_dst[i] = 1.0f; */ /* else */ /* x_beg_mem_dst[i] = 0.0f; */ typedef struct _tab_eq { t_object x_obj; int x_size_src1; int x_size_src2; int x_size_dst; int x_offset_src1; int x_offset_src2; int x_offset_dst; iemarray_t *x_beg_mem_src1; iemarray_t *x_beg_mem_src2; iemarray_t *x_beg_mem_dst; t_symbol *x_sym_scr1; t_symbol *x_sym_scr2; t_symbol *x_sym_dst; } t_tab_eq; static t_class *tab_eq_class; static void tab_eq_src1(t_tab_eq *x, t_symbol *s) { x->x_sym_scr1 = s; } static void tab_eq_src2(t_tab_eq *x, t_symbol *s) { x->x_sym_scr2 = s; } static void tab_eq_dst(t_tab_eq *x, t_symbol *s) { x->x_sym_dst = s; } static void tab_eq_bang(t_tab_eq *x) { int i, n; int ok_src1, ok_src2, ok_dst; iemarray_t *vec_src1, *vec_src2, *vec_dst; ok_src1 = iem_tab_check_arrays(gensym("tab_eq"), x->x_sym_scr1, &x->x_beg_mem_src1, &x->x_size_src1, 0); ok_src2 = iem_tab_check_arrays(gensym("tab_eq"), x->x_sym_scr2, &x->x_beg_mem_src2, &x->x_size_src2, 0); ok_dst = iem_tab_check_arrays(gensym("tab_eq"), x->x_sym_dst, &x->x_beg_mem_dst, &x->x_size_dst, 0); if(ok_src1 && ok_src2 && ok_dst) { if(x->x_size_src1 < x->x_size_dst) n = x->x_size_src1; else n = x->x_size_dst; if(x->x_size_src2 < n) n = x->x_size_src2; vec_src1 = x->x_beg_mem_src1; vec_src2 = x->x_beg_mem_src2; vec_dst = x->x_beg_mem_dst; if(n) { t_garray *a; for(i=0; ix_obj.ob_outlet); a = (t_garray *)pd_findbyclass(x->x_sym_dst, garray_class); garray_redraw(a); } } } static void tab_eq_list(t_tab_eq *x, t_symbol *s, int argc, t_atom *argv) { int beg_src1, beg_src2, beg_dst; int i, n; int ok_src1, ok_src2, ok_dst; iemarray_t *vec_src1, *vec_src2, *vec_dst; if((argc >= 4) && IS_A_FLOAT(argv,0) && IS_A_FLOAT(argv,1) && IS_A_FLOAT(argv,2) && IS_A_FLOAT(argv,3)) { beg_src1 = (int)atom_getintarg(0, argc, argv); beg_src2 = (int)atom_getintarg(1, argc, argv); beg_dst = (int)atom_getintarg(2, argc, argv); n = (int)atom_getintarg(3, argc, argv); if(beg_src1 < 0) beg_src1 = 0; if(beg_src2 < 0) beg_src2 = 0; if(beg_dst < 0) beg_dst = 0; if(n < 0) n = 0; ok_src1 = iem_tab_check_arrays(gensym("tab_eq"), x->x_sym_scr1, &x->x_beg_mem_src1, &x->x_size_src1, beg_src1+n); ok_src2 = iem_tab_check_arrays(gensym("tab_eq"), x->x_sym_scr2, &x->x_beg_mem_src2, &x->x_size_src2, beg_src2+n); ok_dst = iem_tab_check_arrays(gensym("tab_eq"), x->x_sym_dst, &x->x_beg_mem_dst, &x->x_size_dst, beg_dst+n); if(ok_src1 && ok_src2 && ok_dst) { vec_src1 = x->x_beg_mem_src1 + beg_src1; vec_src2 = x->x_beg_mem_src2 + beg_src2; vec_dst = x->x_beg_mem_dst + beg_dst; if(n) { t_garray *a; for(i=0; ix_obj.ob_outlet); a = (t_garray *)pd_findbyclass(x->x_sym_dst, garray_class); garray_redraw(a); } } } else { post("tab_eq-ERROR: list need 4 float arguments:"); post(" source1_offset + source2_offset + destination_offset + number_of_samples_to_compare"); } } static void tab_eq_free(t_tab_eq *x) { } static void *tab_eq_new(t_symbol *s, int argc, t_atom *argv) { t_tab_eq *x = (t_tab_eq *)pd_new(tab_eq_class); t_symbol *src1, *src2, *dst; if((argc >= 3) && IS_A_SYMBOL(argv,0) && IS_A_SYMBOL(argv,1) && IS_A_SYMBOL(argv,2)) { src1 = (t_symbol *)atom_getsymbolarg(0, argc, argv); src2 = (t_symbol *)atom_getsymbolarg(1, argc, argv); dst = (t_symbol *)atom_getsymbolarg(2, argc, argv); } else if((argc >= 2) && IS_A_SYMBOL(argv,0) && IS_A_SYMBOL(argv,1)) { src1 = (t_symbol *)atom_getsymbolarg(0, argc, argv); dst = src1; src2 = (t_symbol *)atom_getsymbolarg(1, argc, argv); } else { post("tab_eq-ERROR: need 3 symbols arguments:"); post(" source1_array_name + source2_array_name + destination_array_name"); return(0); } x->x_sym_scr1 = src1; x->x_sym_scr2 = src2; x->x_sym_dst = dst; outlet_new(&x->x_obj, &s_bang); return(x); } void tab_eq_setup(void) { tab_eq_class = class_new(gensym("tab_eq"), (t_newmethod)tab_eq_new, (t_method)tab_eq_free, sizeof(t_tab_eq), 0, A_GIMME, 0); class_addbang(tab_eq_class, (t_method)tab_eq_bang); class_addlist(tab_eq_class, (t_method)tab_eq_list); class_addmethod(tab_eq_class, (t_method)tab_eq_src1, gensym("src1"), A_DEFSYMBOL, 0); class_addmethod(tab_eq_class, (t_method)tab_eq_src2, gensym("src2"), A_DEFSYMBOL, 0); class_addmethod(tab_eq_class, (t_method)tab_eq_dst, gensym("dst"), A_DEFSYMBOL, 0); // class_sethelpsymbol(tab_eq_class, gensym("iemhelp2/tab_eq-help")); } iem_utils-v0.0.20180206/iem_tab/src/makefile_darwin0000644000175000017500000000302212630366350022120 0ustar zmoelnigzmoelnigcurrent: all .SUFFIXES: .pd_darwin PD_INSTALL_PATH = "/Applications/Pd.app/Contents/Resources" INCLUDE = -I. -I$(PD_INSTALL_PATH)/src LIB = -ldl -lm -lpthread CFLAGS = -DPD -DUNIX -g -Wall -W -Werror -Wno-unused \ -Wno-parentheses -Wno-switch -O2 -fno-strict-aliasing \ $(INCLUDE) $(UCFLAGS) $(AFLAGS) \ MACOSXLINKFLAGS = -bundle -bundle_loader $(PD_INSTALL_PATH)/bin/pd SYSTEM = $(shell uname -m) # the sources SRC = tab_abs.c \ tab_add.c \ tab_add_scalar.c \ tab_carth2polar.c \ tab_complex_inv.c \ tab_complex_mul.c \ tab_const.c \ tab_conv.c \ tab_copy.c \ tab_counter.c \ tab_cross_corr.c \ tab_dbtopow.c \ tab_dbtorms.c \ tab_div.c \ tab_eq.c \ tab_eq_scalar.c \ tab_fft.c \ tab_find_exact_peaks.c \ tab_find_peaks.c \ tab_ge.c \ tab_ge_scalar.c \ tab_gt.c \ tab_gt_scalar.c \ tab_get_size.c \ tab_ifft.c \ tab_le.c \ tab_le_scalar.c \ tab_lt.c \ tab_lt_scalar.c \ tab_max_index.c \ tab_min_index.c \ tab_min_max.c \ tab_mul.c \ tab_mul_scalar.c \ tab_ne.c \ tab_ne_scalar.c \ tab_powtodb.c \ tab_reverse.c \ tab_rfft.c \ tab_rifft.c \ tab_rmstodb.c \ tab_sqrt.c \ tab_sub.c \ tab_sum.c \ iem_tab.c TARGET = iem_tab.pd_darwin OBJ = $(SRC:.c=.o) # # ------------------ targets ------------------------------------ # clean: rm ../$(TARGET) rm *.o all: $(OBJ) @echo :: $(OBJ) $(CC) $(MACOSXLINKFLAGS) -o $(TARGET) *.o $(LIB) strip -S -x $(TARGET) mv $(TARGET) .. $(OBJ) : %.o : %.c touch $*.c $(CC) $(CFLAGS) -DPD $(INCLUDE) -c -o $*.o $*.c iem_utils-v0.0.20180206/iem_tab/src/tab_const.c0000644000175000017500000000734412630366350021207 0ustar zmoelnigzmoelnig/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_tab written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2009 */ #include "m_pd.h" #include "iemlib.h" #include "iem_tab.h" /* -------------------------- tab_const ------------------------------ */ /* x_beg_mem_dst[i] = c */ typedef struct _tab_const { t_object x_obj; int x_size_dst; int x_offset_dst; t_float x_const; iemarray_t *x_beg_mem_dst; t_symbol *x_sym_dst; } t_tab_const; static t_class *tab_const_class; static void tab_const_dst(t_tab_const *x, t_symbol *s) { x->x_sym_dst = s; } static void tab_const_bang(t_tab_const *x) { int i, n; int ok_dst; iemarray_t *vec_dst; ok_dst = iem_tab_check_arrays(gensym("tab_const"), x->x_sym_dst, &x->x_beg_mem_dst, &x->x_size_dst, 0); if(ok_dst) { n = x->x_size_dst; vec_dst = x->x_beg_mem_dst; if(n) { t_garray *a; for(i=0; ix_obj.ob_outlet); a = (t_garray *)pd_findbyclass(x->x_sym_dst, garray_class); garray_redraw(a); } } } static void tab_const_float(t_tab_const *x, t_floatarg c) { int i, n; int ok_dst; iemarray_t *vec_dst; ok_dst = iem_tab_check_arrays(gensym("tab_const"), x->x_sym_dst, &x->x_beg_mem_dst, &x->x_size_dst, 0); if(ok_dst) { n = x->x_size_dst; vec_dst = x->x_beg_mem_dst; if(n) { t_garray *a; for(i=0; ix_obj.ob_outlet); a = (t_garray *)pd_findbyclass(x->x_sym_dst, garray_class); garray_redraw(a); } } } static void tab_const_list(t_tab_const *x, t_symbol *s, int argc, t_atom *argv) { int beg_dst; int i, n; int ok_dst; iemarray_t *vec_dst; t_float c; if((argc >= 3) && IS_A_FLOAT(argv,0) && IS_A_FLOAT(argv,1) && IS_A_FLOAT(argv,2)) { beg_dst = (int)atom_getintarg(0, argc, argv); n = (int)atom_getintarg(1, argc, argv); c = (t_float)atom_getfloatarg(2, argc, argv); if(beg_dst < 0) beg_dst = 0; if(n < 0) n = 0; ok_dst = iem_tab_check_arrays(gensym("tab_const"), x->x_sym_dst, &x->x_beg_mem_dst, &x->x_size_dst, beg_dst+n); if(ok_dst) { vec_dst = x->x_beg_mem_dst + beg_dst; if(n) { t_garray *a; for(i=0; ix_obj.ob_outlet); a = (t_garray *)pd_findbyclass(x->x_sym_dst, garray_class); garray_redraw(a); } } } else { post("tab_const-ERROR: list need 3 float arguments:"); post(" destination_offset + number_of_samples_to_copy + constant-value"); } } static void tab_const_free(t_tab_const *x) { } static void *tab_const_new(t_symbol *s, int argc, t_atom *argv) { t_tab_const *x = (t_tab_const *)pd_new(tab_const_class); t_symbol *dst; if((argc >= 1) && IS_A_SYMBOL(argv,0)) { dst = (t_symbol *)atom_getsymbolarg(0, argc, argv); } else { post("tab_const-ERROR: need 1 symbol argument:"); post(" destination_array_name"); return(0); } x->x_sym_dst = dst; outlet_new(&x->x_obj, &s_bang); return(x); } void tab_const_setup(void) { tab_const_class = class_new(gensym("tab_const"), (t_newmethod)tab_const_new, (t_method)tab_const_free, sizeof(t_tab_const), 0, A_GIMME, 0); class_addbang(tab_const_class, (t_method)tab_const_bang); class_addfloat(tab_const_class, (t_method)tab_const_float); class_addlist(tab_const_class, (t_method)tab_const_list); class_addmethod(tab_const_class, (t_method)tab_const_dst, gensym("dst"), A_DEFSYMBOL, 0); } iem_utils-v0.0.20180206/iem_tab/src/tab_sum.c0000644000175000017500000000630712630366350020663 0ustar zmoelnigzmoelnig/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_tab written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2009 */ #include "m_pd.h" #include "iemlib.h" #include "iem_tab.h" /* -------------------------- tab_sum ------------------------------ */ /* sum = 0.0f; */ /* for(i=0; ix_sym_scr1 = s; } static void tab_sum_bang(t_tab_sum *x) { int i, n; int ok_src; iemarray_t *vec_src; t_float sum=0.0f; ok_src = iem_tab_check_arrays(gensym("tab_sum"), x->x_sym_scr1, &x->x_beg_mem_src1, &x->x_size_src1, 0); if(ok_src) { n = x->x_size_src1; vec_src = x->x_beg_mem_src1; if(n) { for(i=0; ix_sum_out, sum); outlet_bang(x->x_bang_out); } } } static void tab_sum_list(t_tab_sum *x, t_symbol *s, int argc, t_atom *argv) { int beg_src; int i, n; int ok_src; iemarray_t *vec_src; t_float sum=0.0f; if((argc >= 2) && IS_A_FLOAT(argv,0) && IS_A_FLOAT(argv,1)) { beg_src = (int)atom_getintarg(0, argc, argv); n = (int)atom_getintarg(1, argc, argv); if(beg_src < 0) beg_src = 0; if(n < 0) n = 0; ok_src = iem_tab_check_arrays(gensym("tab_sum"), x->x_sym_scr1, &x->x_beg_mem_src1, &x->x_size_src1, beg_src+n); if(ok_src) { vec_src = x->x_beg_mem_src1 + beg_src; if(n) { for(i=0; ix_sum_out, sum); outlet_bang(x->x_bang_out); } } } else { post("tab_sum-ERROR: list need 2 float arguments:"); post(" source_offset + number_of_samples_to_calc_sum-value"); } } static void tab_sum_free(t_tab_sum *x) { } static void *tab_sum_new(t_symbol *s, int argc, t_atom *argv) { t_tab_sum *x = (t_tab_sum *)pd_new(tab_sum_class); t_symbol *src; if((argc >= 1) && IS_A_SYMBOL(argv,0)) { src = (t_symbol *)atom_getsymbolarg(0, argc, argv); } else { post("tab_sum-ERROR: need 1 symbol argument:"); post(" source_array_name"); return(0); } x->x_sym_scr1 = src; x->x_bang_out = outlet_new(&x->x_obj, &s_bang); x->x_sum_out = outlet_new(&x->x_obj, &s_float); return(x); } void tab_sum_setup(void) { tab_sum_class = class_new(gensym("tab_sum"), (t_newmethod)tab_sum_new, (t_method)tab_sum_free, sizeof(t_tab_sum), 0, A_GIMME, 0); class_addbang(tab_sum_class, (t_method)tab_sum_bang); class_addlist(tab_sum_class, (t_method)tab_sum_list); class_addmethod(tab_sum_class, (t_method)tab_sum_src, gensym("src"), A_DEFSYMBOL, 0); class_addmethod(tab_sum_class, (t_method)tab_sum_src, gensym("src1"), A_DEFSYMBOL, 0); // class_sethelpsymbol(tab_sum_class, gensym("iemhelp2/tab_sum-help")); } iem_utils-v0.0.20180206/iem_tab/src/tab_mls.c0000644000175000017500000001156312630366350020652 0ustar zmoelnigzmoelnig/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_tab written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2009 */ #include "m_pd.h" #include "iemlib.h" #include "iem_tab.h" /* -------------------------- tab_mls ------------------------------ */ typedef struct _tab_mls { t_object x_obj; int x_size_dst; int x_offset_dst; iemarray_t *x_beg_mem_dst; t_symbol *x_sym_dst; } t_tab_mls; static t_class *tab_mls_class; static int tab_mls_exp2(int mls_order) { int i, j=1; for(i=0; i> 1; exor = 0; for(j=0; j>= 1; } if(exor & 1) { iemarray_setfloat(vec, i, 1.0f); work1 = work2 | source; } else { iemarray_setfloat(vec, i, -1.0f); work1 = work2; } } return; } static void tab_mls_dst(t_tab_mls *x, t_symbol *s) { x->x_sym_dst = s; } static void tab_mls_float(t_tab_mls *x, t_floatarg fmls_order) { int mls_order=(int)fmls_order; int ok_dst, mls_size; mls_size = tab_mls_exp2(mls_order) - 1; ok_dst = iem_tab_check_arrays(gensym("tab_mls"), x->x_sym_dst, &x->x_beg_mem_dst, &x->x_size_dst, mls_size); if(ok_dst) { if((mls_order >= 3) && (mls_order <= 20)) { t_garray *a; tab_mls_calc(x->x_beg_mem_dst, mls_order); outlet_bang(x->x_obj.ob_outlet); a = (t_garray *)pd_findbyclass(x->x_sym_dst, garray_class); garray_redraw(a); } } } static void tab_mls_list(t_tab_mls *x, t_symbol *s, int argc, t_atom *argv) { int beg_dst; int i, n; int ok_dst; t_float c; iemarray_t *vec_dst; if((argc >= 3) && IS_A_FLOAT(argv,0) && IS_A_FLOAT(argv,1) && IS_A_FLOAT(argv,2)) { beg_dst = (int)atom_getintarg(0, argc, argv); n = (int)atom_getintarg(1, argc, argv); c = (t_float)atom_getfloatarg(2, argc, argv); if(beg_dst < 0) beg_dst = 0; if(n < 0) n = 0; ok_dst = iem_tab_check_arrays(gensym("tab_mls"), x->x_sym_dst, &x->x_beg_mem_dst, &x->x_size_dst, beg_dst+n); if(ok_dst) { vec_dst = x->x_beg_mem_dst + beg_dst; if(n) { t_garray *a; for(i=0; ix_obj.ob_outlet); a = (t_garray *)pd_findbyclass(x->x_sym_dst, garray_class); garray_redraw(a); } } } else { post("tab_mls-ERROR: list need 3 float arguments:"); post(" destination_offset + number_of_samples_to_copy + constant-value"); } } static void tab_mls_free(t_tab_mls *x) { } static void *tab_mls_new(t_symbol *s, int argc, t_atom *argv) { t_tab_mls *x = (t_tab_mls *)pd_new(tab_mls_class); t_symbol *dst; t_float time; if((argc >= 1) && IS_A_SYMBOL(argv,0)) { dst = (t_symbol *)atom_getsymbolarg(0, argc, argv); } else { post("tab_mls-ERROR: need 1 symbol argument:"); post(" destination_array_name"); return(0); } x->x_sym_dst = dst; outlet_new(&x->x_obj, &s_bang); return(x); } void tab_mls_setup(void) { tab_mls_class = class_new(gensym("tab_mls"), (t_newmethod)tab_mls_new, (t_method)tab_mls_free, sizeof(t_tab_mls), 0, A_GIMME, 0); class_addfloat(tab_mls_class, (t_method)tab_mls_float); class_addlist(tab_mls_class, (t_method)tab_mls_list); class_addmethod(tab_mls_class, (t_method)tab_mls_dst, gensym("dst"), A_DEFSYMBOL, 0); // class_sethelpsymbol(tab_mls_class, gensym("iemhelp2/tab_mls-help")); } iem_utils-v0.0.20180206/iem_tab/src/iem_tab.vcproj0000644000175000017500000000356512630366350021715 0ustar zmoelnigzmoelnig iem_utils-v0.0.20180206/iem_tab/src/tab_add.c0000644000175000017500000001251612630366350020606 0ustar zmoelnigzmoelnig/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_tab written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2009 */ #include "m_pd.h" #include "iemlib.h" #include "iem_tab.h" /* -------------------------- tab_add ------------------------------ */ /* x_beg_mem_dst[i] = x_beg_mem_src1[i] + x_beg_mem_src2[i] */ typedef struct _tab_add { t_object x_obj; int x_size_src1; int x_size_src2; int x_size_dst; int x_offset_src1; int x_offset_src2; int x_offset_dst; iemarray_t *x_beg_mem_src1; iemarray_t *x_beg_mem_src2; iemarray_t *x_beg_mem_dst; t_symbol *x_sym_scr1; t_symbol *x_sym_scr2; t_symbol *x_sym_dst; } t_tab_add; static t_class *tab_add_class; static void tab_add_src1(t_tab_add *x, t_symbol *s) { x->x_sym_scr1 = s; } static void tab_add_src2(t_tab_add *x, t_symbol *s) { x->x_sym_scr2 = s; } static void tab_add_dst(t_tab_add *x, t_symbol *s) { x->x_sym_dst = s; } static void tab_add_bang(t_tab_add *x) { int i, n; int ok_src1, ok_src2, ok_dst; iemarray_t *vec_src1, *vec_src2, *vec_dst; ok_src1 = iem_tab_check_arrays(gensym("tab_add"), x->x_sym_scr1, &x->x_beg_mem_src1, &x->x_size_src1, 0); ok_src2 = iem_tab_check_arrays(gensym("tab_add"), x->x_sym_scr2, &x->x_beg_mem_src2, &x->x_size_src2, 0); ok_dst = iem_tab_check_arrays(gensym("tab_add"), x->x_sym_dst, &x->x_beg_mem_dst, &x->x_size_dst, 0); if(ok_src1 && ok_src2 && ok_dst) { if(x->x_size_src1 < x->x_size_dst) n = x->x_size_src1; else n = x->x_size_dst; if(x->x_size_src2 < n) n = x->x_size_src2; vec_src1 = x->x_beg_mem_src1; vec_src2 = x->x_beg_mem_src2; vec_dst = x->x_beg_mem_dst; if(n) { t_garray *a; for(i=0; ix_obj.ob_outlet); a = (t_garray *)pd_findbyclass(x->x_sym_dst, garray_class); garray_redraw(a); } } } static void tab_add_list(t_tab_add *x, t_symbol *s, int argc, t_atom *argv) { int beg_src1, beg_src2, beg_dst; int i, n; int ok_src1, ok_src2, ok_dst; iemarray_t *vec_src1, *vec_src2, *vec_dst; if((argc >= 4) && IS_A_FLOAT(argv,0) && IS_A_FLOAT(argv,1) && IS_A_FLOAT(argv,2) && IS_A_FLOAT(argv,3)) { beg_src1 = (int)atom_getintarg(0, argc, argv); beg_src2 = (int)atom_getintarg(1, argc, argv); beg_dst = (int)atom_getintarg(2, argc, argv); n = (int)atom_getintarg(3, argc, argv); if(beg_src1 < 0) beg_src1 = 0; if(beg_src2 < 0) beg_src2 = 0; if(beg_dst < 0) beg_dst = 0; if(n < 0) n = 0; ok_src1 = iem_tab_check_arrays(gensym("tab_add"), x->x_sym_scr1, &x->x_beg_mem_src1, &x->x_size_src1, beg_src1+n); ok_src2 = iem_tab_check_arrays(gensym("tab_add"), x->x_sym_scr2, &x->x_beg_mem_src2, &x->x_size_src2, beg_src2+n); ok_dst = iem_tab_check_arrays(gensym("tab_add"), x->x_sym_dst, &x->x_beg_mem_dst, &x->x_size_dst, beg_dst+n); if(ok_src1 && ok_src2 && ok_dst) { vec_src1 = x->x_beg_mem_src1 + beg_src1; vec_src2 = x->x_beg_mem_src2 + beg_src2; vec_dst = x->x_beg_mem_dst + beg_dst; if(n) { t_garray *a; for(i=0; ix_obj.ob_outlet); a = (t_garray *)pd_findbyclass(x->x_sym_dst, garray_class); garray_redraw(a); } } } else { post("tab_add-ERROR: list need 4 float arguments:"); post(" source1_offset + source2_offset + destination_offset + number_of_samples_to_add"); } } static void tab_add_free(t_tab_add *x) { } static void *tab_add_new(t_symbol *s, int argc, t_atom *argv) { t_tab_add *x = (t_tab_add *)pd_new(tab_add_class); t_symbol *src1, *src2, *dst; if((argc >= 3) && IS_A_SYMBOL(argv,0) && IS_A_SYMBOL(argv,1) && IS_A_SYMBOL(argv,2)) { src1 = (t_symbol *)atom_getsymbolarg(0, argc, argv); src2 = (t_symbol *)atom_getsymbolarg(1, argc, argv); dst = (t_symbol *)atom_getsymbolarg(2, argc, argv); } else if((argc >= 2) && IS_A_SYMBOL(argv,0) && IS_A_SYMBOL(argv,1)) { src1 = (t_symbol *)atom_getsymbolarg(0, argc, argv); dst = src1; src2 = (t_symbol *)atom_getsymbolarg(1, argc, argv); } else { post("tab_add-ERROR: need 3 symbols arguments:"); post(" source1_array_name + source2_array_name + destination_array_name"); return(0); } x->x_sym_scr1 = src1; x->x_sym_scr2 = src2; x->x_sym_dst = dst; outlet_new(&x->x_obj, &s_bang); return(x); } void tab_add_setup(void) { tab_add_class = class_new(gensym("tab_add"), (t_newmethod)tab_add_new, (t_method)tab_add_free, sizeof(t_tab_add), 0, A_GIMME, 0); class_addbang(tab_add_class, (t_method)tab_add_bang); class_addlist(tab_add_class, (t_method)tab_add_list); class_addmethod(tab_add_class, (t_method)tab_add_src1, gensym("src1"), A_DEFSYMBOL, 0); class_addmethod(tab_add_class, (t_method)tab_add_src2, gensym("src2"), A_DEFSYMBOL, 0); class_addmethod(tab_add_class, (t_method)tab_add_dst, gensym("dst"), A_DEFSYMBOL, 0); // class_sethelpsymbol(tab_add_class, gensym("iemhelp2/tab_add-help")); } iem_utils-v0.0.20180206/iem_tab/src/tab_carth2polar.c0000644000175000017500000002003112630366350022266 0ustar zmoelnigzmoelnig/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_tab written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2009 */ #include "m_pd.h" #include "iemlib.h" #include "iem_tab.h" #include /* -------------------------- tab_carth2polar ------------------------------ */ /* x_beg_mem_dst_mag[i] = sqrt(x_beg_mem_src_re[i]*x_beg_mem_src_re[i] + x_beg_mem_src_im[i]*x_beg_mem_src_im[i]) */ /* x_beg_mem_dst_arg[i] = atan2(x_beg_mem_src_im[i], x_beg_mem_src_re[i]) */ typedef struct _tab_carth2polar { t_object x_obj; int x_size_src_re; int x_size_dst_mag; int x_size_src_im; int x_size_dst_arg; int x_offset_src_re; int x_offset_dst_mag; int x_offset_src_im; int x_offset_dst_arg; iemarray_t *x_beg_mem_src_re; iemarray_t *x_beg_mem_dst_mag; iemarray_t *x_beg_mem_src_im; iemarray_t *x_beg_mem_dst_arg; t_symbol *x_sym_src_re; t_symbol *x_sym_dst_mag; t_symbol *x_sym_src_im; t_symbol *x_sym_dst_arg; } t_tab_carth2polar; static t_class *tab_carth2polar_class; static void tab_carth2polar_src_re(t_tab_carth2polar *x, t_symbol *s) { x->x_sym_src_re = s; } static void tab_carth2polar_src_im(t_tab_carth2polar *x, t_symbol *s) { x->x_sym_src_im = s; } static void tab_carth2polar_dst_mag(t_tab_carth2polar *x, t_symbol *s) { x->x_sym_dst_mag = s; } static void tab_carth2polar_dst_arg(t_tab_carth2polar *x, t_symbol *s) { x->x_sym_dst_arg = s; } static void tab_carth2polar_bang(t_tab_carth2polar *x) { int i, n; int ok_src_re, ok_dst_mag; int ok_src_im, ok_dst_arg; iemarray_t *vec_src_re, *vec_dst_mag; iemarray_t *vec_src_im, *vec_dst_arg; ok_src_re = iem_tab_check_arrays(gensym("tab_carth2polar"), x->x_sym_src_re, &x->x_beg_mem_src_re, &x->x_size_src_re, 0); ok_dst_mag = iem_tab_check_arrays(gensym("tab_carth2polar"), x->x_sym_dst_mag, &x->x_beg_mem_dst_mag, &x->x_size_dst_mag, 0); ok_src_im = iem_tab_check_arrays(gensym("tab_carth2polar"), x->x_sym_src_im, &x->x_beg_mem_src_im, &x->x_size_src_im, 0); ok_dst_arg = iem_tab_check_arrays(gensym("tab_carth2polar"), x->x_sym_dst_arg, &x->x_beg_mem_dst_arg, &x->x_size_dst_arg, 0); if(ok_src_re && ok_dst_mag && ok_src_im && ok_dst_arg) { if(x->x_size_src_re < x->x_size_dst_mag) n = x->x_size_src_re; else n = x->x_size_dst_mag; if(x->x_size_src_im < n) n = x->x_size_src_im; if(x->x_size_dst_arg < n) n = x->x_size_dst_arg; vec_src_re = x->x_beg_mem_src_re; vec_dst_mag = x->x_beg_mem_dst_mag; vec_src_im = x->x_beg_mem_src_im; vec_dst_arg = x->x_beg_mem_dst_arg; if(n) { t_garray *a; t_float rcp_two_pi=0.125/atan(1.0); for(i=0; ix_obj.ob_outlet); a = (t_garray *)pd_findbyclass(x->x_sym_dst_mag, garray_class); garray_redraw(a); a = (t_garray *)pd_findbyclass(x->x_sym_dst_arg, garray_class); garray_redraw(a); } } } static void tab_carth2polar_list(t_tab_carth2polar *x, t_symbol *s, int argc, t_atom *argv) { int i, n; int beg_src_re, beg_dst_mag; int beg_src_im, beg_dst_arg; int ok_src_re, ok_dst_mag; int ok_src_im, ok_dst_arg; iemarray_t *vec_src_re, *vec_dst_mag; iemarray_t *vec_src_im, *vec_dst_arg; if((argc >= 5) && IS_A_FLOAT(argv,0) && IS_A_FLOAT(argv,1) && IS_A_FLOAT(argv,2) && IS_A_FLOAT(argv,3) && IS_A_FLOAT(argv,4)) { beg_src_re = (int)atom_getintarg(0, argc, argv); beg_src_im = (int)atom_getintarg(1, argc, argv); beg_dst_mag = (int)atom_getintarg(2, argc, argv); beg_dst_arg = (int)atom_getintarg(3, argc, argv); n = (int)atom_getintarg(4, argc, argv); if(beg_src_re < 0) beg_src_re = 0; if(beg_dst_mag < 0) beg_dst_mag = 0; if(beg_src_im < 0) beg_src_im = 0; if(beg_dst_arg < 0) beg_dst_arg = 0; if(n < 0) n = 0; ok_src_re = iem_tab_check_arrays(gensym("tab_carth2polar"), x->x_sym_src_re, &x->x_beg_mem_src_re, &x->x_size_src_re, beg_src_re+n); ok_dst_mag = iem_tab_check_arrays(gensym("tab_carth2polar"), x->x_sym_dst_mag, &x->x_beg_mem_dst_mag, &x->x_size_dst_mag, beg_dst_mag+n); ok_src_im = iem_tab_check_arrays(gensym("tab_carth2polar"), x->x_sym_src_im, &x->x_beg_mem_src_im, &x->x_size_src_im, beg_src_im+n); ok_dst_arg = iem_tab_check_arrays(gensym("tab_carth2polar"), x->x_sym_dst_arg, &x->x_beg_mem_dst_arg, &x->x_size_dst_arg, beg_dst_arg+n); if(ok_src_re && ok_dst_mag && ok_src_im && ok_dst_arg) { vec_src_re = x->x_beg_mem_src_re + beg_src_re; vec_dst_mag = x->x_beg_mem_dst_mag + beg_dst_mag; vec_src_im = x->x_beg_mem_src_im + beg_src_im; vec_dst_arg = x->x_beg_mem_dst_arg + beg_dst_arg; if(n) { t_garray *a; t_float rcp_two_pi=0.125/atan(1.0); for(i=0; ix_obj.ob_outlet); a = (t_garray *)pd_findbyclass(x->x_sym_dst_mag, garray_class); garray_redraw(a); a = (t_garray *)pd_findbyclass(x->x_sym_dst_arg, garray_class); garray_redraw(a); } } } else { post("tab_carth2polar-ERROR: list need 5 float arguments:"); post(" source_real_offset + source_imag_offset + destination_magnitude_offset + destination_phase_argument_offset + number_of_samples_to_convert"); } } static void tab_carth2polar_free(t_tab_carth2polar *x) { } static void *tab_carth2polar_new(t_symbol *s, int argc, t_atom *argv) { t_tab_carth2polar *x = (t_tab_carth2polar *)pd_new(tab_carth2polar_class); t_symbol *src_re, *dst_mag, *src_im, *dst_arg; if((argc >= 4) && IS_A_SYMBOL(argv,0) && IS_A_SYMBOL(argv,1) && IS_A_SYMBOL(argv,2) && IS_A_SYMBOL(argv,3)) { src_re = (t_symbol *)atom_getsymbolarg(0, argc, argv); src_im = (t_symbol *)atom_getsymbolarg(1, argc, argv); dst_mag = (t_symbol *)atom_getsymbolarg(2, argc, argv); dst_arg = (t_symbol *)atom_getsymbolarg(3, argc, argv); } else { post("tab_carth2polar-ERROR: need 4 symbols arguments:"); post(" source_real_array_name + source_imag_array_name + destination_magnitude_array_name + destination_phase_argument_array_name"); return(0); } x->x_sym_src_re = src_re; x->x_sym_src_im = src_im; x->x_sym_dst_mag = dst_mag; x->x_sym_dst_arg = dst_arg; outlet_new(&x->x_obj, &s_bang); return(x); } void tab_carth2polar_setup(void) { tab_carth2polar_class = class_new(gensym("tab_carth2polar"), (t_newmethod)tab_carth2polar_new, (t_method)tab_carth2polar_free, sizeof(t_tab_carth2polar), 0, A_GIMME, 0); class_addbang(tab_carth2polar_class, (t_method)tab_carth2polar_bang); class_addlist(tab_carth2polar_class, (t_method)tab_carth2polar_list); class_addmethod(tab_carth2polar_class, (t_method)tab_carth2polar_src_re, gensym("src_re"), A_DEFSYMBOL, 0); class_addmethod(tab_carth2polar_class, (t_method)tab_carth2polar_src_im, gensym("src_im"), A_DEFSYMBOL, 0); class_addmethod(tab_carth2polar_class, (t_method)tab_carth2polar_src_re, gensym("src1_re"), A_DEFSYMBOL, 0); class_addmethod(tab_carth2polar_class, (t_method)tab_carth2polar_src_im, gensym("src1_im"), A_DEFSYMBOL, 0); class_addmethod(tab_carth2polar_class, (t_method)tab_carth2polar_dst_mag, gensym("dst_mag"), A_DEFSYMBOL, 0); class_addmethod(tab_carth2polar_class, (t_method)tab_carth2polar_dst_arg, gensym("dst_arg"), A_DEFSYMBOL, 0); } iem_utils-v0.0.20180206/iem_tab/src/iem_tab.c0000644000175000017500000000723512630366350020632 0ustar zmoelnigzmoelnig/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_tab written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2011 */ #include "m_pd.h" #include "iemlib.h" int iem_tab_check_arrays(t_symbol *obj_name, t_symbol *array_name, iemarray_t **beg_mem, int *array_size, int max_index) { int ok=1; t_garray *a; if(!(a = (t_garray *)pd_findbyclass(array_name, garray_class))) { error("%s: no such array", array_name->s_name); ok = 0; } else if(!iemarray_getarray(a, array_size, beg_mem)) { error("%s: bad template for %s", array_name->s_name, obj_name->s_name); ok = 0; } else if(*array_size < max_index) { error("%s: bad array-size: %d", array_name->s_name, *array_size); ok = 0; } return(ok); } // Georg Holzmann: #ifdef IEMTAB_SINGLE_OBJ // for single externals disable the iem_tab object #else // build as library static t_class *iem_tab_class; static void *iem_tab_new(void) { t_object *x = (t_object *)pd_new(iem_tab_class); return (x); } void tab_abs_setup(void); void tab_add_setup(void); void tab_add_scalar_setup(void); void tab_carth2polar_setup(void); void tab_complex_inv_setup(void); void tab_complex_mul_setup(void); void tab_const_setup(void); void tab_conv_setup(void); void tab_copy_setup(void); void tab_counter_setup(void); void tab_cross_corr_setup(void); void tab_dbtopow_setup(void); void tab_dbtorms_setup(void); void tab_div_setup(void); void tab_eq_setup(void); void tab_eq_scalar_setup(void); void tab_fft_setup(void); void tab_find_exact_peaks_setup(void); void tab_find_peaks_setup(void); void tab_ge_setup(void); void tab_ge_scalar_setup(void); void tab_get_size_setup(void); void tab_gt_setup(void); void tab_gt_scalar_setup(void); void tab_ifft_setup(void); void tab_le_setup(void); void tab_le_scalar_setup(void); void tab_lt_setup(void); void tab_lt_scalar_setup(void); void tab_max_index_setup(void); void tab_min_index_setup(void); void tab_min_max_setup(void); void tab_mul_setup(void); void tab_mul_scalar_setup(void); void tab_ne_setup(void); void tab_ne_scalar_setup(void); void tab_powtodb_setup(void); void tab_reverse_setup(void); void tab_rfft_setup(void); void tab_rifft_setup(void); void tab_rmstodb_setup(void); void tab_sqrt_setup(void); void tab_sub_setup(void); void tab_sum_setup(void); /* ------------------------ setup routine ------------------------- */ void iem_tab_setup(void) { iem_tab_class = class_new(gensym("iem_tab"), iem_tab_new, 0, sizeof(t_object), CLASS_NOINLET, 0); tab_abs_setup(); tab_add_setup(); tab_add_scalar_setup(); tab_carth2polar_setup(); tab_complex_inv_setup(); tab_complex_mul_setup(); tab_const_setup(); tab_conv_setup(); tab_copy_setup(); tab_counter_setup(); tab_cross_corr_setup(); tab_dbtopow_setup(); tab_dbtorms_setup(); tab_div_setup(); tab_eq_setup(); tab_eq_scalar_setup(); tab_fft_setup(); tab_find_exact_peaks_setup(); tab_find_peaks_setup(); tab_ge_setup(); tab_ge_scalar_setup(); tab_gt_setup(); tab_gt_scalar_setup(); tab_get_size_setup(); tab_ifft_setup(); tab_le_setup(); tab_le_scalar_setup(); tab_lt_setup(); tab_lt_scalar_setup(); tab_max_index_setup(); tab_min_index_setup(); tab_min_max_setup(); tab_mul_setup(); tab_mul_scalar_setup(); tab_ne_setup(); tab_ne_scalar_setup(); tab_powtodb_setup(); tab_reverse_setup(); tab_rfft_setup(); tab_rifft_setup(); tab_rmstodb_setup(); tab_sqrt_setup(); tab_sub_setup(); tab_sum_setup(); post("iem_tab (R-1.20) library loaded! (c) Thomas Musil 11.2011"); post(" musil%ciem.at iem KUG Graz Austria", '@'); } #endif // library iem_utils-v0.0.20180206/iem_tab/src/tab_complex_mul.c0000644000175000017500000002510712630366350022402 0ustar zmoelnigzmoelnig/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_tab written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2009 */ #include "m_pd.h" #include "iemlib.h" #include "iem_tab.h" /* -------------------------- tab_complex_mul ------------------------------ */ /* x_beg_mem_dst_re[i] = x_beg_mem_src1_re[i]*x_beg_mem_src2_re[i] - x_beg_mem_src1_im[i]*x_beg_mem_src2_im[i] */ /* x_beg_mem_dst_im[i] = x_beg_mem_src1_re[i]*x_beg_mem_src2_im[i] + x_beg_mem_src1_im[i]*x_beg_mem_src2_re[i] */ typedef struct _tab_complex_mul { t_object x_obj; int x_size_src1_re; int x_size_src2_re; int x_size_dst_re; int x_size_src1_im; int x_size_src2_im; int x_size_dst_im; int x_offset_src1_re; int x_offset_src2_re; int x_offset_dst_re; int x_offset_src1_im; int x_offset_src2_im; int x_offset_dst_im; iemarray_t *x_beg_mem_src1_re; iemarray_t *x_beg_mem_src2_re; iemarray_t *x_beg_mem_dst_re; iemarray_t *x_beg_mem_src1_im; iemarray_t *x_beg_mem_src2_im; iemarray_t *x_beg_mem_dst_im; t_symbol *x_sym_scr1_re; t_symbol *x_sym_scr2_re; t_symbol *x_sym_dst_re; t_symbol *x_sym_scr1_im; t_symbol *x_sym_scr2_im; t_symbol *x_sym_dst_im; } t_tab_complex_mul; static t_class *tab_complex_mul_class; static void tab_complex_mul_src1_re(t_tab_complex_mul *x, t_symbol *s) { x->x_sym_scr1_re = s; } static void tab_complex_mul_src1_im(t_tab_complex_mul *x, t_symbol *s) { x->x_sym_scr1_im = s; } static void tab_complex_mul_src2_re(t_tab_complex_mul *x, t_symbol *s) { x->x_sym_scr2_re = s; } static void tab_complex_mul_src2_im(t_tab_complex_mul *x, t_symbol *s) { x->x_sym_scr2_im = s; } static void tab_complex_mul_dst_re(t_tab_complex_mul *x, t_symbol *s) { x->x_sym_dst_re = s; } static void tab_complex_mul_dst_im(t_tab_complex_mul *x, t_symbol *s) { x->x_sym_dst_im = s; } static void tab_complex_mul_bang(t_tab_complex_mul *x) { int i, n; int ok_src1_re, ok_src2_re, ok_dst_re; int ok_src1_im, ok_src2_im, ok_dst_im; iemarray_t *vec_src1_re, *vec_src2_re, *vec_dst_re; iemarray_t *vec_src1_im, *vec_src2_im, *vec_dst_im; ok_src1_re = iem_tab_check_arrays(gensym("tab_complex_mul"), x->x_sym_scr1_re, &x->x_beg_mem_src1_re, &x->x_size_src1_re, 0); ok_src2_re = iem_tab_check_arrays(gensym("tab_complex_mul"), x->x_sym_scr2_re, &x->x_beg_mem_src2_re, &x->x_size_src2_re, 0); ok_dst_re = iem_tab_check_arrays(gensym("tab_complex_mul"), x->x_sym_dst_re, &x->x_beg_mem_dst_re, &x->x_size_dst_re, 0); ok_src1_im = iem_tab_check_arrays(gensym("tab_complex_mul"), x->x_sym_scr1_im, &x->x_beg_mem_src1_im, &x->x_size_src1_im, 0); ok_src2_im = iem_tab_check_arrays(gensym("tab_complex_mul"), x->x_sym_scr2_im, &x->x_beg_mem_src2_im, &x->x_size_src2_im, 0); ok_dst_im = iem_tab_check_arrays(gensym("tab_complex_mul"), x->x_sym_dst_im, &x->x_beg_mem_dst_im, &x->x_size_dst_im, 0); if(ok_src1_re && ok_src2_re && ok_dst_re && ok_src1_im && ok_src2_im && ok_dst_im) { if(x->x_size_src1_re < x->x_size_dst_re) n = x->x_size_src1_re; else n = x->x_size_dst_re; if(x->x_size_src2_re < n) n = x->x_size_src2_re; if(x->x_size_src1_im < n) n = x->x_size_src1_im; if(x->x_size_src2_im < n) n = x->x_size_src2_im; if(x->x_size_dst_im < n) n = x->x_size_dst_im; vec_src1_re = x->x_beg_mem_src1_re; vec_src2_re = x->x_beg_mem_src2_re; vec_dst_re = x->x_beg_mem_dst_re; vec_src1_im = x->x_beg_mem_src1_im; vec_src2_im = x->x_beg_mem_src2_im; vec_dst_im = x->x_beg_mem_dst_im; if(n) { t_garray *a; for(i=0; ix_obj.ob_outlet); a = (t_garray *)pd_findbyclass(x->x_sym_dst_re, garray_class); garray_redraw(a); a = (t_garray *)pd_findbyclass(x->x_sym_dst_im, garray_class); garray_redraw(a); } } } static void tab_complex_mul_list(t_tab_complex_mul *x, t_symbol *s, int argc, t_atom *argv) { int i, n; int beg_src1_re, beg_src2_re, beg_dst_re; int beg_src1_im, beg_src2_im, beg_dst_im; int ok_src1_re, ok_src2_re, ok_dst_re; int ok_src1_im, ok_src2_im, ok_dst_im; iemarray_t *vec_src1_re, *vec_src2_re, *vec_dst_re; iemarray_t *vec_src1_im, *vec_src2_im, *vec_dst_im; if((argc >= 7) && IS_A_FLOAT(argv,0) && IS_A_FLOAT(argv,1) && IS_A_FLOAT(argv,2) && IS_A_FLOAT(argv,3) && IS_A_FLOAT(argv,4) && IS_A_FLOAT(argv,5) && IS_A_FLOAT(argv,6)) { beg_src1_re = (int)atom_getintarg(0, argc, argv); beg_src1_im = (int)atom_getintarg(1, argc, argv); beg_src2_re = (int)atom_getintarg(2, argc, argv); beg_src2_im = (int)atom_getintarg(3, argc, argv); beg_dst_re = (int)atom_getintarg(4, argc, argv); beg_dst_im = (int)atom_getintarg(5, argc, argv); n = (int)atom_getintarg(6, argc, argv); if(beg_src1_re < 0) beg_src1_re = 0; if(beg_src2_re < 0) beg_src2_re = 0; if(beg_dst_re < 0) beg_dst_re = 0; if(beg_src1_im < 0) beg_src1_im = 0; if(beg_src2_im < 0) beg_src2_im = 0; if(beg_dst_im < 0) beg_dst_im = 0; if(n < 0) n = 0; ok_src1_re = iem_tab_check_arrays(gensym("tab_complex_mul"), x->x_sym_scr1_re, &x->x_beg_mem_src1_re, &x->x_size_src1_re, beg_src1_re+n); ok_src2_re = iem_tab_check_arrays(gensym("tab_complex_mul"), x->x_sym_scr2_re, &x->x_beg_mem_src2_re, &x->x_size_src2_re, beg_src2_re+n); ok_dst_re = iem_tab_check_arrays(gensym("tab_complex_mul"), x->x_sym_dst_re, &x->x_beg_mem_dst_re, &x->x_size_dst_re, beg_dst_re+n); ok_src1_im = iem_tab_check_arrays(gensym("tab_complex_mul"), x->x_sym_scr1_im, &x->x_beg_mem_src1_im, &x->x_size_src1_im, beg_src1_im+n); ok_src2_im = iem_tab_check_arrays(gensym("tab_complex_mul"), x->x_sym_scr2_im, &x->x_beg_mem_src2_im, &x->x_size_src2_im, beg_src2_im+n); ok_dst_im = iem_tab_check_arrays(gensym("tab_complex_mul"), x->x_sym_dst_im, &x->x_beg_mem_dst_im, &x->x_size_dst_im, beg_dst_im+n); if(ok_src1_re && ok_src2_re && ok_dst_re && ok_src1_im && ok_src2_im && ok_dst_im) { vec_src1_re = x->x_beg_mem_src1_re + beg_src1_re; vec_src2_re = x->x_beg_mem_src2_re + beg_src2_re; vec_dst_re = x->x_beg_mem_dst_re + beg_dst_re; vec_src1_im = x->x_beg_mem_src1_im + beg_src1_im; vec_src2_im = x->x_beg_mem_src2_im + beg_src2_im; vec_dst_im = x->x_beg_mem_dst_im + beg_dst_im; if(n) { t_garray *a; for(i=0; ix_obj.ob_outlet); a = (t_garray *)pd_findbyclass(x->x_sym_dst_re, garray_class); garray_redraw(a); a = (t_garray *)pd_findbyclass(x->x_sym_dst_im, garray_class); garray_redraw(a); } } } else { post("tab_complex_mul-ERROR: list need 7 float arguments:"); post(" source1_real_offset + source1_imag_offset + source2_real_offset + source2_imag_offset + destination_real_offset + destination_imag_offset + number_of_samples_to_complex_mul"); } } static void tab_complex_mul_free(t_tab_complex_mul *x) { } static void *tab_complex_mul_new(t_symbol *s, int argc, t_atom *argv) { t_tab_complex_mul *x = (t_tab_complex_mul *)pd_new(tab_complex_mul_class); t_symbol *src1_re, *src2_re, *dst_re, *src1_im, *src2_im, *dst_im; if((argc >= 6) && IS_A_SYMBOL(argv,0) && IS_A_SYMBOL(argv,1) && IS_A_SYMBOL(argv,2) && IS_A_SYMBOL(argv,3) && IS_A_SYMBOL(argv,4) && IS_A_SYMBOL(argv,5)) { src1_re = (t_symbol *)atom_getsymbolarg(0, argc, argv); src1_im = (t_symbol *)atom_getsymbolarg(1, argc, argv); src2_re = (t_symbol *)atom_getsymbolarg(2, argc, argv); src2_im = (t_symbol *)atom_getsymbolarg(3, argc, argv); dst_re = (t_symbol *)atom_getsymbolarg(4, argc, argv); dst_im = (t_symbol *)atom_getsymbolarg(5, argc, argv); } else if((argc >= 4) && IS_A_SYMBOL(argv,0) && IS_A_SYMBOL(argv,1) && IS_A_SYMBOL(argv,2) && IS_A_SYMBOL(argv,4)) { src1_re = (t_symbol *)atom_getsymbolarg(0, argc, argv); src1_im = (t_symbol *)atom_getsymbolarg(1, argc, argv); src2_re = (t_symbol *)atom_getsymbolarg(2, argc, argv); src2_im = (t_symbol *)atom_getsymbolarg(3, argc, argv); dst_re = src1_re; dst_im = src1_im; } else { post("tab_complex_mul-ERROR: need 6 symbols arguments:"); post(" source1_real_array_name + source1_imag_array_name + source2_real_array_name + source2_imag_array_name + destination_real_array_name + destination_imag_array_name"); return(0); } x->x_sym_scr1_re = src1_re; x->x_sym_scr1_im = src1_im; x->x_sym_scr2_re = src2_re; x->x_sym_scr2_im = src2_im; x->x_sym_dst_re = dst_re; x->x_sym_dst_im = dst_im; outlet_new(&x->x_obj, &s_bang); return(x); } void tab_complex_mul_setup(void) { tab_complex_mul_class = class_new(gensym("tab_complex_mul"), (t_newmethod)tab_complex_mul_new, (t_method)tab_complex_mul_free, sizeof(t_tab_complex_mul), 0, A_GIMME, 0); class_addbang(tab_complex_mul_class, (t_method)tab_complex_mul_bang); class_addlist(tab_complex_mul_class, (t_method)tab_complex_mul_list); class_addmethod(tab_complex_mul_class, (t_method)tab_complex_mul_src1_re, gensym("src1_re"), A_DEFSYMBOL, 0); class_addmethod(tab_complex_mul_class, (t_method)tab_complex_mul_src2_re, gensym("src2_re"), A_DEFSYMBOL, 0); class_addmethod(tab_complex_mul_class, (t_method)tab_complex_mul_dst_re, gensym("dst_re"), A_DEFSYMBOL, 0); class_addmethod(tab_complex_mul_class, (t_method)tab_complex_mul_src1_im, gensym("src1_im"), A_DEFSYMBOL, 0); class_addmethod(tab_complex_mul_class, (t_method)tab_complex_mul_src2_im, gensym("src2_im"), A_DEFSYMBOL, 0); class_addmethod(tab_complex_mul_class, (t_method)tab_complex_mul_dst_im, gensym("dst_im"), A_DEFSYMBOL, 0); // class_sethelpsymbol(tab_complex_mul_class, gensym("iemhelp2/tab_complex_mul-help")); } iem_utils-v0.0.20180206/iem_tab/src/tab_fft.c0000644000175000017500000003013712630366350020634 0ustar zmoelnigzmoelnig/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_tab written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2009 */ #include "m_pd.h" #include "iemlib.h" #include "iem_tab.h" #include /* -------------------------- tab_fft ------------------------------ */ /* complex FFT */ typedef struct _tab_fft { t_object x_obj; int x_size_src_re; int x_size_src_im; int x_size_dst_re; int x_size_dst_im; int x_offset_src_re; int x_offset_src_im; int x_offset_dst_re; int x_offset_dst_im; int x_fftsize; iemarray_t *x_beg_mem_src_re; iemarray_t *x_beg_mem_src_im; iemarray_t *x_beg_mem_dst_re; iemarray_t *x_beg_mem_dst_im; TAB_COMPLEX *x_sin_cos; t_symbol *x_sym_src_re; t_symbol *x_sym_src_im; t_symbol *x_sym_dst_re; t_symbol *x_sym_dst_im; } t_tab_fft; static t_class *tab_fft_class; static void tab_fft_init(t_tab_fft *x) { int i, fftsize = x->x_fftsize; t_float f, g; TAB_COMPLEX *sincos = x->x_sin_cos; g = 2.0 * 3.141592653589793 / (t_float)fftsize; for(i=0; ix_fftsize) { x->x_sin_cos = (TAB_COMPLEX *)resizebytes(x->x_sin_cos, x->x_fftsize*sizeof(TAB_COMPLEX), i*sizeof(TAB_COMPLEX)); x->x_fftsize = i; } tab_fft_init(x); } static void tab_fft_src_re(t_tab_fft *x, t_symbol *s) { x->x_sym_src_re = s; } static void tab_fft_src_im(t_tab_fft *x, t_symbol *s) { x->x_sym_src_im = s; } static void tab_fft_dst_re(t_tab_fft *x, t_symbol *s) { x->x_sym_dst_re = s; } static void tab_fft_dst_im(t_tab_fft *x, t_symbol *s) { x->x_sym_dst_im = s; } static void tab_fft_bang(t_tab_fft *x) { int i, j, k; int ok_src_re, ok_src_im, ok_dst_re, ok_dst_im; int w_index, w_inc, i_inc, v_index; int fftsize = x->x_fftsize; int fs1 = fftsize - 1; int fs2 = fftsize / 2; TAB_COMPLEX w; TAB_COMPLEX *sincos = x->x_sin_cos; iemarray_t *vec_src_re, *vec_src_im, *vec_dst_re, *vec_dst_im; t_float old1_re, old1_im, old2_re, old2_im; ok_src_re = iem_tab_check_arrays(gensym("tab_fft"), x->x_sym_src_re, &x->x_beg_mem_src_re, &x->x_size_src_re, fftsize); ok_src_im = iem_tab_check_arrays(gensym("tab_fft"), x->x_sym_src_im, &x->x_beg_mem_src_im, &x->x_size_src_im, fftsize); ok_dst_re = iem_tab_check_arrays(gensym("tab_fft"), x->x_sym_dst_re, &x->x_beg_mem_dst_re, &x->x_size_dst_re, fftsize); ok_dst_im = iem_tab_check_arrays(gensym("tab_fft"), x->x_sym_dst_im, &x->x_beg_mem_dst_im, &x->x_size_dst_im, fftsize); if(ok_src_re && ok_src_im && ok_dst_re && ok_dst_im) { t_garray *a; vec_src_re=x->x_beg_mem_src_re; vec_src_im=x->x_beg_mem_src_im; vec_dst_re=x->x_beg_mem_dst_re; vec_dst_im=x->x_beg_mem_dst_im; for(k=0; k>= 1; } j = 0; for(i=1;i>= 1; } j = j + k; if(i < j) { old1_re = iemarray_getfloat(vec_dst_re, j); old1_im = iemarray_getfloat(vec_dst_im, j); iemarray_setfloat(vec_dst_re, j, iemarray_getfloat(vec_dst_re, i)); iemarray_setfloat(vec_dst_im, j, iemarray_getfloat(vec_dst_im, i)); iemarray_setfloat(vec_dst_re, i, old1_re); iemarray_setfloat(vec_dst_im, i, old1_im); } } // g = 2.0f / (t_float)fftsize; /* ein fehler tritt auf beim 0.sample, hier sollte nur mal 1.0 multipliziert werden wenn gelten soll : Energie im zeitfenster == Energie im Frequenz-dichte-fenster g = 1.0f; for(i = 0; i < fs2; i++) { vec_dst_re[i] *= g; vec_dst_im[i] *= g; } */ outlet_bang(x->x_obj.ob_outlet); a = (t_garray *)pd_findbyclass(x->x_sym_dst_re, garray_class); garray_redraw(a); a = (t_garray *)pd_findbyclass(x->x_sym_dst_im, garray_class); garray_redraw(a); } } static void tab_fft_list(t_tab_fft *x, t_symbol *s, int argc, t_atom *argv) { int beg_src_re, beg_src_im, beg_dst_re, beg_dst_im; int i, j, k; int ok_src_re, ok_src_im, ok_dst_re, ok_dst_im; int w_index, w_inc, i_inc, v_index; int fftsize = x->x_fftsize; int fs1 = fftsize - 1; int fs2 = fftsize / 2; TAB_COMPLEX w; TAB_COMPLEX *sincos = x->x_sin_cos; iemarray_t *vec_src_re, *vec_src_im, *vec_dst_re, *vec_dst_im; t_float old1_re, old1_im, old2_re, old2_im; if((argc >= 4) && IS_A_FLOAT(argv,0) && IS_A_FLOAT(argv,1) && IS_A_FLOAT(argv,2) && IS_A_FLOAT(argv,3)) { beg_src_re = (int)atom_getintarg(0, argc, argv); beg_src_im = (int)atom_getintarg(1, argc, argv); beg_dst_re = (int)atom_getintarg(2, argc, argv); beg_dst_im = (int)atom_getintarg(3, argc, argv); if(beg_src_re < 0) beg_src_re = 0; if(beg_src_im < 0) beg_src_im = 0; if(beg_dst_re < 0) beg_dst_re = 0; if(beg_dst_im < 0) beg_dst_im = 0; ok_src_re = iem_tab_check_arrays(gensym("tab_fft"), x->x_sym_src_re, &x->x_beg_mem_src_re, &x->x_size_src_re, beg_src_re+fftsize); ok_src_im = iem_tab_check_arrays(gensym("tab_fft"), x->x_sym_src_im, &x->x_beg_mem_src_im, &x->x_size_src_im, beg_src_im+fftsize); ok_dst_re = iem_tab_check_arrays(gensym("tab_fft"), x->x_sym_dst_re, &x->x_beg_mem_dst_re, &x->x_size_dst_re, beg_dst_re+fftsize); ok_dst_im = iem_tab_check_arrays(gensym("tab_fft"), x->x_sym_dst_im, &x->x_beg_mem_dst_im, &x->x_size_dst_im, beg_dst_im+fftsize); if(ok_src_re && ok_src_im && ok_dst_re && ok_dst_im) { t_garray *a; vec_src_re=x->x_beg_mem_src_re + beg_src_re; vec_src_im=x->x_beg_mem_src_im + beg_src_im; vec_dst_re=x->x_beg_mem_dst_re + beg_dst_re; vec_dst_im=x->x_beg_mem_dst_im + beg_dst_im; for(k=0; k>= 1; } j = 0; for(i=1;i>= 1; } j = j + k; if(i < j) { old1_re = iemarray_getfloat(vec_dst_re, j); old1_im = iemarray_getfloat(vec_dst_im, j); iemarray_setfloat(vec_dst_re, j, iemarray_getfloat(vec_dst_re, i)); iemarray_setfloat(vec_dst_im, j, iemarray_getfloat(vec_dst_im, i)); iemarray_setfloat(vec_dst_re, i, old1_re); iemarray_setfloat(vec_dst_im, i, old1_im); } } // g = 2.0f / (t_float)fftsize; /* ein fehler tritt auf beim 0.sample, hier sollte nur mal 1.0 multipliziert werden wenn gelten soll : Energie im zeitfenster == Energie im Frequenz-dichte-fenster g = 1.0f; for(i = 0; i < fs2; i++) { vec_dst_re[i] *= g; vec_dst_im[i] *= g; } */ outlet_bang(x->x_obj.ob_outlet); a = (t_garray *)pd_findbyclass(x->x_sym_dst_re, garray_class); garray_redraw(a); a = (t_garray *)pd_findbyclass(x->x_sym_dst_im, garray_class); garray_redraw(a); } } else { post("tab_fft-ERROR: list need 4 float arguments:"); post(" source_real_offset + source_imag_offset + destination_real_offset + destination_imag_offset"); } } static void tab_fft_free(t_tab_fft *x) { freebytes(x->x_sin_cos, x->x_fftsize * sizeof(TAB_COMPLEX)); } static void *tab_fft_new(t_symbol *s, int argc, t_atom *argv) { t_tab_fft *x = (t_tab_fft *)pd_new(tab_fft_class); t_symbol *src_re, *src_im, *dst_re, *dst_im; int fftsize, i=1; if((argc >= 5) && IS_A_SYMBOL(argv,0) && IS_A_SYMBOL(argv,1) && IS_A_SYMBOL(argv,2) && IS_A_SYMBOL(argv,3) && IS_A_FLOAT(argv,4)) { src_re = (t_symbol *)atom_getsymbolarg(0, argc, argv); src_im = (t_symbol *)atom_getsymbolarg(1, argc, argv); dst_re = (t_symbol *)atom_getsymbolarg(2, argc, argv); dst_im = (t_symbol *)atom_getsymbolarg(3, argc, argv); fftsize = (int)atom_getintarg(4, argc, argv); } else { post("tab_fft-ERROR: need 4 symbols + 1 float arguments:"); post(" source_real_array_name + source_imag_array_name + destination_real_array_name + destination_imag_array_name + FFT-size"); return(0); } if(fftsize < 8) fftsize = 8; while(i <= fftsize) i *= 2; i /= 2; fftsize = i; x->x_fftsize = fftsize; x->x_sym_src_re = src_re; x->x_sym_src_im = src_im; x->x_sym_dst_re = dst_re; x->x_sym_dst_im = dst_im; x->x_sin_cos = (TAB_COMPLEX *)getbytes(x->x_fftsize * sizeof(TAB_COMPLEX)); tab_fft_init(x); outlet_new(&x->x_obj, &s_bang); return(x); } void tab_fft_setup(void) { tab_fft_class = class_new(gensym("tab_fft"), (t_newmethod)tab_fft_new, (t_method)tab_fft_free, sizeof(t_tab_fft), 0, A_GIMME, 0); class_addbang(tab_fft_class, (t_method)tab_fft_bang); class_addlist(tab_fft_class, (t_method)tab_fft_list); class_addmethod(tab_fft_class, (t_method)tab_fft_fftsize, gensym("fftsize"), A_DEFFLOAT, 0); class_addmethod(tab_fft_class, (t_method)tab_fft_src_re, gensym("src_re"), A_DEFSYMBOL, 0); class_addmethod(tab_fft_class, (t_method)tab_fft_src_im, gensym("src_im"), A_DEFSYMBOL, 0); class_addmethod(tab_fft_class, (t_method)tab_fft_src_re, gensym("src1"), A_DEFSYMBOL, 0); class_addmethod(tab_fft_class, (t_method)tab_fft_src_im, gensym("src2"), A_DEFSYMBOL, 0); class_addmethod(tab_fft_class, (t_method)tab_fft_dst_re, gensym("dst_re"), A_DEFSYMBOL, 0); class_addmethod(tab_fft_class, (t_method)tab_fft_dst_im, gensym("dst_im"), A_DEFSYMBOL, 0); class_addmethod(tab_fft_class, (t_method)tab_fft_dst_re, gensym("dst1"), A_DEFSYMBOL, 0); class_addmethod(tab_fft_class, (t_method)tab_fft_dst_im, gensym("dst2"), A_DEFSYMBOL, 0); } iem_utils-v0.0.20180206/iem_tab/src/iem_tab.sln0000644000175000017500000000155712630366350021205 0ustar zmoelnigzmoelnig Microsoft Visual Studio Solution File, Format Version 10.00 # Visual Studio 2008 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "iem_tab", "iem_tab.vcproj", "{6A44952F-0D55-44EE-9032-928368583BEC}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Win32 = Debug|Win32 Release|Win32 = Release|Win32 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {6A44952F-0D55-44EE-9032-928368583BEC}.Debug|Win32.ActiveCfg = Debug|Win32 {6A44952F-0D55-44EE-9032-928368583BEC}.Debug|Win32.Build.0 = Debug|Win32 {6A44952F-0D55-44EE-9032-928368583BEC}.Release|Win32.ActiveCfg = Release|Win32 {6A44952F-0D55-44EE-9032-928368583BEC}.Release|Win32.Build.0 = Release|Win32 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection EndGlobal iem_utils-v0.0.20180206/iem_tab/src/makefile_win0000644000175000017500000000316112630366350021435 0ustar zmoelnigzmoelnig all: ..\iem_tab.dll VIS_CPP_PATH = "C:\Programme\Microsoft Visual Studio\Vc98" PD_INST_PATH = "C:\Programme\pd" PD_WIN_INCLUDE_PATH = /I. /I$(PD_INST_PATH)\src /I$(VIS_CPP_PATH)\include PD_WIN_C_FLAGS = /nologo /W3 /WX /DMSW /DNT /DPD /DWIN32 /DWINDOWS /Ox -DPA_LITTLE_ENDIAN PD_WIN_L_FLAGS = /nologo PD_WIN_LIB = /NODEFAULTLIB:libc /NODEFAULTLIB:oldnames /NODEFAULTLIB:kernel /NODEFAULTLIB:uuid \ $(VIS_CPP_PATH)\lib\libc.lib \ $(VIS_CPP_PATH)\lib\oldnames.lib \ $(VIS_CPP_PATH)\lib\kernel32.lib \ $(VIS_CPP_PATH)\lib\wsock32.lib \ $(VIS_CPP_PATH)\lib\winmm.lib \ $(PD_INST_PATH)\bin\pd.lib SRC = tab_abs.c \ tab_add.c \ tab_add_scalar.c \ tab_carth2polar.c \ tab_complex_inv.c \ tab_complex_mul.c \ tab_const.c \ tab_conv.c \ tab_copy.c \ tab_counter.c \ tab_cross_corr.c \ tab_dbtopow.c \ tab_dbtorms.c \ tab_div.c \ tab_eq.c \ tab_eq_scalar.c \ tab_fft.c \ tab_find_exact_peaks.c \ tab_find_peaks.c \ tab_ge.c \ tab_ge_scalar.c \ tab_gt.c \ tab_gt_scalar.c \ tab_get_size.c \ tab_ifft.c \ tab_le.c \ tab_le_scalar.c \ tab_lt.c \ tab_lt_scalar.c \ tab_max_index.c \ tab_min_index.c \ tab_min_max.c \ tab_mul.c \ tab_mul_scalar.c \ tab_ne.c \ tab_ne_scalar.c \ tab_powtodb.c \ tab_reverse.c \ tab_rfft.c \ tab_rifft.c \ tab_rmstodb.c \ tab_sqrt.c \ tab_sub.c \ tab_sum.c \ iem_tab.c OBJ = $(SRC:.c=.obj) .c.obj: cl $(PD_WIN_C_FLAGS) $(PD_WIN_INCLUDE_PATH) /c $*.c ..\iem_tab.dll: $(OBJ) link $(PD_WIN_L_FLAGS) /dll /export:iem_tab_setup \ /out:..\iem_tab.dll $(OBJ) $(PD_WIN_LIB) clean: del *.obj iem_utils-v0.0.20180206/iem_tab/src/tab_ge.c0000644000175000017500000001314012630366350020443 0ustar zmoelnigzmoelnig/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_tab written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2006 */ #include "m_pd.h" #include "iemlib.h" #include "iem_tab.h" /* -------------------------- tab_ge ------------------------------ */ /* if(x_beg_mem_src1[i] >= x_beg_mem_src2[i]) */ /* x_beg_mem_dst[i] = 1.0f; */ /* else */ /* x_beg_mem_dst[i] = 0.0f; */ typedef struct _tab_ge { t_object x_obj; int x_size_src1; int x_size_src2; int x_size_dst; int x_offset_src1; int x_offset_src2; int x_offset_dst; iemarray_t *x_beg_mem_src1; iemarray_t *x_beg_mem_src2; iemarray_t *x_beg_mem_dst; t_symbol *x_sym_scr1; t_symbol *x_sym_scr2; t_symbol *x_sym_dst; } t_tab_ge; static t_class *tab_ge_class; static void tab_ge_src1(t_tab_ge *x, t_symbol *s) { x->x_sym_scr1 = s; } static void tab_ge_src2(t_tab_ge *x, t_symbol *s) { x->x_sym_scr2 = s; } static void tab_ge_dst(t_tab_ge *x, t_symbol *s) { x->x_sym_dst = s; } static void tab_ge_bang(t_tab_ge *x) { int i, n; int ok_src1, ok_src2, ok_dst; iemarray_t *vec_src1, *vec_src2, *vec_dst; ok_src1 = iem_tab_check_arrays(gensym("tab_ge"), x->x_sym_scr1, &x->x_beg_mem_src1, &x->x_size_src1, 0); ok_src2 = iem_tab_check_arrays(gensym("tab_ge"), x->x_sym_scr2, &x->x_beg_mem_src2, &x->x_size_src2, 0); ok_dst = iem_tab_check_arrays(gensym("tab_ge"), x->x_sym_dst, &x->x_beg_mem_dst, &x->x_size_dst, 0); if(ok_src1 && ok_src2 && ok_dst) { if(x->x_size_src1 < x->x_size_dst) n = x->x_size_src1; else n = x->x_size_dst; if(x->x_size_src2 < n) n = x->x_size_src2; vec_src1 = x->x_beg_mem_src1; vec_src2 = x->x_beg_mem_src2; vec_dst = x->x_beg_mem_dst; if(n) { t_garray *a; for(i=0; i= iemarray_getfloat(vec_src2, i)) iemarray_setfloat(vec_dst, i, 1.0f); else iemarray_setfloat(vec_dst, i, 0.0f); } outlet_bang(x->x_obj.ob_outlet); a = (t_garray *)pd_findbyclass(x->x_sym_dst, garray_class); garray_redraw(a); } } } static void tab_ge_list(t_tab_ge *x, t_symbol *s, int argc, t_atom *argv) { int beg_src1, beg_src2, beg_dst; int i, n; int ok_src1, ok_src2, ok_dst; iemarray_t *vec_src1, *vec_src2, *vec_dst; if((argc >= 4) && IS_A_FLOAT(argv,0) && IS_A_FLOAT(argv,1) && IS_A_FLOAT(argv,2) && IS_A_FLOAT(argv,3)) { beg_src1 = (int)atom_getintarg(0, argc, argv); beg_src2 = (int)atom_getintarg(1, argc, argv); beg_dst = (int)atom_getintarg(2, argc, argv); n = (int)atom_getintarg(3, argc, argv); if(beg_src1 < 0) beg_src1 = 0; if(beg_src2 < 0) beg_src2 = 0; if(beg_dst < 0) beg_dst = 0; if(n < 0) n = 0; ok_src1 = iem_tab_check_arrays(gensym("tab_ge"), x->x_sym_scr1, &x->x_beg_mem_src1, &x->x_size_src1, beg_src1+n); ok_src2 = iem_tab_check_arrays(gensym("tab_ge"), x->x_sym_scr2, &x->x_beg_mem_src2, &x->x_size_src2, beg_src2+n); ok_dst = iem_tab_check_arrays(gensym("tab_ge"), x->x_sym_dst, &x->x_beg_mem_dst, &x->x_size_dst, beg_dst+n); if(ok_src1 && ok_src2 && ok_dst) { vec_src1 = x->x_beg_mem_src1 + beg_src1; vec_src2 = x->x_beg_mem_src2 + beg_src2; vec_dst = x->x_beg_mem_dst + beg_dst; if(n) { t_garray *a; for(i=0; i= iemarray_getfloat(vec_src2, i)) iemarray_setfloat(vec_dst, i, 1.0f); else iemarray_setfloat(vec_dst, i, 0.0f); } outlet_bang(x->x_obj.ob_outlet); a = (t_garray *)pd_findbyclass(x->x_sym_dst, garray_class); garray_redraw(a); } } } else { post("tab_ge-ERROR: list need 4 float arguments:"); post(" source1_offset + source2_offset + destination_offset + number_of_samples_to_compare"); } } static void tab_ge_free(t_tab_ge *x) { } static void *tab_ge_new(t_symbol *s, int argc, t_atom *argv) { t_tab_ge *x = (t_tab_ge *)pd_new(tab_ge_class); t_symbol *src1, *src2, *dst; if((argc >= 3) && IS_A_SYMBOL(argv,0) && IS_A_SYMBOL(argv,1) && IS_A_SYMBOL(argv,2)) { src1 = (t_symbol *)atom_getsymbolarg(0, argc, argv); src2 = (t_symbol *)atom_getsymbolarg(1, argc, argv); dst = (t_symbol *)atom_getsymbolarg(2, argc, argv); } else if((argc >= 2) && IS_A_SYMBOL(argv,0) && IS_A_SYMBOL(argv,1)) { src1 = (t_symbol *)atom_getsymbolarg(0, argc, argv); dst = src1; src2 = (t_symbol *)atom_getsymbolarg(1, argc, argv); } else { post("tab_ge-ERROR: need 3 symbols arguments:"); post(" source1_array_name + source2_array_name + destination_array_name"); return(0); } x->x_sym_scr1 = src1; x->x_sym_scr2 = src2; x->x_sym_dst = dst; outlet_new(&x->x_obj, &s_bang); return(x); } void tab_ge_setup(void) { tab_ge_class = class_new(gensym("tab_ge"), (t_newmethod)tab_ge_new, (t_method)tab_ge_free, sizeof(t_tab_ge), 0, A_GIMME, 0); class_addbang(tab_ge_class, (t_method)tab_ge_bang); class_addlist(tab_ge_class, (t_method)tab_ge_list); class_addmethod(tab_ge_class, (t_method)tab_ge_src1, gensym("src1"), A_DEFSYMBOL, 0); class_addmethod(tab_ge_class, (t_method)tab_ge_src2, gensym("src2"), A_DEFSYMBOL, 0); class_addmethod(tab_ge_class, (t_method)tab_ge_dst, gensym("dst"), A_DEFSYMBOL, 0); // class_sethelpsymbol(tab_ge_class, gensym("iemhelp2/tab_ge-help")); } iem_utils-v0.0.20180206/iem_tab/src/tab_mul.c0000644000175000017500000001251012630366350020645 0ustar zmoelnigzmoelnig/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_tab written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2009 */ #include "m_pd.h" #include "iemlib.h" #include "iem_tab.h" /* -------------------------- tab_mul ------------------------------ */ /* x_beg_mem_dst[i] = x_beg_mem_src1[i]*x_offset_src2[i] */ typedef struct _tab_mul { t_object x_obj; int x_size_src1; int x_size_src2; int x_size_dst; int x_offset_src1; int x_offset_src2; int x_offset_dst; iemarray_t *x_beg_mem_src1; iemarray_t *x_beg_mem_src2; iemarray_t *x_beg_mem_dst; t_symbol *x_sym_scr1; t_symbol *x_sym_scr2; t_symbol *x_sym_dst; } t_tab_mul; static t_class *tab_mul_class; static void tab_mul_src1(t_tab_mul *x, t_symbol *s) { x->x_sym_scr1 = s; } static void tab_mul_src2(t_tab_mul *x, t_symbol *s) { x->x_sym_scr2 = s; } static void tab_mul_dst(t_tab_mul *x, t_symbol *s) { x->x_sym_dst = s; } static void tab_mul_bang(t_tab_mul *x) { int i, n; int ok_src1, ok_src2, ok_dst; iemarray_t *vec_src1, *vec_src2, *vec_dst; ok_src1 = iem_tab_check_arrays(gensym("tab_mul"), x->x_sym_scr1, &x->x_beg_mem_src1, &x->x_size_src1, 0); ok_src2 = iem_tab_check_arrays(gensym("tab_mul"), x->x_sym_scr2, &x->x_beg_mem_src2, &x->x_size_src2, 0); ok_dst = iem_tab_check_arrays(gensym("tab_mul"), x->x_sym_dst, &x->x_beg_mem_dst, &x->x_size_dst, 0); if(ok_src1 && ok_src2 && ok_dst) { if(x->x_size_src1 < x->x_size_dst) n = x->x_size_src1; else n = x->x_size_dst; if(x->x_size_src2 < n) n = x->x_size_src2; vec_src1 = x->x_beg_mem_src1; vec_src2 = x->x_beg_mem_src2; vec_dst = x->x_beg_mem_dst; if(n) { t_garray *a; for(i=0; ix_obj.ob_outlet); a = (t_garray *)pd_findbyclass(x->x_sym_dst, garray_class); garray_redraw(a); } } } static void tab_mul_list(t_tab_mul *x, t_symbol *s, int argc, t_atom *argv) { int beg_src1, beg_src2, beg_dst; int i, n; int ok_src1, ok_src2, ok_dst; iemarray_t *vec_src1, *vec_src2, *vec_dst; if((argc >= 4) && IS_A_FLOAT(argv,0) && IS_A_FLOAT(argv,1) && IS_A_FLOAT(argv,2) && IS_A_FLOAT(argv,3)) { beg_src1 = (int)atom_getintarg(0, argc, argv); beg_src2 = (int)atom_getintarg(1, argc, argv); beg_dst = (int)atom_getintarg(2, argc, argv); n = (int)atom_getintarg(3, argc, argv); if(beg_src1 < 0) beg_src1 = 0; if(beg_src2 < 0) beg_src2 = 0; if(beg_dst < 0) beg_dst = 0; if(n < 0) n = 0; ok_src1 = iem_tab_check_arrays(gensym("tab_mul"), x->x_sym_scr1, &x->x_beg_mem_src1, &x->x_size_src1, beg_src1+n); ok_src2 = iem_tab_check_arrays(gensym("tab_mul"), x->x_sym_scr2, &x->x_beg_mem_src2, &x->x_size_src2, beg_src2+n); ok_dst = iem_tab_check_arrays(gensym("tab_mul"), x->x_sym_dst, &x->x_beg_mem_dst, &x->x_size_dst, beg_dst+n); if(ok_src1 && ok_src2 && ok_dst) { vec_src1 = x->x_beg_mem_src1 + beg_src1; vec_src2 = x->x_beg_mem_src2 + beg_src2; vec_dst = x->x_beg_mem_dst + beg_dst; if(n) { t_garray *a; for(i=0; ix_obj.ob_outlet); a = (t_garray *)pd_findbyclass(x->x_sym_dst, garray_class); garray_redraw(a); } } } else { post("tab_mul-ERROR: list need 4 float arguments:"); post(" source1_offset + source2_offset + destination_offset + number_of_samples_to_mul"); } } static void tab_mul_free(t_tab_mul *x) { } static void *tab_mul_new(t_symbol *s, int argc, t_atom *argv) { t_tab_mul *x = (t_tab_mul *)pd_new(tab_mul_class); t_symbol *src1, *src2, *dst; if((argc >= 3) && IS_A_SYMBOL(argv,0) && IS_A_SYMBOL(argv,1) && IS_A_SYMBOL(argv,2)) { src1 = (t_symbol *)atom_getsymbolarg(0, argc, argv); src2 = (t_symbol *)atom_getsymbolarg(1, argc, argv); dst = (t_symbol *)atom_getsymbolarg(2, argc, argv); } else if((argc >= 2) && IS_A_SYMBOL(argv,0) && IS_A_SYMBOL(argv,1)) { src1 = (t_symbol *)atom_getsymbolarg(0, argc, argv); dst = src1; src2 = (t_symbol *)atom_getsymbolarg(1, argc, argv); } else { post("tab_mul-ERROR: need 3 symbols arguments:"); post(" source1_array_name + source2_array_name + destination_array_name"); return(0); } x->x_sym_scr1 = src1; x->x_sym_scr2 = src2; x->x_sym_dst = dst; outlet_new(&x->x_obj, &s_bang); return(x); } void tab_mul_setup(void) { tab_mul_class = class_new(gensym("tab_mul"), (t_newmethod)tab_mul_new, (t_method)tab_mul_free, sizeof(t_tab_mul), 0, A_GIMME, 0); class_addbang(tab_mul_class, (t_method)tab_mul_bang); class_addlist(tab_mul_class, (t_method)tab_mul_list); class_addmethod(tab_mul_class, (t_method)tab_mul_src1, gensym("src1"), A_DEFSYMBOL, 0); class_addmethod(tab_mul_class, (t_method)tab_mul_src2, gensym("src2"), A_DEFSYMBOL, 0); class_addmethod(tab_mul_class, (t_method)tab_mul_dst, gensym("dst"), A_DEFSYMBOL, 0); // class_sethelpsymbol(tab_mul_class, gensym("iemhelp2/tab_mul-help")); } iem_utils-v0.0.20180206/iem_tab/src/tab_ge_scalar.c0000644000175000017500000001177612630366350022005 0ustar zmoelnigzmoelnig/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_tab written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2009 */ #include "m_pd.h" #include "iemlib.h" #include "iem_tab.h" /* -------------------------- tab_ge_scalar ------------------------------ */ /* if(x_beg_mem_src1[i] >= compare) */ /* x_beg_mem_dst[i] = 1.0f; */ /* else */ /* x_beg_mem_dst[i] += 0.0f; */ typedef struct _tab_ge_scalar { t_object x_obj; int x_size_src1; int x_size_dst; int x_offset_src1; int x_offset_dst; iemarray_t *x_beg_mem_src1; iemarray_t *x_beg_mem_dst; t_symbol *x_sym_scr1; t_symbol *x_sym_dst; } t_tab_ge_scalar; static t_class *tab_ge_scalar_class; static void tab_ge_scalar_src(t_tab_ge_scalar *x, t_symbol *s) { x->x_sym_scr1 = s; } static void tab_ge_scalar_float(t_tab_ge_scalar *x, t_floatarg compare) { int i, n; int ok_src1, ok_dst; iemarray_t *vec_src1, *vec_dst; ok_src1 = iem_tab_check_arrays(gensym("tab_ge_scalar"), x->x_sym_scr1, &x->x_beg_mem_src1, &x->x_size_src1, 0); ok_dst = iem_tab_check_arrays(gensym("tab_ge_scalar"), x->x_sym_dst, &x->x_beg_mem_dst, &x->x_size_dst, 0); if(ok_src1 && ok_dst) { if(x->x_size_src1 < x->x_size_dst) n = x->x_size_src1; else n = x->x_size_dst; vec_src1 = x->x_beg_mem_src1; vec_dst = x->x_beg_mem_dst; if(n) { t_garray *a; for(i=0; i= compare) iemarray_setfloat(vec_dst, i, 1.0f); else iemarray_setfloat(vec_dst, i, 0.0f); } outlet_bang(x->x_obj.ob_outlet); a = (t_garray *)pd_findbyclass(x->x_sym_dst, garray_class); garray_redraw(a); } } } static void tab_ge_scalar_dst(t_tab_ge_scalar *x, t_symbol *s) { x->x_sym_dst = s; } static void tab_ge_scalar_list(t_tab_ge_scalar *x, t_symbol *s, int argc, t_atom *argv) { int beg_src1, beg_dst; int i, n; int ok_src1, ok_dst; t_float compare; iemarray_t *vec_src1, *vec_dst; if((argc >= 4) && IS_A_FLOAT(argv,0) && IS_A_FLOAT(argv,1) && IS_A_FLOAT(argv,2) && IS_A_FLOAT(argv,3)) { beg_src1 = (int)atom_getintarg(0, argc, argv); beg_dst = (int)atom_getintarg(1, argc, argv); n = (int)atom_getintarg(2, argc, argv); compare = (t_float)atom_getfloatarg(3, argc, argv); if(beg_src1 < 0) beg_src1 = 0; if(beg_dst < 0) beg_dst = 0; if(n < 0) n = 0; ok_src1 = iem_tab_check_arrays(gensym("tab_ge_scalar"), x->x_sym_scr1, &x->x_beg_mem_src1, &x->x_size_src1, beg_src1+n); ok_dst = iem_tab_check_arrays(gensym("tab_ge_scalar"), x->x_sym_dst, &x->x_beg_mem_dst, &x->x_size_dst, beg_dst+n); if(ok_src1 && ok_dst) { vec_src1 = x->x_beg_mem_src1 + beg_src1; vec_dst = x->x_beg_mem_dst + beg_dst; if(n) { t_garray *a; for(i=0; i= compare) iemarray_setfloat(vec_dst, i, 1.0f); else iemarray_setfloat(vec_dst, i, 0.0f); } outlet_bang(x->x_obj.ob_outlet); a = (t_garray *)pd_findbyclass(x->x_sym_dst, garray_class); garray_redraw(a); } } } else { post("tab_ge_scalar-ERROR: list need 4 float arguments:"); post(" source1_offset + destination_offset + number_of_samples_to_compare + compare_scalar"); } } static void tab_ge_scalar_free(t_tab_ge_scalar *x) { } static void *tab_ge_scalar_new(t_symbol *s, int argc, t_atom *argv) { t_tab_ge_scalar *x = (t_tab_ge_scalar *)pd_new(tab_ge_scalar_class); t_symbol *src1, *dst; if((argc >= 2) && IS_A_SYMBOL(argv,0) && IS_A_SYMBOL(argv,1)) { src1 = (t_symbol *)atom_getsymbolarg(0, argc, argv); dst = (t_symbol *)atom_getsymbolarg(1, argc, argv); } else if((argc >= 1) && IS_A_SYMBOL(argv,0)) { src1 = (t_symbol *)atom_getsymbolarg(0, argc, argv); dst = src1; } else { post("tab_ge_scalar-ERROR: need 2 symbol arguments:"); post(" source_array_name + destination_array_name"); return(0); } x->x_sym_scr1 = src1; x->x_sym_dst = dst; outlet_new(&x->x_obj, &s_bang); return(x); } void tab_ge_scalar_setup(void) { tab_ge_scalar_class = class_new(gensym("tab_ge_scalar"), (t_newmethod)tab_ge_scalar_new, (t_method)tab_ge_scalar_free, sizeof(t_tab_ge_scalar), 0, A_GIMME, 0); class_addfloat(tab_ge_scalar_class, (t_method)tab_ge_scalar_float); class_addlist(tab_ge_scalar_class, (t_method)tab_ge_scalar_list); class_addmethod(tab_ge_scalar_class, (t_method)tab_ge_scalar_src, gensym("src1"), A_DEFSYMBOL, 0); class_addmethod(tab_ge_scalar_class, (t_method)tab_ge_scalar_src, gensym("src"), A_DEFSYMBOL, 0); class_addmethod(tab_ge_scalar_class, (t_method)tab_ge_scalar_dst, gensym("dst"), A_DEFSYMBOL, 0); // class_sethelpsymbol(tab_ge_scalar_class, gensym("iemhelp2/tab_ge_scalar-help")); } iem_utils-v0.0.20180206/iem_tab/src/iem_tab.dsw0000644000175000017500000000106512630366350021200 0ustar zmoelnigzmoelnigMicrosoft Developer Studio Workspace File, Format Version 6.00 # WARNUNG: DIESE ARBEITSBEREICHSDATEI DARF NICHT BEARBEITET ODER GELÖSCHT WERDEN! ############################################################################### Project: "iem_tab"=.\iem_tab.dsp - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ }}} ############################################################################### Global: Package=<5> {{{ }}} Package=<3> {{{ }}} ############################################################################### iem_utils-v0.0.20180206/iem_tab/src/makefile0000644000175000017500000000002712630366350020556 0ustar zmoelnigzmoelniginclude makefile_linux iem_utils-v0.0.20180206/iem_tab/src/tab_copy.c0000644000175000017500000001046212630366350021026 0ustar zmoelnigzmoelnig/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_tab written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2009 */ /* x_beg_mem_dst[i] = x_beg_mem_src1[i] */ #include "m_pd.h" #include "iemlib.h" #include "iem_tab.h" /* -------------------------- tab_copy ------------------------------ */ typedef struct _tab_copy { t_object x_obj; int x_size_src1; int x_size_dst; int x_offset_src1; int x_offset_dst; iemarray_t *x_beg_mem_src1; iemarray_t *x_beg_mem_dst; t_symbol *x_sym_scr1; t_symbol *x_sym_dst; } t_tab_copy; static t_class *tab_copy_class; static void tab_copy_src(t_tab_copy *x, t_symbol *s) { x->x_sym_scr1 = s; } static void tab_copy_dst(t_tab_copy *x, t_symbol *s) { x->x_sym_dst = s; } static void tab_copy_bang(t_tab_copy *x) { int i, n; int ok_src, ok_dst; iemarray_t *vec_src, *vec_dst; ok_src = iem_tab_check_arrays(gensym("tab_copy"), x->x_sym_scr1, &x->x_beg_mem_src1, &x->x_size_src1, 0); ok_dst = iem_tab_check_arrays(gensym("tab_copy"), x->x_sym_dst, &x->x_beg_mem_dst, &x->x_size_dst, 0); if(ok_src && ok_dst) { if(x->x_size_src1 < x->x_size_dst) n = x->x_size_src1; else n = x->x_size_dst; vec_src = x->x_beg_mem_src1; vec_dst = x->x_beg_mem_dst; if(n) { t_garray *a; for(i=0; ix_obj.ob_outlet); a = (t_garray *)pd_findbyclass(x->x_sym_dst, garray_class); garray_redraw(a); } } } static void tab_copy_list(t_tab_copy *x, t_symbol *s, int argc, t_atom *argv) { int beg_src, beg_dst; int i, n; int ok_src, ok_dst; iemarray_t *vec_src, *vec_dst; if((argc >= 3) && IS_A_FLOAT(argv,0) && IS_A_FLOAT(argv,1) && IS_A_FLOAT(argv,2)) { beg_src = (int)atom_getintarg(0, argc, argv); beg_dst = (int)atom_getintarg(1, argc, argv); n = (int)atom_getintarg(2, argc, argv); if(beg_src < 0) beg_src = 0; if(beg_dst < 0) beg_dst = 0; if(n < 0) n = 0; ok_src = iem_tab_check_arrays(gensym("tab_copy"), x->x_sym_scr1, &x->x_beg_mem_src1, &x->x_size_src1, beg_src+n); ok_dst = iem_tab_check_arrays(gensym("tab_copy"), x->x_sym_dst, &x->x_beg_mem_dst, &x->x_size_dst, beg_dst+n); if(ok_src && ok_dst) { vec_src = x->x_beg_mem_src1 + beg_src; vec_dst = x->x_beg_mem_dst + beg_dst; if(n) { t_garray *a; for(i=0; ix_obj.ob_outlet); a = (t_garray *)pd_findbyclass(x->x_sym_dst, garray_class); garray_redraw(a); } } } else { post("tab_copy-ERROR: list need 3 float arguments:"); post(" source_offset + destination_offset + number_of_samples_to_copy"); } } static void tab_copy_free(t_tab_copy *x) { } static void *tab_copy_new(t_symbol *s, int argc, t_atom *argv) { t_tab_copy *x = (t_tab_copy *)pd_new(tab_copy_class); t_symbol *src, *dst; if((argc >= 2) && IS_A_SYMBOL(argv,0) && IS_A_SYMBOL(argv,1)) { src = (t_symbol *)atom_getsymbolarg(0, argc, argv); dst = (t_symbol *)atom_getsymbolarg(1, argc, argv); } else if((argc >= 1) && IS_A_SYMBOL(argv,0)) { src = (t_symbol *)atom_getsymbolarg(0, argc, argv); dst = src; } else { post("tab_copy-ERROR: need 2 symbols arguments:"); post(" source_array_name + destination_array_name"); return(0); } x->x_sym_scr1 = src; x->x_sym_dst = dst; outlet_new(&x->x_obj, &s_bang); return(x); } void tab_copy_setup(void) { tab_copy_class = class_new(gensym("tab_copy"), (t_newmethod)tab_copy_new, (t_method)tab_copy_free, sizeof(t_tab_copy), 0, A_GIMME, 0); class_addbang(tab_copy_class, (t_method)tab_copy_bang); class_addlist(tab_copy_class, (t_method)tab_copy_list); class_addmethod(tab_copy_class, (t_method)tab_copy_src, gensym("src"), A_DEFSYMBOL, 0); class_addmethod(tab_copy_class, (t_method)tab_copy_src, gensym("src1"), A_DEFSYMBOL, 0); class_addmethod(tab_copy_class, (t_method)tab_copy_dst, gensym("dst"), A_DEFSYMBOL, 0); // class_sethelpsymbol(tab_copy_class, gensym("iemhelp2/tab_copy-help")); } iem_utils-v0.0.20180206/iem_tab/src/tab_sub.c0000644000175000017500000001251612630366350020647 0ustar zmoelnigzmoelnig/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_tab written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2009 */ #include "m_pd.h" #include "iemlib.h" #include "iem_tab.h" /* -------------------------- tab_sub ------------------------------ */ /* x_beg_mem_dst[i] = x_beg_mem_src1[i] - x_offset_src2[i] */ typedef struct _tab_sub { t_object x_obj; int x_size_src1; int x_size_src2; int x_size_dst; int x_offset_src1; int x_offset_src2; int x_offset_dst; iemarray_t *x_beg_mem_src1; iemarray_t *x_beg_mem_src2; iemarray_t *x_beg_mem_dst; t_symbol *x_sym_scr1; t_symbol *x_sym_scr2; t_symbol *x_sym_dst; } t_tab_sub; static t_class *tab_sub_class; static void tab_sub_src1(t_tab_sub *x, t_symbol *s) { x->x_sym_scr1 = s; } static void tab_sub_src2(t_tab_sub *x, t_symbol *s) { x->x_sym_scr2 = s; } static void tab_sub_dst(t_tab_sub *x, t_symbol *s) { x->x_sym_dst = s; } static void tab_sub_bang(t_tab_sub *x) { int i, n; int ok_src1, ok_src2, ok_dst; iemarray_t *vec_src1, *vec_src2, *vec_dst; ok_src1 = iem_tab_check_arrays(gensym("tab_sub"), x->x_sym_scr1, &x->x_beg_mem_src1, &x->x_size_src1, 0); ok_src2 = iem_tab_check_arrays(gensym("tab_sub"), x->x_sym_scr2, &x->x_beg_mem_src2, &x->x_size_src2, 0); ok_dst = iem_tab_check_arrays(gensym("tab_sub"), x->x_sym_dst, &x->x_beg_mem_dst, &x->x_size_dst, 0); if(ok_src1 && ok_src2 && ok_dst) { if(x->x_size_src1 < x->x_size_dst) n = x->x_size_src1; else n = x->x_size_dst; if(x->x_size_src2 < n) n = x->x_size_src2; vec_src1 = x->x_beg_mem_src1; vec_src2 = x->x_beg_mem_src2; vec_dst = x->x_beg_mem_dst; if(n) { t_garray *a; for(i=0; ix_obj.ob_outlet); a = (t_garray *)pd_findbyclass(x->x_sym_dst, garray_class); garray_redraw(a); } } } static void tab_sub_list(t_tab_sub *x, t_symbol *s, int argc, t_atom *argv) { int beg_src1, beg_src2, beg_dst; int i, n; int ok_src1, ok_src2, ok_dst; iemarray_t *vec_src1, *vec_src2, *vec_dst; if((argc >= 4) && IS_A_FLOAT(argv,0) && IS_A_FLOAT(argv,1) && IS_A_FLOAT(argv,2) && IS_A_FLOAT(argv,3)) { beg_src1 = (int)atom_getintarg(0, argc, argv); beg_src2 = (int)atom_getintarg(1, argc, argv); beg_dst = (int)atom_getintarg(2, argc, argv); n = (int)atom_getintarg(3, argc, argv); if(beg_src1 < 0) beg_src1 = 0; if(beg_src2 < 0) beg_src2 = 0; if(beg_dst < 0) beg_dst = 0; if(n < 0) n = 0; ok_src1 = iem_tab_check_arrays(gensym("tab_sub"), x->x_sym_scr1, &x->x_beg_mem_src1, &x->x_size_src1, beg_src1+n); ok_src2 = iem_tab_check_arrays(gensym("tab_sub"), x->x_sym_scr2, &x->x_beg_mem_src2, &x->x_size_src2, beg_src2+n); ok_dst = iem_tab_check_arrays(gensym("tab_sub"), x->x_sym_dst, &x->x_beg_mem_dst, &x->x_size_dst, beg_dst+n); if(ok_src1 && ok_src2 && ok_dst) { vec_src1 = x->x_beg_mem_src1 + beg_src1; vec_src2 = x->x_beg_mem_src2 + beg_src2; vec_dst = x->x_beg_mem_dst + beg_dst; if(n) { t_garray *a; for(i=0; ix_obj.ob_outlet); a = (t_garray *)pd_findbyclass(x->x_sym_dst, garray_class); garray_redraw(a); } } } else { post("tab_sub-ERROR: list need 4 float arguments:"); post(" source1_offset + source2_offset + destination_offset + number_of_samples_to_sub"); } } static void tab_sub_free(t_tab_sub *x) { } static void *tab_sub_new(t_symbol *s, int argc, t_atom *argv) { t_tab_sub *x = (t_tab_sub *)pd_new(tab_sub_class); t_symbol *src1, *src2, *dst; if((argc >= 3) && IS_A_SYMBOL(argv,0) && IS_A_SYMBOL(argv,1) && IS_A_SYMBOL(argv,2)) { src1 = (t_symbol *)atom_getsymbolarg(0, argc, argv); src2 = (t_symbol *)atom_getsymbolarg(1, argc, argv); dst = (t_symbol *)atom_getsymbolarg(2, argc, argv); } else if((argc >= 2) && IS_A_SYMBOL(argv,0) && IS_A_SYMBOL(argv,1)) { src1 = (t_symbol *)atom_getsymbolarg(0, argc, argv); dst = src1; src2 = (t_symbol *)atom_getsymbolarg(1, argc, argv); } else { post("tab_sub-ERROR: need 3 symbols arguments:"); post(" source1_array_name + source2_array_name + destination_array_name"); return(0); } x->x_sym_scr1 = src1; x->x_sym_scr2 = src2; x->x_sym_dst = dst; outlet_new(&x->x_obj, &s_bang); return(x); } void tab_sub_setup(void) { tab_sub_class = class_new(gensym("tab_sub"), (t_newmethod)tab_sub_new, (t_method)tab_sub_free, sizeof(t_tab_sub), 0, A_GIMME, 0); class_addbang(tab_sub_class, (t_method)tab_sub_bang); class_addlist(tab_sub_class, (t_method)tab_sub_list); class_addmethod(tab_sub_class, (t_method)tab_sub_src1, gensym("src1"), A_DEFSYMBOL, 0); class_addmethod(tab_sub_class, (t_method)tab_sub_src2, gensym("src2"), A_DEFSYMBOL, 0); class_addmethod(tab_sub_class, (t_method)tab_sub_dst, gensym("dst"), A_DEFSYMBOL, 0); // class_sethelpsymbol(tab_sub_class, gensym("iemhelp2/tab_sub-help")); } iem_utils-v0.0.20180206/iem_tab/tab_lt_scalar-help.pd0000644000175000017500000000460512630366350022342 0ustar zmoelnigzmoelnig#N canvas 22 55 884 588 10; #N canvas 0 0 450 300 graph1 0; #X array src 100 float 1; #A 0 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.485714 -0.457143 -0.4 -0.285713 -0.0571409 0.157146 0.328575 0.442861 0.557148 0.628577 0.714292 0.800006 0.85715 0.885721 0.885721 0.871435 0.842864 0.757149 0.557148 0.41429 0.257146 -0.0142835 -0.314285 -0.528572 -0.714287 -0.757145 -0.757145 -0.757145 -0.742859 -0.742859 -0.728573 -0.714287 -0.685715 -0.657144 -0.585715 -0.528572 -0.4 -0.242856 -0.0428551 0.157146 0.342861 0.51429 0.728577 0.800006 0.828578 0.828578 0.828578 0.828578 0.800006 0.771435 0.714292 0.571433 0.41429 0.242861 0.0857169 -0.0571409 -0.242856 -0.385714 -0.542858 -0.685716 -0.757145 -0.800002 -0.828574 -0.828574 -0.814288 -0.800002 -0.785716 -0.757145 -0.728573 -0.67143 -0.585715 -0.471429 -0.271428 -0.0857125 0.114288 0.228575 0.314289 0.385718 0.414285 0.428571 0.457143 0.471428 0.485714 0.485714 0.5 0.5 0.5 0.5 0.5 0.5 0.5; #X coords 0 1 99 -1 200 140 1; #X restore 527 116 graph; #N canvas 0 0 450 300 graph1 0; #X array dst 100 float 0; #X coords 0 1 99 -1 200 140 1; #X restore 527 325 graph; #X obj 61 106 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 59 370 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X msg 178 272 dst dst; #X msg 129 249 src src; #X msg 47 36 0.5; #X msg 82 37 -0.5; #X text 201 332 1.arg: source-name; #X text 201 345 2.arg: destination-name; #X text 31 163 list of 4 floats:; #X text 78 475 IEM KUG; #X text 62 463 musil; #X text 92 463 @; #X text 98 463 iem.at; #X text 61 485 Graz \, Austria; #X text 13 452 (c) Thomas Musil 2000 - 2006; #X text 224 318 initial arguments:; #X text 75 351 output; #X text 229 272 xxx : change destination name; #X text 218 86 the minimum of both array lengths); #X text 182 248 xxx : change source name; #X text 42 179 1.) src onset; #X text 42 190 2.) dst onset; #X text 42 201 3.) n samples to compare; #X text 42 210 4.) compared scalar value; #X text 205 72 (the number of samples which were compared are:; #X text 12 3 tab_lt_scalar; #X text 129 29 compare "less than" the src-array with this scalar to dst-array; #X obj 59 331 tab_lt_scalar src dst; #X msg 48 228 0 0 100 0.5; #X obj 61 78 tab_lt_scalar src dst; #X connect 4 0 29 0; #X connect 5 0 29 0; #X connect 6 0 31 0; #X connect 7 0 31 0; #X connect 29 0 3 0; #X connect 30 0 29 0; #X connect 31 0 2 0; iem_utils-v0.0.20180206/iem_tab/tab_cross_corr-help.pd0000644000175000017500000000635012630366350022553 0ustar zmoelnigzmoelnig#N canvas 107 80 1053 581 10; #X obj 55 51 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 55 92 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #N canvas 0 22 478 328 init_tables 0; #X obj 45 113 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0 1 ; #X obj 239 151 noise~; #X obj 114 193 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 134 234 tabwrite~ ref; #X obj 238 234 tabwrite~ meas; #X obj 149 15 inlet; #X obj 149 37 t b; #X obj 188 99 del 100; #X msg 53 82 1; #X msg 188 122 0; #X obj 167 64 del 100; #N canvas 0 22 238 185 dsp 0; #X msg 28 63 \; pd dsp \$1; #X obj 28 34 inlet; #X connect 1 0 0 0; #X restore 45 139 pd dsp; #N canvas 448 145 462 312 delay 0; #X obj 75 169 outlet~; #X obj 75 23 inlet~; #N canvas 0 22 458 308 del1 0; #X obj 75 169 outlet~; #X obj 75 23 inlet~; #X obj 105 101 delwrite~ \$0delz 5; #X connect 1 0 2 0; #X connect 1 0 0 0; #X restore 75 66 pd del1; #N canvas 0 22 458 308 del2 0; #X obj 75 169 outlet~; #X obj 75 23 inlet~; #X obj 75 122 delread~ \$0delz 1.31; #X connect 2 0 0 0; #X restore 75 116 pd del2; #X connect 1 0 2 0; #X connect 2 0 3 0; #X connect 3 0 0 0; #X restore 136 190 pd delay; #X connect 0 0 11 0; #X connect 1 0 4 0; #X connect 1 0 12 0; #X connect 2 0 3 0; #X connect 2 0 4 0; #X connect 5 0 6 0; #X connect 6 0 8 0; #X connect 6 0 10 0; #X connect 7 0 9 0; #X connect 8 0 0 0; #X connect 9 0 0 0; #X connect 10 0 7 0; #X connect 10 0 2 0; #X connect 12 0 3 0; #X restore 636 311 pd init_tables; #X obj 636 266 loadbang; #N canvas 0 22 450 300 (subpatch) 0; #X array ref 200 float 0; #X coords 0 1 199 -1 199 100 1; #X restore 483 20 graph; #N canvas 0 22 450 300 (subpatch) 0; #X array meas 100 float 0; #X coords 0 1 99 -1 99 100 1; #X restore 541 140 graph; #N canvas 0 22 450 300 (subpatch) 0; #X array cross_corr 100 float 0; #X coords 0 1 99 -1 99 100 1; #X restore 483 260 graph; #X text 94 459 IEM KUG; #X text 73 447 musil; #X text 108 447 @; #X text 116 447 iem.at; #X text 77 469 Graz \, Austria; #X text 380 381 initial arguments:; #X text 12 7 tab_cross_corr; #X text 77 37 correlates the 2nd array "measured" with the 1st array "reference" to the destination array "cross_corr"; #X text 78 92 (the number of samples which were correlated are: the positive minimum of the difference (src1-src2) and dst array lengths) ; #X text 358 393 1.arg: source1-name; #X text 358 405 2.arg: source2-name; #X text 358 417 3.arg: destination-name; #X text 533 452 calculation in ms; #X text 358 441 5.arg: delay time per destination sample; #X msg 63 257 bang; #X msg 80 278 time 1; #X msg 135 361 dst cross_corr; #X msg 124 340 src2 meas; #X msg 109 319 src1 ref; #X obj 636 290 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X msg 97 297 factor 0.02; #X obj 63 389 tab_cross_corr ref meas cross_corr 0.02 1; #X text 62 155 !! array length of src1 > array length of src2 !!; #X text 29 436 (c) Thomas Musil 2000 - 2009; #X obj 55 70 tab_cross_corr ref meas cross_corr 0.04 1; #X text 358 429 4.arg: scaling factor; #X connect 0 0 31 0; #X connect 3 0 26 0; #X connect 21 0 28 0; #X connect 22 0 28 0; #X connect 23 0 28 0; #X connect 24 0 28 0; #X connect 25 0 28 0; #X connect 26 0 2 0; #X connect 27 0 28 0; #X connect 31 0 1 0; iem_utils-v0.0.20180206/iem_tab/tab_fft-help.pd0000644000175000017500000002446512630366350021163 0ustar zmoelnigzmoelnig#N canvas 29 22 965 544 10; #N canvas 0 22 450 300 (subpatch) 0; #X array src_re 100 float 0; #X coords 0 1 99 -1 199 100 1; #X restore 694 10 graph; #N canvas 0 22 450 300 (subpatch) 0; #X array dst_re 100 float 0; #X coords 0 1 99 -1 199 100 1; #X restore 694 239 graph; #X obj 24 47 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 24 122 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 62 371 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #N canvas 0 22 450 300 (subpatch) 0; #X array dst_im 100 float 0; #X coords 0 1 99 -1 199 100 1; #X restore 694 353 graph; #X msg 103 276 dst_re dst_re; #X msg 118 299 dst_im dst_im; #X msg 139 322 fftsize 64; #X floatatom 473 22 5 0 63 0 - - -; #X msg 546 341 \; dst_re const 0 \; dst_im const 0; #X text 10 0 tab_fft; #X text 93 -1 complex FTT with arrays; #X text 102 464 IEM KUG; #X text 81 452 musil; #X text 116 452 @; #X text 124 452 iem.at; #X text 85 474 Graz \, Austria; #N canvas 0 22 474 324 generate_a_dirac 0; #X obj 61 62 clip 0 63; #X obj 61 32 inlet; #X msg 60 103 \; src_re const 0 \; src_re \$1 1; #X connect 0 0 2 0; #X connect 1 0 0 0; #X restore 474 41 pd generate_a_dirac; #X floatatom 514 22 5 -32 32 0 - - -; #N canvas 0 22 531 484 generate_a_cos 0; #X obj 120 18 inlet; #X obj 219 176 t f f; #X obj 219 211 / 32; #X obj 219 232 * 3.14159; #X obj 219 283 cos; #X obj 219 257 * 8; #X obj 219 308 / 32; #X obj 219 127 t b f; #X obj 219 331 tabwrite src_re; #X obj 120 43 moses 0; #X obj 39 178 t f f; #X obj 39 213 / 32; #X obj 39 234 * 3.14159; #X obj 39 285 cos; #X obj 39 259 * 8; #X obj 39 129 t b f; #X obj 39 333 tabwrite src_re; #X obj 90 70 * -1; #X obj 39 310 / -32; #N canvas 193 158 454 304 counter 0; #X obj 108 25 inlet; #X obj 109 163 outlet; #X obj 109 133 f; #X obj 142 133 + 1; #X obj 108 50 t b b; #X msg 154 76 0; #X msg 109 75 64; #X obj 110 98 until; #X connect 0 0 4 0; #X connect 2 0 3 0; #X connect 2 0 1 0; #X connect 3 0 2 1; #X connect 4 0 6 0; #X connect 4 1 5 0; #X connect 5 0 2 1; #X connect 6 0 7 0; #X connect 7 0 2 0; #X restore 219 151 pd counter; #N canvas 193 158 454 304 counter 0; #X obj 108 25 inlet; #X obj 109 163 outlet; #X obj 109 133 f; #X obj 142 133 + 1; #X obj 108 50 t b b; #X msg 154 76 0; #X msg 109 75 64; #X obj 110 98 until; #X connect 0 0 4 0; #X connect 2 0 3 0; #X connect 2 0 1 0; #X connect 3 0 2 1; #X connect 4 0 6 0; #X connect 4 1 5 0; #X connect 5 0 2 1; #X connect 6 0 7 0; #X connect 7 0 2 0; #X restore 38 154 pd counter; #X obj 219 106 clip 0 32; #X obj 39 108 clip 0 32; #X connect 0 0 9 0; #X connect 1 0 2 0; #X connect 1 1 8 1; #X connect 2 0 3 0; #X connect 3 0 5 0; #X connect 4 0 6 0; #X connect 5 0 4 0; #X connect 6 0 8 0; #X connect 7 0 19 0; #X connect 7 1 5 1; #X connect 9 0 17 0; #X connect 9 1 21 0; #X connect 10 0 11 0; #X connect 10 1 16 1; #X connect 11 0 12 0; #X connect 12 0 14 0; #X connect 13 0 18 0; #X connect 14 0 13 0; #X connect 15 0 20 0; #X connect 15 1 14 1; #X connect 17 0 22 0; #X connect 18 0 16 0; #X connect 19 0 1 0; #X connect 20 0 10 0; #X connect 21 0 7 0; #X connect 22 0 15 0; #X restore 514 61 pd generate_a_cos; #X floatatom 555 22 5 -31 31 0 - - -; #N canvas 0 22 491 415 generate_a_sin 0; #X obj 102 37 inlet; #X obj 246 182 t f f; #X obj 246 217 / 32; #X obj 246 238 * 3.14159; #X obj 246 263 * 8; #X obj 246 314 / 32; #X obj 246 112 clip 0 31; #X obj 246 133 t b f; #X obj 246 337 tabwrite src_re; #X obj 246 289 sin; #X obj 54 180 t f f; #X obj 54 215 / 32; #X obj 54 236 * 3.14159; #X obj 54 261 * 8; #X obj 54 110 clip 0 31; #X obj 54 132 t b f; #X obj 54 335 tabwrite src_re; #X obj 54 287 sin; #X obj 54 312 / -32; #X obj 102 60 moses 0; #X obj 54 88 * -1; #N canvas 193 158 454 304 counter 0; #X obj 108 25 inlet; #X obj 109 163 outlet; #X obj 109 133 f; #X obj 142 133 + 1; #X obj 108 50 t b b; #X msg 154 76 0; #X msg 109 75 64; #X obj 110 98 until; #X connect 0 0 4 0; #X connect 2 0 3 0; #X connect 2 0 1 0; #X connect 3 0 2 1; #X connect 4 0 6 0; #X connect 4 1 5 0; #X connect 5 0 2 1; #X connect 6 0 7 0; #X connect 7 0 2 0; #X restore 54 156 pd counter; #N canvas 193 158 454 304 counter 0; #X obj 108 25 inlet; #X obj 109 163 outlet; #X obj 109 133 f; #X obj 142 133 + 1; #X obj 108 50 t b b; #X msg 154 76 0; #X msg 109 75 64; #X obj 110 98 until; #X connect 0 0 4 0; #X connect 2 0 3 0; #X connect 2 0 1 0; #X connect 3 0 2 1; #X connect 4 0 6 0; #X connect 4 1 5 0; #X connect 5 0 2 1; #X connect 6 0 7 0; #X connect 7 0 2 0; #X restore 246 156 pd counter; #X connect 0 0 19 0; #X connect 1 0 2 0; #X connect 1 1 8 1; #X connect 2 0 3 0; #X connect 3 0 4 0; #X connect 4 0 9 0; #X connect 5 0 8 0; #X connect 6 0 7 0; #X connect 7 0 22 0; #X connect 7 1 4 1; #X connect 9 0 5 0; #X connect 10 0 11 0; #X connect 10 1 16 1; #X connect 11 0 12 0; #X connect 12 0 13 0; #X connect 13 0 17 0; #X connect 14 0 15 0; #X connect 15 0 21 0; #X connect 15 1 13 1; #X connect 17 0 18 0; #X connect 18 0 16 0; #X connect 19 0 20 0; #X connect 19 1 6 0; #X connect 20 0 14 0; #X connect 21 0 10 0; #X connect 22 0 1 0; #X restore 555 82 pd generate_a_sin; #X text 299 365 initial arguments:; #X text 45 56 calculates a complex fourier transformation of complex src-arrays to complex dst-arrays; #X text 37 147 list of 4 floats:; #X text 49 178 3.) dst_re-onset; #X text 49 188 4.) dst_im-onset; #X text 49 158 1.) src_re-onset; #X text 49 168 2.) src_im-onset; #X msg 62 207 20 20 30 30; #X text 259 412 4.arg: imag_destination-name; #X text 259 400 3.arg: real_destination-name; #X text 259 389 2.arg: imag_source-name; #X text 259 378 1.arg: real_source-name; #X text 259 424 5.arg: fftsize; #N canvas 0 22 450 300 (subpatch) 0; #X array src_im 100 float 0; #X coords 0 1 99 -1 199 100 1; #X restore 694 124 graph; #X obj 24 94 tab_fft src_re src_im dst_re dst_im 64; #X msg 76 230 src_re src_re; #X msg 90 253 src_im src_im; #X obj 62 348 tab_fft src_re src_im dst_re dst_im 64; #X msg 546 283 \; src_re const 0 \; src_im const 0; #X floatatom 474 132 5 0 63 0 - - -; #N canvas 0 22 478 328 generate_a_dirac 0; #X obj 61 62 clip 0 63; #X obj 61 32 inlet; #X msg 62 88 \; src_im const 0 \; src_im \$1 1; #X connect 0 0 2 0; #X connect 1 0 0 0; #X restore 474 151 pd generate_a_dirac; #X floatatom 514 132 5 -32 32 0 - - -; #N canvas 0 22 495 419 generate_a_cos 0; #X obj 120 18 inlet; #X obj 219 176 t f f; #X obj 219 211 / 32; #X obj 219 232 * 3.14159; #X obj 219 283 cos; #X obj 219 257 * 8; #X obj 219 308 / 32; #X obj 219 127 t b f; #X obj 120 43 moses 0; #X obj 39 178 t f f; #X obj 39 213 / 32; #X obj 39 234 * 3.14159; #X obj 39 285 cos; #X obj 39 259 * 8; #X obj 39 129 t b f; #X obj 90 70 * -1; #X obj 39 310 / -32; #X obj 40 334 tabwrite src_im; #X obj 220 331 tabwrite src_im; #N canvas 193 158 454 304 counter 0; #X obj 108 25 inlet; #X obj 109 163 outlet; #X obj 109 133 f; #X obj 142 133 + 1; #X obj 108 50 t b b; #X msg 154 76 0; #X msg 109 75 64; #X obj 110 98 until; #X connect 0 0 4 0; #X connect 2 0 3 0; #X connect 2 0 1 0; #X connect 3 0 2 1; #X connect 4 0 6 0; #X connect 4 1 5 0; #X connect 5 0 2 1; #X connect 6 0 7 0; #X connect 7 0 2 0; #X restore 39 153 pd counter; #N canvas 193 158 454 304 counter 0; #X obj 108 25 inlet; #X obj 109 163 outlet; #X obj 109 133 f; #X obj 142 133 + 1; #X obj 108 50 t b b; #X msg 154 76 0; #X msg 109 75 64; #X obj 110 98 until; #X connect 0 0 4 0; #X connect 2 0 3 0; #X connect 2 0 1 0; #X connect 3 0 2 1; #X connect 4 0 6 0; #X connect 4 1 5 0; #X connect 5 0 2 1; #X connect 6 0 7 0; #X connect 7 0 2 0; #X restore 219 153 pd counter; #X obj 218 106 clip 0 32; #X obj 39 108 clip 0 32; #X connect 0 0 8 0; #X connect 1 0 2 0; #X connect 1 1 18 1; #X connect 2 0 3 0; #X connect 3 0 5 0; #X connect 4 0 6 0; #X connect 5 0 4 0; #X connect 6 0 18 0; #X connect 7 0 20 0; #X connect 7 1 5 1; #X connect 8 0 15 0; #X connect 8 1 21 0; #X connect 9 0 10 0; #X connect 9 1 17 1; #X connect 10 0 11 0; #X connect 11 0 13 0; #X connect 12 0 16 0; #X connect 13 0 12 0; #X connect 14 0 19 0; #X connect 14 1 13 1; #X connect 15 0 22 0; #X connect 16 0 17 0; #X connect 19 0 9 0; #X connect 20 0 1 0; #X connect 21 0 7 0; #X connect 22 0 14 0; #X restore 514 171 pd generate_a_cos; #X floatatom 555 132 5 -31 31 0 - - -; #N canvas 0 22 491 415 generate_a_sin 0; #X obj 102 37 inlet; #X obj 246 182 t f f; #X obj 246 217 / 32; #X obj 246 238 * 3.14159; #X obj 246 263 * 8; #X obj 246 314 / 32; #X obj 246 112 clip 0 31; #X obj 246 133 t b f; #X obj 246 289 sin; #X obj 54 180 t f f; #X obj 54 215 / 32; #X obj 54 236 * 3.14159; #X obj 54 261 * 8; #X obj 54 110 clip 0 31; #X obj 54 131 t b f; #X obj 54 287 sin; #X obj 54 312 / -32; #X obj 102 60 moses 0; #X obj 54 88 * -1; #X obj 246 337 tabwrite src_im; #X obj 54 336 tabwrite src_im; #N canvas 193 158 454 304 counter 0; #X obj 108 25 inlet; #X obj 109 163 outlet; #X obj 109 133 f; #X obj 142 133 + 1; #X obj 108 50 t b b; #X msg 154 76 0; #X msg 109 75 64; #X obj 110 98 until; #X connect 0 0 4 0; #X connect 2 0 3 0; #X connect 2 0 1 0; #X connect 3 0 2 1; #X connect 4 0 6 0; #X connect 4 1 5 0; #X connect 5 0 2 1; #X connect 6 0 7 0; #X connect 7 0 2 0; #X restore 54 156 pd counter; #N canvas 193 158 454 304 counter 0; #X obj 108 25 inlet; #X obj 109 163 outlet; #X obj 109 133 f; #X obj 142 133 + 1; #X obj 108 50 t b b; #X msg 154 76 0; #X msg 109 75 64; #X obj 110 98 until; #X connect 0 0 4 0; #X connect 2 0 3 0; #X connect 2 0 1 0; #X connect 3 0 2 1; #X connect 4 0 6 0; #X connect 4 1 5 0; #X connect 5 0 2 1; #X connect 6 0 7 0; #X connect 7 0 2 0; #X restore 246 156 pd counter; #X connect 0 0 17 0; #X connect 1 0 2 0; #X connect 1 1 19 1; #X connect 2 0 3 0; #X connect 3 0 4 0; #X connect 4 0 8 0; #X connect 5 0 19 0; #X connect 6 0 7 0; #X connect 7 0 22 0; #X connect 7 1 4 1; #X connect 8 0 5 0; #X connect 9 0 10 0; #X connect 9 1 20 1; #X connect 10 0 11 0; #X connect 11 0 12 0; #X connect 12 0 15 0; #X connect 13 0 14 0; #X connect 14 0 21 0; #X connect 14 1 12 1; #X connect 15 0 16 0; #X connect 16 0 20 0; #X connect 17 0 18 0; #X connect 17 1 6 0; #X connect 18 0 13 0; #X connect 21 0 9 0; #X connect 22 0 1 0; #X restore 555 192 pd generate_a_sin; #X text 37 441 (c) Thomas Musil 2000 - 2009; #X connect 2 0 37 0; #X connect 6 0 40 0; #X connect 7 0 40 0; #X connect 8 0 40 0; #X connect 9 0 18 0; #X connect 19 0 20 0; #X connect 21 0 22 0; #X connect 30 0 40 0; #X connect 37 0 3 0; #X connect 38 0 40 0; #X connect 39 0 40 0; #X connect 40 0 4 0; #X connect 42 0 43 0; #X connect 44 0 45 0; #X connect 46 0 47 0; iem_utils-v0.0.20180206/iem_tab/tab_min_max-help.pd0000644000175000017500000000460612630366350022027 0ustar zmoelnigzmoelnig#N canvas 82 83 782 436 10; #N canvas 0 0 450 300 graph1 0; #X array src 100 float 1; #A 0 -0.442858 -0.414287 -0.385715 -0.342858 -0.314287 -0.257144 -0.128572 -0.0428573 0.128572 0.228572 0.285715 0.328572 0.400001 0.414287 0.457144 0.457144 0.442858 0.385715 0.314287 0.257144 0.214286 0.1 0.0428572 -0.0142858 -0.0428573 -0.114286 -0.142858 -0.200001 -0.242858 -0.285715 -0.328572 -0.342858 -0.37143 -0.385715 -0.414287 -0.414287 -0.414287 -0.414287 -0.400001 -0.357144 -0.314287 -0.257144 -0.185715 -0.0714288 0.0142857 0.0571429 0.185715 0.185715 0.200001 0.214286 0.214286 0.214286 0.228572 0.228572 0.214286 0.200001 0.185715 0.171429 0.142857 0.1 0.114286 0.0714285 -0.071429 -0.242858 -0.300001 -0.328573 -0.357144 -0.37143 -0.385715 -0.400001 -0.442858 -0.457144 -0.47143 -0.457144 -0.428573 -0.400001 -0.378573 -0.328572 -0.271429 -0.242858 -0.200001 -0.128572 -0.0428574 -0.0285717 0.0142858 0.114286 0.128572 0.185715 0.214286 0.257144 0.285715 0.314287 0.342858 0.357144 0.357144 0.357144 0.357144 0.357144 0.342858 0.328572; #X coords 0 1 99 -1 200 140 1; #X restore 534 20 graph; #X obj 61 34 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 61 109 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 59 297 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X text 205 273 1.arg: source-name; #X msg 101 216 src src; #X floatatom 103 106 5 0 0 0 - - -; #X floatatom 146 107 5 0 0 0 - - -; #X text 154 121 max; #X floatatom 101 323 5 0 0 0 - - -; #X floatatom 144 339 5 0 0 0 - - -; #X msg 59 196 35 50; #X text 75 387 IEM KUG; #X text 59 375 musil; #X text 89 375 @; #X text 95 375 iem.at; #X text 58 397 Graz \, Austria; #X text 10 364 (c) Thomas Musil 2000 - 2006; #X text 229 261 initial arguments:; #X text 65 283 output; #X text 152 216 xxx : change source name; #X text 43 153 list of 2 floats:; #X text 55 163 1.) src onset; #X text 151 322 maximum value output; #X text 11 9 tab_min_max; #X text 85 32 calculate minimum and maximum element value of array; #X text 55 174 2.) n samples to calculate minimum and maximum; #X text 110 120 min; #X obj 61 81 tab_min_max src; #X text 108 304 minimum value output; #X obj 59 265 tab_min_max src; #X connect 1 0 28 0; #X connect 5 0 30 0; #X connect 11 0 30 0; #X connect 28 0 2 0; #X connect 28 1 6 0; #X connect 28 2 7 0; #X connect 30 0 3 0; #X connect 30 1 9 0; #X connect 30 2 10 0; iem_utils-v0.0.20180206/iem_tab/tab_carth2polar-help.pd0000644000175000017500000000512712630366350022617 0ustar zmoelnigzmoelnig#N canvas 132 30 866 532 10; #N canvas 0 22 450 300 (subpatch) 0; #X array real 100 float 0; #X coords 0 1 99 -1 100 40 1; #X restore 451 29 graph; #X obj 61 43 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 61 106 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 40 381 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #N canvas 0 22 450 300 (subpatch) 0; #X array imag 100 float 0; #X coords 0 1 99 -1 100 40 1; #X restore 451 71 graph; #N canvas 0 22 450 300 (subpatch) 0; #X array mag 100 float 0; #X coords 0 1 99 -1 100 40 1; #X restore 596 29 graph; #N canvas 0 22 450 300 (subpatch) 0; #X array arg 100 float 0; #X coords 0 1 99 -1 100 40 1; #X restore 596 71 graph; #X msg 696 220 2; #X floatatom 647 276 5 0 0 0 - - -; #X floatatom 730 277 5 0 0 0 - - -; #X obj 710 131 loadbang; #X text 96 444 IEM KUG; #X text 75 432 musil; #X text 110 432 @; #X text 118 432 iem.at; #X text 79 454 Graz \, Austria; #X text 324 276 initial arguments:; #X text 81 39 invert the complex src-arrays to the complex dst-arrays ; #X text 98 113 the minimum of the 4 array lengths); #X text 85 99 (the number of samples which were inverted are:; #X text 302 288 1.arg: real_source-name; #X text 302 300 2.arg: imag_source-name; #X text 53 160 list of 5 floats:; #X msg 40 229 0 0 0 0 64; #X text 12 7 tab_carth2polar; #X obj 684 316 * 360; #X floatatom 684 341 5 0 0 0 - - -; #X text 74 179 2.) src_imag-onset; #X text 74 169 1.) src_real-onset; #X text 74 209 5.) number of samples to convert; #X msg 710 152 \; real const 0.75 \; imag const -0.75; #X msg 584 153 \; real const 0.75 \; imag const 0.75; #X text 302 312 3.arg: magnitude_destination-name; #X text 302 323 4.arg: phase_argument_destination-name; #X text 74 189 3.) dst_magnitude-onset; #X text 74 199 4.) dst_phase_argument-onset; #X obj 647 254 tabread mag; #X obj 730 253 tabread arg; #X obj 61 78 tab_carth2polar real imag mag arg; #X obj 40 360 tab_carth2polar real imag mag arg; #X msg 143 331 dst_arg arg; #X msg 110 306 dst_mag mag; #X msg 91 279 src_im imag; #X msg 74 253 src_re real; #X floatatom 743 352 5 0 0 0 - - -; #X obj 743 304 * 2; #X obj 743 327 * 3.14159; #X text 31 421 (c) Thomas Musil 2000 - 2009; #X connect 1 0 38 0; #X connect 7 0 36 0; #X connect 7 0 37 0; #X connect 9 0 25 0; #X connect 9 0 45 0; #X connect 10 0 30 0; #X connect 23 0 39 0; #X connect 25 0 26 0; #X connect 36 0 8 0; #X connect 37 0 9 0; #X connect 38 0 2 0; #X connect 39 0 3 0; #X connect 40 0 39 0; #X connect 41 0 39 0; #X connect 42 0 39 0; #X connect 43 0 39 0; #X connect 45 0 46 0; #X connect 46 0 44 0; iem_utils-v0.0.20180206/iem_tab/tab_dbtorms-help.pd0000644000175000017500000000441612630366350022050 0ustar zmoelnigzmoelnig#N canvas 369 22 790 417 10; #N canvas 0 22 450 300 (subpatch) 0; #X array src 100 float 1; #A 0 0.0214324 5.77858 10.0643 15.0643 17.2072 22.2072 31.4929 33.6358 37.2072 38.9929 40.7786 45.0644 49.3501 51.4929 53.6358 55.4215 57.2072 59.3501 61.493 62.6834 63.8739 65.0644 66.8501 68.6358 70.4215 70.7787 71.493 72.9215 73.2787 73.6358 75.0644 75.4216 75.7787 76.493 76.8501 77.2073 77.5644 77.9216 78.6358 79.3501 80.0644 80.7787 81.493 81.8501 82.2073 83.6358 84.3501 85.0644 85.4216 85.7787 87.2073 87.5644 87.9216 88.6359 89.3501 90.0644 90.7787 90.7787 91.493 92.2073 92.2073 92.2073 92.2073 92.2073 92.2073 92.2073 93.6359 93.6359 93.6359 93.6359 93.6359 93.6359 93.6359 93.6359 93.6359 93.6359 93.6359 93.6359 93.6359 94.3502 94.3502 94.3502 95.0644 95.0644 95.7787 96.493 96.493 96.493 97.9216 98.6359 98.6359 99.3502 99.3502 99.3502 100.064 100.064 100.064 100.064 100.779 100.779; #X coords 0 100 99 0 200 140 1; #X restore 534 10 graph; #N canvas 0 22 450 300 (subpatch) 0; #X array dst 100 float 0; #X coords 0 1 99 0 200 140 1; #X restore 534 166 graph; #X obj 61 31 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 61 106 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 59 301 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X msg 59 211 50 20 50; #X text 44 154 list of 3 floats:; #X text 222 273 1.arg: source-name; #X text 222 286 2.arg: destination-name; #X msg 154 213 src src; #X msg 185 234 dst dst; #X text 78 365 IEM KUG; #X text 57 353 musil; #X text 92 353 @; #X text 100 353 iem.at; #X text 61 375 Graz \, Austria; #X text 56 165 1.) src onset; #X text 56 175 2.) dst onset; #X text 231 261 initial arguments:; #X text 68 283 output; #X text 208 213 xxx : change source name; #X text 240 233 xxx : change destination name; #X text 205 69 (the number of samples which are copied are:; #X text 218 83 the minimum of both array lengths); #X text 13 342 (c) Thomas Musil 2000 - 2010; #X text 12 4 tab_dbtorms; #X text 90 30 calculates the dbtorms-value from src to dst; #X obj 61 79 tab_dbtorms src dst; #X obj 59 264 tab_dbtorms src dst; #X text 57 185 3.) n samples of dbtorms; #X connect 2 0 27 0; #X connect 5 0 28 0; #X connect 9 0 28 0; #X connect 10 0 28 0; #X connect 27 0 3 0; #X connect 28 0 4 0; iem_utils-v0.0.20180206/iem_tab/tab_ge-help.pd0000644000175000017500000000651012630366350020766 0ustar zmoelnigzmoelnig#N canvas 116 92 859 564 10; #N canvas 0 0 450 300 graph1 0; #X array src1 100 float 1; #A 0 -0.442858 -0.414287 -0.385715 -0.342858 -0.314287 -0.257144 -0.128572 -0.0428573 0.128572 0.228572 0.285715 0.328572 0.400001 0.414287 0.457144 0.457144 0.442858 0.385715 0.314287 0.257144 0.214286 0.1 0.0428572 -0.0142858 -0.0428573 -0.114286 -0.142858 -0.200001 -0.242858 -0.285715 -0.328572 -0.342858 -0.37143 -0.385715 -0.414287 -0.414287 -0.414287 -0.414287 -0.400001 -0.357144 -0.314287 -0.257144 -0.185715 -0.0714288 0.0142857 0.0571429 0.171429 0.328572 0.400001 0.442858 0.47143 0.485715 0.485715 0.485715 0.485715 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.485715 0.471429 0.457144 0.442858 0.442858 0.428572 0.414286 0.385715 0.357143 0.342858 0.314286 0.285715 0.242857 0.185714 0.142857 0.114286 0.085714; #X coords 0 1 99 -1 200 140 1; #X restore 534 10 graph; #N canvas 0 0 450 300 graph1 0; #X array dst 100 float 0; #X coords 0 1 99 -1 200 140 1; #X restore 535 358 graph; #X obj 61 31 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 61 106 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 59 340 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X msg 255 276 dst dst; #N canvas 0 0 450 300 graph1 0; #X array src2 100 float 1; #A 0 0.557135 0.57142 0.557135 0.528564 0.499992 0.428564 0.357136 0.299994 0.0999951 -0.0571467 -0.157146 -0.228574 -0.300002 -0.328573 -0.357145 -0.385716 -0.400001 -0.400001 -0.385716 -0.385716 -0.37143 -0.364287 -0.357145 -0.328573 -0.300002 -0.271431 -0.24286 -0.214288 -0.14286 -0.085718 -0.0428611 -4.28595e-006 0.0428526 0.099995 0.171423 0.21428 0.257137 0.328565 0.371422 0.442849 0.457135 0.471421 0.471421 0.485706 0.485706 0.485706 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.485714 0.471429 0.457135 0.428564 0.371422 0.314279 0.242851 0.0857095 -0.0857178 -0.271431 -0.400001 -0.514286 -0.542858 -0.557143 -0.585714 -0.585714 -0.6 -0.6 -0.614286 -0.614286 -0.614286; #X coords 0 1 99 -1 200 140 1; #X restore 535 161 graph; #X msg 136 233 src1 src1; #X msg 195 255 src2 src2; #X msg 59 211 50 50 20 50; #X text 45 139 list of 4 floats:; #X text 212 353 3.arg: destination-name; #X text 78 435 IEM KUG; #X text 62 423 musil; #X text 92 423 @; #X text 98 423 iem.at; #X text 61 445 Graz \, Austria; #X text 13 412 (c) Thomas Musil 2000 - 2006; #X text 234 312 initial arguments:; #X text 72 319 output; #X text 306 275 xxx : change destination name; #X text 208 86 the minimum of the 3 array lengths); #X text 56 177 3.) dst onset; #X text 56 155 1.) src_1 onset; #X text 56 166 2.) src_2 onset; #X text 199 233 xxx : change source name 1; #X text 257 255 xxx : change source name 2; #X text 211 326 1.arg: source-name 1; #X text 211 339 2.arg: source-name 2; #X text 195 72 (the number of samples which were compared are:; #X text 56 187 4.) n samples to compare; #X text 12 3 tab_ge; #X obj 61 78 tab_ge src1 src2 dst; #X obj 59 301 tab_ge src1 src2 dst; #X text 90 29 compare "greater than or equal to" the 2 src-arrays to dst-array; #X connect 2 0 32 0; #X connect 5 0 33 0; #X connect 7 0 33 0; #X connect 8 0 33 0; #X connect 9 0 33 0; #X connect 32 0 3 0; #X connect 33 0 4 0; iem_utils-v0.0.20180206/iem_tab/tab_sqrt-help.pd0000644000175000017500000000461212630366350021365 0ustar zmoelnigzmoelnig#N canvas 116 92 786 482 10; #N canvas 0 0 450 300 graph1 0; #X array src 100 float 1; #A 0 0.916135 0.888992 0.83593 0.810011 0.784501 0.759399 0.734704 0.710418 0.663071 0.640009 0.595111 0.573274 0.551845 0.510212 0.490007 0.450823 0.413271 0.395108 0.377353 0.326536 0.310413 0.279392 0.264494 0.250004 0.222248 0.196126 0.171635 0.160003 0.148778 0.127553 0.0987772 0.0900016 0.0736748 0.0661237 0.0522459 0.0459193 0.0344905 0.0246944 0.0204086 0.0130616 0.0100003 0.00326543 0.00183682 0.000816378 5.03628e-013 0.000204064 0.0018367 0.00510201 0.00510201 0.00999999 0.0165306 0.0204082 0.0293879 0.0400002 0.0459187 0.05898 0.0661229 0.0816333 0.0816333 0.0987763 0.10796 0.127552 0.13796 0.148777 0.160001 0.183675 0.196124 0.208982 0.235921 0.250002 0.279391 0.294697 0.310411 0.343065 0.360004 0.377351 0.395106 0.431841 0.470209 0.490005 0.510209 0.530822 0.551843 0.573271 0.595108 0.617354 0.640007 0.663068 0.686538 0.710416 0.734702 0.734702 0.759396 0.784498 0.810009 0.835928 0.862254 0.862254 0.88899 0.916133; #X coords 0 1 99 -1 200 140 1; #X restore 534 10 graph; #N canvas 0 0 450 300 graph1 0; #X array dst 100 float 0; #X coords 0 1 99 -1 200 140 1; #X restore 534 176 graph; #X obj 60 35 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 60 110 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 58 345 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X msg 58 215 50 20 50; #X text 194 318 1.arg: source-name; #X text 194 331 2.arg: destination-name; #X msg 115 235 src src; #X msg 165 253 dst dst; #X text 184 73 (the number of samples which are copied are:; #X text 197 87 the minimum of both array lengths); #X text 43 168 list of 3 floats:; #X text 77 419 IEM KUG; #X text 61 407 musil; #X text 91 407 @; #X text 97 407 iem.at; #X text 60 429 Graz \, Austria; #X text 12 396 (c) Thomas Musil 2000 - 2006; #X text 55 179 1.) src onset; #X text 55 189 2.) dst onset; #X text 225 306 initial arguments:; #X text 73 323 output; #X text 172 233 xxx : change source name; #X text 218 252 xxx : change destination name; #X text 11 7 tab_sqrt; #X text 89 33 copy square root value from src to dst; #X obj 60 82 tab_sqrt src dst; #X text 55 198 3.) n samples to copy square root; #X obj 58 306 tab_sqrt src dst; #X connect 2 0 27 0; #X connect 5 0 29 0; #X connect 8 0 29 0; #X connect 9 0 29 0; #X connect 27 0 3 0; #X connect 29 0 4 0; iem_utils-v0.0.20180206/iem_tab/tab_sum-help.pd0000644000175000017500000000426612630366350021205 0ustar zmoelnigzmoelnig#N canvas 116 92 798 425 10; #N canvas 0 22 450 300 (subpatch) 0; #X array src 100 float 1; #A 0 -0.442858 -0.414287 -0.385715 -0.342858 -0.314287 -0.257144 -0.128572 -0.0428573 0.128572 0.228572 0.285715 0.328572 0.400001 0.414287 0.457144 0.457144 0.442858 0.385715 0.314287 0.257144 0.214286 0.1 0.0428572 -0.0142858 -0.0428573 -0.114286 -0.142858 -0.200001 -0.242858 -0.285715 -0.328572 -0.342858 -0.37143 -0.385715 -0.414287 -0.414287 -0.414287 -0.414287 -0.400001 -0.357144 -0.314287 -0.257144 -0.185715 -0.0714288 0.0142857 0.0571429 0.171429 0.328572 0.400001 0.442858 0.47143 0.485715 0.485715 0.485715 0.485715 0.485715 0.442858 0.357144 0.242858 0.185715 0.114286 0.0714285 -0.071429 -0.242858 -0.300001 -0.328573 -0.357144 -0.37143 -0.385715 -0.400001 -0.442858 -0.457144 -0.47143 -0.457144 -0.428573 -0.400001 -0.378573 -0.328572 -0.271429 -0.242858 -0.200001 -0.128572 -0.0428574 -0.0285717 0.0142858 0.114286 0.128572 0.185715 0.214286 0.257144 0.285715 0.314287 0.342858 0.357144 0.357144 0.357144 0.357144 0.357144 0.342858 0.328572; #X coords 0 1 99 -1 200 140 1; #X restore 524 40 graph; #X obj 61 31 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 61 106 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 59 301 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X msg 93 213 src src; #X obj 61 78 tab_sum src; #X floatatom 122 104 5 0 0 0 - - -; #X obj 59 244 tab_sum src; #X msg 59 188 50 20; #X floatatom 120 305 5 0 0 0 - - -; #X text 75 364 IEM KUG; #X text 54 352 musil; #X text 89 352 @; #X text 97 352 iem.at; #X text 58 374 Graz \, Austria; #X text 90 29 calc sum of all array elements; #X text 182 234 initial arguments:; #X text 65 260 output; #X text 11 6 tab_sum; #X text 55 171 2.) n samples to calc sum; #X text 142 213 xxx : change source name; #X text 164 247 1.arg: source-name; #X text 125 280 sum output; #X text 118 118 sum value; #X text 43 150 list of 2 floats:; #X text 55 160 1.) src onset; #X msg 391 84 \; src const 0.5; #X text 10 341 (c) Thomas Musil 2000 - 2009; #X connect 1 0 5 0; #X connect 4 0 7 0; #X connect 5 0 2 0; #X connect 5 1 6 0; #X connect 7 0 3 0; #X connect 7 1 9 0; #X connect 8 0 7 0; iem_utils-v0.0.20180206/iem_tab/tab_eq_scalar-help.pd0000644000175000017500000000421612630366350022326 0ustar zmoelnigzmoelnig#N canvas 22 55 884 588 10; #N canvas 0 22 450 300 (subpatch) 0; #X array src 100 float 1; #A 0 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.542857 -0.614286 -0.657144 -0.67143 -0.700001 -0.714287 -0.757145 -0.757145 -0.757145 -0.742859 -0.742859 -0.728573 -0.714287 -0.685715 -0.657144 -0.585715 -0.528572 -0.4 -0.242856 -0.0428551 0.157146 0.342861 0.51429 0.728577 0.800006 0.828578 0.828578 0.828578 0.828578 0.800006 0.771435 0.714292 0.571433 0.528572 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5; #X coords 0 1 99 -1 200 140 1; #X restore 527 116 graph; #N canvas 0 22 450 300 (subpatch) 0; #X array dst 100 float 0; #X coords 0 1 99 -1 200 140 1; #X restore 527 325 graph; #X obj 61 106 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 59 370 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X msg 178 272 dst dst; #X msg 129 249 src src; #X obj 61 78 tab_eq_scalar src dst; #X obj 59 331 tab_eq_scalar src dst; #X msg 47 36 0.5; #X msg 82 37 -0.5; #X text 221 332 1.arg: source-name; #X text 221 345 2.arg: destination-name; #X text 31 163 list of 4 floats:; #X text 78 475 IEM KUG; #X text 57 463 musil; #X text 92 463 @; #X text 100 463 iem.at; #X text 61 485 Graz \, Austria; #X text 244 318 initial arguments:; #X text 75 351 output; #X text 229 272 xxx : change destination name; #X text 218 86 the minimum of both array lengths); #X text 182 248 xxx : change source name; #X text 42 179 1.) src onset; #X text 42 190 2.) dst onset; #X text 12 3 tab_eq_scalar; #X text 42 201 3.) n samples to compare; #X text 42 210 4.) compared scalar value; #X text 129 29 compare "equal to" the src-array with this scalar to dst-array; #X text 205 72 (the number of samples which were compared are:; #X msg 48 228 0 0 100 0.5; #X text 13 452 (c) Thomas Musil 2000 - 2009; #X connect 4 0 7 0; #X connect 5 0 7 0; #X connect 6 0 2 0; #X connect 7 0 3 0; #X connect 8 0 6 0; #X connect 9 0 6 0; #X connect 30 0 7 0; iem_utils-v0.0.20180206/iem_tab/tab_ge_scalar-help.pd0000644000175000017500000000462412630366350022317 0ustar zmoelnigzmoelnig#N canvas 22 55 888 592 10; #N canvas 0 0 450 300 graph1 0; #X array src 100 float 1; #A 0 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.485714 -0.457143 -0.4 -0.285713 -0.0571409 0.157146 0.328575 0.442861 0.557148 0.628577 0.714292 0.800006 0.85715 0.885721 0.885721 0.871435 0.842864 0.757149 0.557148 0.41429 0.257146 -0.0142835 -0.314285 -0.528572 -0.714287 -0.757145 -0.757145 -0.757145 -0.742859 -0.742859 -0.728573 -0.714287 -0.685715 -0.657144 -0.585715 -0.528572 -0.4 -0.242856 -0.0428551 0.157146 0.342861 0.51429 0.728577 0.800006 0.828578 0.828578 0.828578 0.828578 0.800006 0.771435 0.714292 0.571433 0.41429 0.242861 0.0857169 -0.0571409 -0.242856 -0.385714 -0.542858 -0.685716 -0.757145 -0.800002 -0.828574 -0.828574 -0.814288 -0.800002 -0.785716 -0.757145 -0.728573 -0.67143 -0.585715 -0.471429 -0.271428 -0.0857125 0.114288 0.228575 0.314289 0.385718 0.414285 0.428571 0.457143 0.471428 0.485714 0.485714 0.5 0.5 0.5 0.5 0.5 0.5 0.5; #X coords 0 1 99 -1 200 140 1; #X restore 527 116 graph; #N canvas 0 0 450 300 graph1 0; #X array dst 100 float 0; #X coords 0 1 99 -1 200 140 1; #X restore 527 325 graph; #X obj 61 106 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 59 370 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X msg 178 272 dst dst; #X msg 129 249 src src; #X msg 47 36 0.5; #X msg 82 37 -0.5; #X text 201 332 1.arg: source-name; #X text 201 345 2.arg: destination-name; #X text 31 162 list of 4 floats:; #X text 78 475 IEM KUG; #X text 62 463 musil; #X text 92 463 @; #X text 98 463 iem.at; #X text 61 485 Graz \, Austria; #X text 13 452 (c) Thomas Musil 2000 - 2006; #X text 224 318 initial arguments:; #X text 75 351 output; #X text 229 272 xxx : change destination name; #X text 218 86 the minimum of both array lengths); #X text 182 248 xxx : change source name; #X text 42 178 1.) src onset; #X text 42 189 2.) dst onset; #X text 42 200 3.) n samples to compare; #X text 42 210 4.) compared scalar value; #X text 205 72 (the number of samples which were compared are:; #X msg 48 228 0 0 100 0.5; #X text 12 3 tab_ge_scalar; #X obj 61 78 tab_ge_scalar src dst; #X obj 59 331 tab_ge_scalar src dst; #X text 129 29 compare "greater than or equal to" the src-array with this scalar to dst-array; #X connect 4 0 30 0; #X connect 5 0 30 0; #X connect 6 0 29 0; #X connect 7 0 29 0; #X connect 27 0 30 0; #X connect 29 0 2 0; #X connect 30 0 3 0; iem_utils-v0.0.20180206/iem_tab/tab_find_peaks-help.pd0000644000175000017500000000553712630366350022506 0ustar zmoelnigzmoelnig#N canvas 191 230 938 537 10; #X obj 60 52 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 31 331 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X text 200 306 1.arg: source-name; #X floatatom 94 372 5 0 0 0 - - -; #X floatatom 143 373 5 0 0 0 - - -; #X msg 88 78 src src; #X msg 118 102 amp_sort; #X msg 120 124 freq_sort; #X obj 60 302 tab_find_peaks src; #X floatatom 198 371 5 0 0 0 - - -; #X obj 263 369 pack 0 0 0; #X obj 263 392 print; #X msg 233 173 abs_min_height_diff 10; #X text 69 385 sort_index; #X text 204 382 amp; #X text 147 387 index; #N canvas 0 22 450 300 (subpatch) 0; #X array src 100 float 1; #A 0 9.99997 9.28569 9.28569 10.7143 7.14284 7.85712 8.5714 39 10 11 38 8.5714 7.85712 8.5714 9.28569 8.5714 9.99997 39 40 41 38 12.8571 12.8571 14.2857 12.8571 11.4285 12.1428 11.4285 9.99997 10.7143 11.4285 9.99997 9.28569 9.28569 9.99997 10.7143 10.7143 45 9.99997 9.99997 10.7143 11.4285 12.1428 10.7143 11.4285 12.1428 11.4285 46 11.4285 11.4285 11.4285 12.1428 12.8571 11.4285 11.4285 12.1428 12.8571 12.1428 12.1428 12.1428 12.1428 12.1428 11.4285 11.4285 11.4285 11.4285 10.7143 48 49 43 11.4285 12.1428 13.5714 15 13.5714 13.5714 14.2857 14.2857 15 15 14.2857 14.2857 14.2857 15 15 15.7142 15.7142 51 53 15 15 15 15 15 14.2857 14.2857 15 15.7142 16.4285 16.4285; #X coords 0 100 99 0 200 140 1; #X restore 638 93 graph; #X msg 171 149 max_peaks 9; #X text 20 347 ready; #X msg 289 194 width_range 1 4; #X text 21 6 tab_find_peaks; #X msg 289 216 width_range 1 1; #N canvas 0 22 470 320 (subpatch) 0; #X msg 355 125 \; src const 0; #X msg 303 175 \; src 37 45; #X msg 310 223 \; src 47 46; #X msg 187 177 \; src 67 48 49 43; #X msg 180 218 \; src 87 51 53; #X msg 44 223 \; src 7 39 10 11 38; #X msg 50 181 \; src 17 39 40 41 38; #X obj 65 25 loadbang; #X msg 33 50 \; src xticks 0 1 5; #X msg 34 84 \; src xlabel -5.15 0 10 20 30 40 50 60 70 80 90; #X connect 7 0 8 0; #X connect 7 0 9 0; #X restore 696 289 pd; #X obj 311 69 loadbang; #X text 89 50 calculate all peaks (index bin amplitude); #X text 218 61 of an array; #X text 78 442 IEM KUG; #X text 57 430 musil; #X text 92 430 @; #X text 100 430 iem.at; #X text 61 452 Graz \, Austria; #X text 218 296 initial arguments:; #X text 190 111 kind of order; #X text 257 148 maximum number of peaks detected; #X text 395 171 vertical difference between peak; #X text 397 180 and noise; #X text 413 205 width range of peak in bins; #X text 13 419 (c) Thomas Musil 2000 - 2009; #X connect 0 0 8 0; #X connect 5 0 8 0; #X connect 6 0 8 0; #X connect 7 0 8 0; #X connect 8 0 1 0; #X connect 8 1 3 0; #X connect 8 1 10 0; #X connect 8 2 4 0; #X connect 8 2 10 1; #X connect 8 3 9 0; #X connect 8 3 10 2; #X connect 10 0 11 0; #X connect 12 0 8 0; #X connect 17 0 8 0; #X connect 19 0 8 0; #X connect 21 0 8 0; #X connect 23 0 6 0; #X connect 23 0 17 0; #X connect 23 0 12 0; #X connect 23 0 19 0; iem_utils-v0.0.20180206/iem_tab/tab_complex_inv-help.pd0000644000175000017500000000437512630366350022725 0ustar zmoelnigzmoelnig#N canvas 132 30 858 524 10; #N canvas 0 22 450 300 (subpatch) 0; #X array re1 100 float 0; #X coords 0 1 99 -1 100 40 1; #X restore 451 29 graph; #X obj 61 43 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 61 106 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 40 381 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #N canvas 0 22 450 300 (subpatch) 0; #X array im1 100 float 0; #X coords 0 1 99 -1 100 40 1; #X restore 451 71 graph; #N canvas 0 22 450 300 (subpatch) 0; #X array re2 100 float 0; #X coords 0 1 99 -1 100 40 1; #X restore 596 29 graph; #N canvas 0 22 450 300 (subpatch) 0; #X array im2 100 float 0; #X coords 0 1 99 -1 100 40 1; #X restore 596 71 graph; #X msg 700 247 2; #X floatatom 651 303 5 0 0 0 - - -; #X floatatom 734 304 5 0 0 0 - - -; #X obj 710 131 loadbang; #X text 96 444 IEM KUG; #X text 75 432 musil; #X text 110 432 @; #X text 118 432 iem.at; #X text 79 454 Graz \, Austria; #X text 324 276 initial arguments:; #X text 12 7 tab_complex_inv; #X text 81 39 invert the complex src-arrays to the complex dst-arrays ; #X obj 61 78 tab_complex_inv re1 im1 re2 im2; #X text 128 113 the minimum of the 4 array lengths); #X text 115 99 (the number of samples which were inverted are:; #X msg 74 253 src_re re1; #X msg 91 279 src_im im1; #X msg 110 306 dst_re re2; #X msg 143 331 dst_im im2; #X obj 40 360 tab_complex_inv re1 im1 re2 im2; #X text 302 312 3.arg: real_destination-name; #X text 302 323 4.arg: imag_destination-name; #X text 302 288 1.arg: real_source-name; #X text 302 300 2.arg: imag_source-name; #X obj 651 280 tabread re2; #X obj 734 280 tabread im2; #X msg 710 152 \; re1 const 0.8 \; im1 const -0.6; #X text 105 155 1.) src_re-onset; #X text 105 165 2.) src_im-onset; #X text 105 175 3.) dst_re-onset; #X text 105 185 4.) dst_im-onset; #X text 105 195 5.) number of samples to multiply; #X text 84 146 list of 5 floats:; #X msg 40 229 0 0 0 0 64; #X text 31 421 (c) Thomas Musil 2000 - 2009; #X connect 1 0 19 0; #X connect 7 0 31 0; #X connect 7 0 32 0; #X connect 10 0 33 0; #X connect 19 0 2 0; #X connect 22 0 26 0; #X connect 23 0 26 0; #X connect 24 0 26 0; #X connect 25 0 26 0; #X connect 26 0 3 0; #X connect 31 0 8 0; #X connect 32 0 9 0; #X connect 40 0 26 0; iem_utils-v0.0.20180206/iem_tab/tab_add_scalar-help.pd0000644000175000017500000000472412630366350022455 0ustar zmoelnigzmoelnig#N canvas 115 92 864 568 10; #N canvas 0 22 450 300 (subpatch) 0; #X array src 100 float 1; #A 0 -0.442858 -0.414287 -0.385715 -0.342858 -0.314287 -0.257144 -0.128572 -0.0428573 0.128572 0.228572 0.285715 0.328572 0.400001 0.414287 0.457144 0.457144 0.442858 0.385715 0.314287 0.257144 0.214286 0.1 0.0428572 -0.0142858 -0.0428573 -0.114286 -0.142858 -0.200001 -0.242858 -0.285715 -0.328572 -0.342858 -0.37143 -0.385715 -0.414287 -0.414287 -0.414287 -0.414287 -0.400001 -0.357144 -0.314287 -0.257144 -0.185715 -0.0714288 0.0142857 0.0571429 0.171429 0.328572 0.400001 0.442858 0.47143 0.485715 0.485715 0.485715 0.485715 0.485715 0.442858 0.357144 0.242858 0.185715 0.114286 0.0714285 -0.071429 -0.242858 -0.300001 -0.328573 -0.357144 -0.37143 -0.385715 -0.400001 -0.442858 -0.457144 -0.47143 -0.457144 -0.428573 -0.400001 -0.378573 -0.328572 -0.271429 -0.242858 -0.200001 -0.128572 -0.0428574 -0.0285717 0.0142858 0.114286 0.128572 0.185715 0.214286 0.257144 0.285715 0.314287 0.342858 0.357144 0.357144 0.357144 0.357144 0.357144 0.342858 0.328572; #X coords 0 1 99 -1 200 140 1; #X restore 527 46 graph; #N canvas 0 22 450 300 (subpatch) 0; #X array dst 100 float 0; #X coords 0 1 99 -1 200 140 1; #X restore 527 325 graph; #X obj 61 106 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 59 340 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X text 211 336 1.arg: source-name; #X msg 197 270 dst dst; #X msg 47 36 0.5; #X msg 145 247 src src; #X msg 82 37 -0.5; #X obj 61 78 tab_add_scalar src dst; #X obj 59 301 tab_add_scalar src dst; #X msg 48 227 50 20 50 -0.8; #X text 211 349 2.arg: destination-name; #X text 129 29 add the src-array with this scalar to dst-array ; #X text 31 163 list of 4 floats:; #X text 78 475 IEM KUG; #X text 58 463 musil; #X text 92 463 @; #X text 100 463 iem.at; #X text 61 485 Graz \, Austria; #X text 234 322 initial arguments:; #X text 71 322 output; #X text 250 271 xxx : change destination name; #X text 12 3 tab_add_scalar; #X text 218 86 the minimum of both array lengths); #X text 197 246 xxx : change source name; #X text 42 179 1.) src onset; #X text 42 190 2.) dst onset; #X text 42 200 3.) n samples to add; #X text 42 210 4.) added scalar value; #X text 205 72 (the number of samples which were added are:; #X text 13 452 (c) Thomas Musil 2000 - 2009; #X connect 5 0 10 0; #X connect 6 0 9 0; #X connect 7 0 10 0; #X connect 8 0 9 0; #X connect 9 0 2 0; #X connect 10 0 3 0; #X connect 11 0 10 0; iem_utils-v0.0.20180206/iem_tab/tab_rfft-help.pd0000644000175000017500000001353012630366350021334 0ustar zmoelnigzmoelnig#N canvas 0 22 965 544 10; #N canvas 0 22 450 300 (subpatch) 0; #X array src 100 float 0; #X coords 0 1 99 -1 199 100 1; #X restore 694 10 graph; #N canvas 0 22 450 300 (subpatch) 0; #X array dst_re 100 float 0; #X coords 0 1 99 -1 199 100 1; #X restore 694 239 graph; #X obj 24 47 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 24 122 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 61 345 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #N canvas 0 22 450 300 (subpatch) 0; #X array dst_im 100 float 0; #X coords 0 1 99 -1 199 100 1; #X restore 694 353 graph; #X msg 89 252 dst_re dst_re; #X msg 104 275 dst_im dst_im; #X msg 125 298 fftsize 64; #X floatatom 474 22 5 0 63 0 - - -; #X msg 546 341 \; dst_re const 0 \; dst_im const 0; #N canvas 0 22 482 332 generate_a_dirac 0; #X obj 61 62 clip 0 63; #X obj 61 32 inlet; #X msg 61 89 \; src const 0 \; src \$1 1; #X connect 0 0 2 0; #X connect 1 0 0 0; #X restore 474 41 pd generate_a_dirac; #X floatatom 514 22 5 -32 32 0 - - -; #N canvas 0 22 507 431 generate_a_cos 0; #X obj 120 18 inlet; #X obj 219 176 t f f; #X obj 219 211 / 32; #X obj 219 232 * 3.14159; #X obj 219 283 cos; #X obj 219 257 * 8; #X obj 219 308 / 32; #X obj 219 127 t b f; #X obj 120 43 moses 0; #X obj 39 178 t f f; #X obj 39 213 / 32; #X obj 39 234 * 3.14159; #X obj 39 285 cos; #X obj 39 259 * 8; #X obj 39 129 t b f; #X obj 90 70 * -1; #X obj 39 310 / -32; #N canvas 193 158 454 304 counter 0; #X obj 108 25 inlet; #X obj 109 163 outlet; #X obj 109 133 f; #X obj 142 133 + 1; #X obj 108 50 t b b; #X msg 154 76 0; #X msg 109 75 64; #X obj 110 98 until; #X connect 0 0 4 0; #X connect 2 0 3 0; #X connect 2 0 1 0; #X connect 3 0 2 1; #X connect 4 0 6 0; #X connect 4 1 5 0; #X connect 5 0 2 1; #X connect 6 0 7 0; #X connect 7 0 2 0; #X restore 219 151 pd counter; #N canvas 193 158 458 308 counter 0; #X obj 108 25 inlet; #X obj 109 163 outlet; #X obj 109 133 f; #X obj 142 133 + 1; #X obj 108 50 t b b; #X msg 154 76 0; #X msg 109 75 64; #X obj 110 98 until; #X connect 0 0 4 0; #X connect 2 0 3 0; #X connect 2 0 1 0; #X connect 3 0 2 1; #X connect 4 0 6 0; #X connect 4 1 5 0; #X connect 5 0 2 1; #X connect 6 0 7 0; #X connect 7 0 2 0; #X restore 38 154 pd counter; #X obj 219 106 clip 0 32; #X obj 39 108 clip 0 32; #X obj 39 333 tabwrite src; #X obj 219 331 tabwrite src; #X connect 0 0 8 0; #X connect 1 0 2 0; #X connect 1 1 22 1; #X connect 2 0 3 0; #X connect 3 0 5 0; #X connect 4 0 6 0; #X connect 5 0 4 0; #X connect 6 0 22 0; #X connect 7 0 17 0; #X connect 7 1 5 1; #X connect 8 0 15 0; #X connect 8 1 19 0; #X connect 9 0 10 0; #X connect 9 1 21 1; #X connect 10 0 11 0; #X connect 11 0 13 0; #X connect 12 0 16 0; #X connect 13 0 12 0; #X connect 14 0 18 0; #X connect 14 1 13 1; #X connect 15 0 20 0; #X connect 16 0 21 0; #X connect 17 0 1 0; #X connect 18 0 9 0; #X connect 19 0 7 0; #X connect 20 0 14 0; #X restore 514 61 pd generate_a_cos; #X floatatom 555 22 5 -31 31 0 - - -; #N canvas 0 22 503 427 generate_a_sin 0; #X obj 102 37 inlet; #X obj 246 182 t f f; #X obj 246 217 / 32; #X obj 246 238 * 3.14159; #X obj 246 263 * 8; #X obj 246 314 / 32; #X obj 246 112 clip 0 31; #X obj 246 133 t b f; #X obj 246 289 sin; #X obj 54 180 t f f; #X obj 54 215 / 32; #X obj 54 236 * 3.14159; #X obj 54 261 * 8; #X obj 54 110 clip 0 31; #X obj 54 132 t b f; #X obj 54 287 sin; #X obj 54 312 / -32; #X obj 102 60 moses 0; #X obj 54 88 * -1; #N canvas 193 158 454 304 counter 0; #X obj 108 25 inlet; #X obj 109 163 outlet; #X obj 109 133 f; #X obj 142 133 + 1; #X obj 108 50 t b b; #X msg 154 76 0; #X msg 109 75 64; #X obj 110 98 until; #X connect 0 0 4 0; #X connect 2 0 3 0; #X connect 2 0 1 0; #X connect 3 0 2 1; #X connect 4 0 6 0; #X connect 4 1 5 0; #X connect 5 0 2 1; #X connect 6 0 7 0; #X connect 7 0 2 0; #X restore 54 156 pd counter; #N canvas 193 158 454 304 counter 0; #X obj 108 25 inlet; #X obj 109 163 outlet; #X obj 109 133 f; #X obj 142 133 + 1; #X obj 108 50 t b b; #X msg 154 76 0; #X msg 109 75 64; #X obj 110 98 until; #X connect 0 0 4 0; #X connect 2 0 3 0; #X connect 2 0 1 0; #X connect 3 0 2 1; #X connect 4 0 6 0; #X connect 4 1 5 0; #X connect 5 0 2 1; #X connect 6 0 7 0; #X connect 7 0 2 0; #X restore 246 156 pd counter; #X obj 54 334 tabwrite src; #X obj 246 337 tabwrite src; #X connect 0 0 17 0; #X connect 1 0 2 0; #X connect 1 1 22 1; #X connect 2 0 3 0; #X connect 3 0 4 0; #X connect 4 0 8 0; #X connect 5 0 22 0; #X connect 6 0 7 0; #X connect 7 0 20 0; #X connect 7 1 4 1; #X connect 8 0 5 0; #X connect 9 0 10 0; #X connect 9 1 21 1; #X connect 10 0 11 0; #X connect 11 0 12 0; #X connect 12 0 15 0; #X connect 13 0 14 0; #X connect 14 0 19 0; #X connect 14 1 12 1; #X connect 15 0 16 0; #X connect 16 0 21 0; #X connect 17 0 18 0; #X connect 17 1 6 0; #X connect 18 0 13 0; #X connect 19 0 9 0; #X connect 20 0 1 0; #X restore 555 82 pd generate_a_sin; #X text 309 355 initial arguments:; #X msg 546 283 \; src const 0; #X msg 76 230 src src; #X msg 62 207 20 30 30; #X text 49 158 1.) src-onset; #X text 49 168 2.) dst_re-onset; #X text 49 178 3.) dst_im-onset; #X text 37 147 list of 3 floats:; #X text 269 368 1.arg: source-name; #X text 269 380 2.arg: real_destination-name; #X text 269 392 3.arg: imag_destination-name; #X text 269 404 4.arg: fftsize; #X text 10 0 tab_rfft; #X text 93 -1 real FTT with arrays; #X text 45 56 calculates a real fourier transformation of a real src-array to complex dst-arrays; #X obj 24 94 tab_rfft src dst_re dst_im 64; #X obj 62 322 tab_rfft src dst_re dst_im 64; #X text 102 464 IEM KUG; #X text 81 452 musil; #X text 116 452 @; #X text 124 452 iem.at; #X text 85 474 Graz \, Austria; #X text 37 441 (c) Thomas Musil 2000 - 2009; #X connect 2 0 31 0; #X connect 6 0 32 0; #X connect 7 0 32 0; #X connect 8 0 32 0; #X connect 9 0 11 0; #X connect 12 0 13 0; #X connect 14 0 15 0; #X connect 18 0 32 0; #X connect 19 0 32 0; #X connect 31 0 3 0; #X connect 32 0 4 0; iem_utils-v0.0.20180206/iem_tab/tab_rifft-help.pd0000644000175000017500000001436712630366350021516 0ustar zmoelnigzmoelnig#N canvas 24 39 991 674 10; #N canvas 0 22 450 300 (subpatch) 0; #X array src_re 100 float 0; #X coords 0 1 99 -1 199 100 1; #X restore 694 210 graph; #N canvas 0 22 450 300 (subpatch) 0; #X array src_im 100 float 0; #X coords 0 1 99 -1 199 100 1; #X restore 694 327 graph; #X obj 24 47 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 24 122 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 61 345 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #N canvas 0 22 450 300 (subpatch) 0; #X array dst 100 float 0; #X coords 0 1 99 -1 199 100 1; #X restore 694 513 graph; #X msg 125 298 fftsize 64; #X text 309 425 initial arguments:; #X text 10 0 tab_rifft; #X text 93 -1 real inverse FTT with arrays; #X text 37 147 list of 3 floats:; #X msg 587 540 \; dst const 0; #X obj 62 322 tab_rifft src_re src_im dst 64; #X obj 24 94 tab_rifft src_re src_im dst 64; #X text 49 158 1.) src_re-onset; #X text 49 168 2.) src_im-onset; #X text 49 178 3.) dst-onset; #X msg 62 207 20 20 30; #X msg 76 230 src_re src_re; #X msg 89 252 src_im src_im; #X msg 104 275 dst dst; #X text 269 438 1.arg: real source-name; #X text 269 450 2.arg: imag_source-name; #X text 269 462 3.arg: destination-name; #X text 45 56 calculates a real inverse fourier transformation of complex src-arrays to a real dst-array; #X text 269 474 4.arg: ifftsize; #N canvas 0 22 450 300 (subpatch) 0; #X array src 100 float 0; #X coords 0 1 99 -1 199 100 1; #X restore 694 31 graph; #X floatatom 479 40 5 0 63 0 - - -; #N canvas 0 22 486 336 generate_a_dirac 0; #X obj 61 62 clip 0 63; #X obj 61 32 inlet; #X msg 61 89 \; src const 0 \; src \$1 1; #X connect 0 0 2 0; #X connect 1 0 0 0; #X restore 479 59 pd generate_a_dirac; #X floatatom 519 40 5 -32 32 0 - - -; #N canvas 0 22 515 439 generate_a_cos 0; #X obj 120 18 inlet; #X obj 219 176 t f f; #X obj 219 211 / 32; #X obj 219 232 * 3.14159; #X obj 219 283 cos; #X obj 219 257 * 8; #X obj 219 308 / 32; #X obj 219 127 t b f; #X obj 120 43 moses 0; #X obj 39 178 t f f; #X obj 39 213 / 32; #X obj 39 234 * 3.14159; #X obj 39 285 cos; #X obj 39 259 * 8; #X obj 39 129 t b f; #X obj 90 70 * -1; #X obj 39 310 / -32; #N canvas 193 158 454 304 counter 0; #X obj 108 25 inlet; #X obj 109 163 outlet; #X obj 109 133 f; #X obj 142 133 + 1; #X obj 108 50 t b b; #X msg 154 76 0; #X msg 109 75 64; #X obj 110 98 until; #X connect 0 0 4 0; #X connect 2 0 3 0; #X connect 2 0 1 0; #X connect 3 0 2 1; #X connect 4 0 6 0; #X connect 4 1 5 0; #X connect 5 0 2 1; #X connect 6 0 7 0; #X connect 7 0 2 0; #X restore 219 151 pd counter; #N canvas 193 158 458 308 counter 0; #X obj 108 25 inlet; #X obj 109 163 outlet; #X obj 109 133 f; #X obj 142 133 + 1; #X obj 108 50 t b b; #X msg 154 76 0; #X msg 109 75 64; #X obj 110 98 until; #X connect 0 0 4 0; #X connect 2 0 3 0; #X connect 2 0 1 0; #X connect 3 0 2 1; #X connect 4 0 6 0; #X connect 4 1 5 0; #X connect 5 0 2 1; #X connect 6 0 7 0; #X connect 7 0 2 0; #X restore 38 154 pd counter; #X obj 219 106 clip 0 32; #X obj 39 108 clip 0 32; #X obj 39 333 tabwrite src; #X obj 219 331 tabwrite src; #X connect 0 0 8 0; #X connect 1 0 2 0; #X connect 1 1 22 1; #X connect 2 0 3 0; #X connect 3 0 5 0; #X connect 4 0 6 0; #X connect 5 0 4 0; #X connect 6 0 22 0; #X connect 7 0 17 0; #X connect 7 1 5 1; #X connect 8 0 15 0; #X connect 8 1 19 0; #X connect 9 0 10 0; #X connect 9 1 21 1; #X connect 10 0 11 0; #X connect 11 0 13 0; #X connect 12 0 16 0; #X connect 13 0 12 0; #X connect 14 0 18 0; #X connect 14 1 13 1; #X connect 15 0 20 0; #X connect 16 0 21 0; #X connect 17 0 1 0; #X connect 18 0 9 0; #X connect 19 0 7 0; #X connect 20 0 14 0; #X restore 519 79 pd generate_a_cos; #X floatatom 560 40 5 -31 31 0 - - -; #N canvas 0 22 507 431 generate_a_sin 0; #X obj 102 37 inlet; #X obj 246 182 t f f; #X obj 246 217 / 32; #X obj 246 238 * 3.14159; #X obj 246 263 * 8; #X obj 246 314 / 32; #X obj 246 112 clip 0 31; #X obj 246 133 t b f; #X obj 246 289 sin; #X obj 54 180 t f f; #X obj 54 215 / 32; #X obj 54 236 * 3.14159; #X obj 54 261 * 8; #X obj 54 110 clip 0 31; #X obj 54 132 t b f; #X obj 54 287 sin; #X obj 54 312 / -32; #X obj 102 60 moses 0; #X obj 54 88 * -1; #N canvas 193 158 454 304 counter 0; #X obj 108 25 inlet; #X obj 109 163 outlet; #X obj 109 133 f; #X obj 142 133 + 1; #X obj 108 50 t b b; #X msg 154 76 0; #X msg 109 75 64; #X obj 110 98 until; #X connect 0 0 4 0; #X connect 2 0 3 0; #X connect 2 0 1 0; #X connect 3 0 2 1; #X connect 4 0 6 0; #X connect 4 1 5 0; #X connect 5 0 2 1; #X connect 6 0 7 0; #X connect 7 0 2 0; #X restore 54 156 pd counter; #N canvas 193 158 454 304 counter 0; #X obj 108 25 inlet; #X obj 109 163 outlet; #X obj 109 133 f; #X obj 142 133 + 1; #X obj 108 50 t b b; #X msg 154 76 0; #X msg 109 75 64; #X obj 110 98 until; #X connect 0 0 4 0; #X connect 2 0 3 0; #X connect 2 0 1 0; #X connect 3 0 2 1; #X connect 4 0 6 0; #X connect 4 1 5 0; #X connect 5 0 2 1; #X connect 6 0 7 0; #X connect 7 0 2 0; #X restore 246 156 pd counter; #X obj 54 334 tabwrite src; #X obj 246 337 tabwrite src; #X connect 0 0 17 0; #X connect 1 0 2 0; #X connect 1 1 22 1; #X connect 2 0 3 0; #X connect 3 0 4 0; #X connect 4 0 8 0; #X connect 5 0 22 0; #X connect 6 0 7 0; #X connect 7 0 20 0; #X connect 7 1 4 1; #X connect 8 0 5 0; #X connect 9 0 10 0; #X connect 9 1 21 1; #X connect 10 0 11 0; #X connect 11 0 12 0; #X connect 12 0 15 0; #X connect 13 0 14 0; #X connect 14 0 19 0; #X connect 14 1 12 1; #X connect 15 0 16 0; #X connect 16 0 21 0; #X connect 17 0 18 0; #X connect 17 1 6 0; #X connect 18 0 13 0; #X connect 19 0 9 0; #X connect 20 0 1 0; #X restore 560 100 pd generate_a_sin; #X obj 471 258 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 471 333 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 471 305 tab_rfft src src_re src_im 64; #X msg 590 127 \; src const 0; #X text 102 464 IEM KUG; #X text 81 452 musil; #X text 116 452 @; #X text 124 452 iem.at; #X text 85 474 Graz \, Austria; #X text 37 441 (c) Thomas Musil 2000 - 2009; #X text 521 17 1.); #X text 469 236 2.); #X text 44 25 3.); #X connect 2 0 13 0; #X connect 6 0 12 0; #X connect 12 0 4 0; #X connect 13 0 3 0; #X connect 17 0 12 0; #X connect 18 0 12 0; #X connect 19 0 12 0; #X connect 20 0 12 0; #X connect 27 0 28 0; #X connect 29 0 30 0; #X connect 31 0 32 0; #X connect 33 0 35 0; #X connect 35 0 34 0; iem_utils-v0.0.20180206/iem_tab/tab_const-help.pd0000644000175000017500000000411112630366350021514 0ustar zmoelnigzmoelnig#N canvas 117 93 790 448 10; #N canvas 0 22 450 300 (subpatch) 0; #X array dst 100 float 1; #A 0 0 0 0 0 0 0 0.0428571 0.1 0.128571 0.185714 0.257143 0.3 0.371429 0.428571 0.471429 0.557143 0.614286 0.671429 0.4 0.171429 0.0714286 -0.0857142 -0.285714 -0.557143 -0.542857 -0.485714 -0.457143 -0.428571 -0.357143 -0.314286 -0.271429 -0.221429 -0.171429 -0.128571 -0.0857143 -0.0428571 1.49012e-08 0.0428572 0.0857143 0.128571 0.171429 0.271429 0.357143 0.442857 0.471429 -0.514286 -0.514286 -0.485714 -0.428571 -0.342857 -0.292857 -0.242857 -0.2 -0.157143 -0.0285715 0.0357142 0.1 0.152381 0.204762 0.257143 0.321429 0.385714 0.435714 0.485714 0.528571 0.571429 0.621429 -0.242857 -0.414286 -0.414286 -0.4 -0.357143 -0.328571 -0.3 -0.257143 -0.214286 -0.185714 -0.157143 -0.128571 -0.0785714 -0.0285714 0.00476191 0.0380952 0.0714286 0.114286 0.157143 0.2 0.242857 0.278571 0.314286 -0.228571 -0.242857 -0.214286 -0.2 -0.142857 -0.114286 -0.0714285 -0.0285714 3.53903e-08 0.114286; #X coords 0 1 99 -1 200 140 1; #X restore 518 36 graph; #X obj 61 31 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 61 130 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 60 302 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X msg 122 218 dst dst; #X obj 61 102 tab_const dst; #X msg 60 195 30 50 0.5; #X text 172 270 1.arg: destination-name; #X obj 60 261 tab_const dst; #X msg 82 59 -0.7; #X msg 114 78 0.8; #X text 11 6 tab_const; #X text 90 29 set all samples of array to zero; #X text 114 58 set all samples of array to this float value ; #X text 55 163 1.) dst onset; #X text 55 174 2.) n samples to set; #X text 190 257 initial arguments:; #X text 174 219 xxx : change destination name; #X text 75 374 IEM KUG; #X text 54 362 musil; #X text 89 362 @; #X text 97 362 iem.at; #X text 58 384 Graz \, Austria; #X text 65 280 output; #X text 43 153 list of 2 floats:; #X text 10 351 (c) Thomas Musil 2000 - 2009; #X connect 1 0 5 0; #X connect 4 0 8 0; #X connect 5 0 2 0; #X connect 6 0 8 0; #X connect 8 0 3 0; #X connect 9 0 5 0; #X connect 10 0 5 0; iem_utils-v0.0.20180206/iem_tab/tab_dbtopow-help.pd0000644000175000017500000000441612630366350022054 0ustar zmoelnigzmoelnig#N canvas 369 22 790 417 10; #N canvas 0 22 450 300 (subpatch) 0; #X array src 100 float 1; #A 0 0.0214324 5.77858 10.0643 15.0643 17.2072 22.2072 31.4929 33.6358 37.2072 38.9929 40.7786 45.0644 49.3501 51.4929 53.6358 55.4215 57.2072 59.3501 61.493 62.6834 63.8739 65.0644 66.8501 68.6358 70.4215 70.7787 71.493 72.9215 73.2787 73.6358 75.0644 75.4216 75.7787 76.493 76.8501 77.2073 77.5644 77.9216 78.6358 79.3501 80.0644 80.7787 81.493 81.8501 82.2073 83.6358 84.3501 85.0644 85.4216 85.7787 87.2073 87.5644 87.9216 88.6359 89.3501 90.0644 90.7787 90.7787 91.493 92.2073 92.2073 92.2073 92.2073 92.2073 92.2073 92.2073 93.6359 93.6359 93.6359 93.6359 93.6359 93.6359 93.6359 93.6359 93.6359 93.6359 93.6359 93.6359 93.6359 94.3502 94.3502 94.3502 95.0644 95.0644 95.7787 96.493 96.493 96.493 97.9216 98.6359 98.6359 99.3502 99.3502 99.3502 100.064 100.064 100.064 100.064 100.779 100.779; #X coords 0 100 99 0 200 140 1; #X restore 534 10 graph; #N canvas 0 22 450 300 (subpatch) 0; #X array dst 100 float 0; #X coords 0 1 99 0 200 140 1; #X restore 534 166 graph; #X obj 61 31 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 61 106 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 59 301 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X msg 59 211 50 20 50; #X text 44 154 list of 3 floats:; #X text 222 273 1.arg: source-name; #X text 222 286 2.arg: destination-name; #X msg 154 213 src src; #X msg 185 234 dst dst; #X text 78 365 IEM KUG; #X text 57 353 musil; #X text 92 353 @; #X text 100 353 iem.at; #X text 61 375 Graz \, Austria; #X text 56 165 1.) src onset; #X text 56 175 2.) dst onset; #X text 231 261 initial arguments:; #X text 68 283 output; #X text 208 213 xxx : change source name; #X text 240 233 xxx : change destination name; #X text 205 69 (the number of samples which are copied are:; #X text 218 83 the minimum of both array lengths); #X text 13 342 (c) Thomas Musil 2000 - 2010; #X text 57 185 3.) n samples of dbtorms; #X text 12 4 tab_dbtopow; #X text 91 32 calculates the dbtopow-value from src to dst; #X obj 61 79 tab_dbtopow src dst; #X obj 59 264 tab_dbtopow src dst; #X connect 2 0 28 0; #X connect 5 0 29 0; #X connect 9 0 29 0; #X connect 10 0 29 0; #X connect 28 0 3 0; #X connect 29 0 4 0; iem_utils-v0.0.20180206/iem_tab/tab_ne_scalar-help.pd0000644000175000017500000000461012630366350022321 0ustar zmoelnigzmoelnig#N canvas 22 55 880 584 10; #N canvas 0 0 450 300 graph1 0; #X array src 100 float 1; #A 0 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.485714 -0.457143 -0.4 -0.285713 -0.0571409 0.157146 0.328575 0.442861 0.557148 0.628577 0.714292 0.800006 0.85715 0.885721 0.885721 0.871435 0.842864 0.757149 0.557148 0.41429 0.257146 -0.0142835 -0.314285 -0.528572 -0.714287 -0.757145 -0.757145 -0.757145 -0.742859 -0.742859 -0.728573 -0.714287 -0.685715 -0.657144 -0.585715 -0.528572 -0.4 -0.242856 -0.0428551 0.157146 0.342861 0.51429 0.728577 0.800006 0.828578 0.828578 0.828578 0.828578 0.800006 0.771435 0.714292 0.571433 0.41429 0.242861 0.0857169 -0.0571409 -0.242856 -0.385714 -0.542858 -0.685716 -0.757145 -0.800002 -0.828574 -0.828574 -0.814288 -0.800002 -0.785716 -0.757145 -0.728573 -0.67143 -0.585715 -0.471429 -0.271428 -0.0857125 0.114288 0.228575 0.314289 0.385718 0.414285 0.428571 0.457143 0.471428 0.485714 0.485714 0.5 0.5 0.5 0.5 0.5 0.5 0.5; #X coords 0 1 99 -1 200 140 1; #X restore 527 116 graph; #N canvas 0 0 450 300 graph1 0; #X array dst 100 float 0; #X coords 0 1 99 -1 200 140 1; #X restore 527 325 graph; #X obj 61 106 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 59 370 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X msg 178 272 dst dst; #X msg 129 249 src src; #X msg 47 36 0.5; #X msg 82 37 -0.5; #X text 201 332 1.arg: source-name; #X text 201 345 2.arg: destination-name; #X text 31 163 list of 4 floats:; #X text 78 475 IEM KUG; #X text 62 463 musil; #X text 92 463 @; #X text 98 463 iem.at; #X text 61 485 Graz \, Austria; #X text 13 452 (c) Thomas Musil 2000 - 2006; #X text 224 318 initial arguments:; #X text 75 351 output; #X text 229 272 xxx : change destination name; #X text 218 86 the minimum of both array lengths); #X text 182 248 xxx : change source name; #X text 42 179 1.) src onset; #X text 42 190 2.) dst onset; #X text 42 200 3.) n samples to compare; #X text 42 210 4.) compared scalar value; #X text 12 3 tab_ne_scalar; #X text 129 29 compare "not equal to" the src-array with this scalar to dst-array; #X obj 61 78 tab_ne_scalar src dst; #X text 205 72 (the number of samples which were compared are:; #X msg 48 228 0 0 100 0.5; #X obj 59 331 tab_ne_scalar src dst; #X connect 4 0 31 0; #X connect 5 0 31 0; #X connect 6 0 28 0; #X connect 7 0 28 0; #X connect 28 0 2 0; #X connect 30 0 31 0; #X connect 31 0 3 0; iem_utils-v0.0.20180206/iem_tab/tab_complex_mul-help.pd0000644000175000017500000000702712630366350022723 0ustar zmoelnigzmoelnig#N canvas 132 30 862 634 10; #N canvas 0 22 450 300 (subpatch) 0; #X array re1 100 float 0; #X coords 0 1 99 -1 100 40 1; #X restore 481 29 graph; #X obj 61 43 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 61 106 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 54 439 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #N canvas 0 22 450 300 (subpatch) 0; #X array im1 100 float 0; #X coords 0 1 99 -1 100 40 1; #X restore 481 71 graph; #N canvas 0 22 450 300 (subpatch) 0; #X array re2 100 float 0; #X coords 0 1 99 -1 100 40 1; #X restore 606 29 graph; #N canvas 0 22 450 300 (subpatch) 0; #X array im2 100 float 0; #X coords 0 1 99 -1 100 40 1; #X restore 606 71 graph; #N canvas 0 22 450 300 (subpatch) 0; #X array re3 100 float 0; #X coords 0 1 99 -1 100 40 1; #X restore 735 28 graph; #N canvas 0 22 450 300 (subpatch) 0; #X array im3 100 float 0; #X coords 0 1 99 -1 100 40 1; #X restore 735 70 graph; #X msg 710 152 \; re1 const 0.9 \; im1 const 0.6 \; re2 const 0.7 \; im2 const -0.8; #X obj 61 78 tab_complex_mul re1 im1 re2 im2 re3 im3; #X obj 662 472 tabread re3; #X obj 745 472 tabread im3; #X msg 711 439 2; #X floatatom 662 495 5 0 0 0 - - -; #X floatatom 745 496 5 0 0 0 - - -; #X obj 692 350 *; #X obj 715 350 *; #X obj 760 350 *; #X obj 783 350 *; #X obj 767 372 +; #X obj 698 372 -; #X msg 692 304 0.9 0.7; #X msg 715 328 0.6 -0.8; #X floatatom 699 395 5 0 0 0 - - -; #X msg 760 305 0.9 -0.8; #X msg 777 329 0.6 0.7; #X floatatom 767 394 5 0 0 0 - - -; #X obj 54 418 tab_complex_mul re1 im1 re2 im2 re3 im3; #X msg 74 258 src1_re re1; #X msg 191 368 dst_re re3; #X msg 232 391 dst_im im3; #X msg 91 284 src1_im im1; #X msg 143 309 src2_re re2; #X msg 161 335 src2_im im2; #X msg 40 234 0 0 0 0 0 0 64; #X text 84 146 list of 7 floats:; #X text 353 419 1.arg: real_source1-name; #X text 353 431 2.arg: imag_source1-name; #X text 353 443 3.arg: real_source2-name; #X text 354 454 4.arg: imag_source2-name; #X text 354 466 5.arg: real_destination-name; #X text 354 477 6.arg: imag_destination-name; #X obj 728 281 t b b b b; #X obj 728 257 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 710 131 loadbang; #X text 87 537 IEM KUG; #X text 66 525 musil; #X text 101 525 @; #X text 109 525 iem.at; #X text 70 547 Graz \, Austria; #X text 12 7 tab_complex_mul; #X text 375 407 initial arguments:; #X text 115 99 (the number of samples which were multiplied are:; #X text 105 155 1.) src1_re-onset; #X text 105 165 2.) src1_im-onset; #X text 105 175 3.) src2_re-onset; #X text 105 185 4.) src2_im-onset; #X text 105 195 5.) dst_re-onset; #X text 105 205 6.) dst_im-onset; #X text 105 215 7.) number of samples to multiply; #X text 81 39 multiply the complex src1-arrays with the complex src2-arrays to complex dst-array; #X text 128 113 the minimum of the 6 array lengths); #X text 22 514 (c) Thomas Musil 2000 - 2009; #X connect 1 0 10 0; #X connect 10 0 2 0; #X connect 11 0 14 0; #X connect 12 0 15 0; #X connect 13 0 11 0; #X connect 13 0 12 0; #X connect 16 0 21 0; #X connect 17 0 21 1; #X connect 18 0 20 0; #X connect 19 0 20 1; #X connect 20 0 27 0; #X connect 21 0 24 0; #X connect 22 0 16 0; #X connect 23 0 17 0; #X connect 25 0 18 0; #X connect 26 0 19 0; #X connect 28 0 3 0; #X connect 29 0 28 0; #X connect 30 0 28 0; #X connect 31 0 28 0; #X connect 32 0 28 0; #X connect 33 0 28 0; #X connect 34 0 28 0; #X connect 35 0 28 0; #X connect 43 0 22 0; #X connect 43 1 23 0; #X connect 43 2 25 0; #X connect 43 3 26 0; #X connect 44 0 43 0; #X connect 45 0 9 0; iem_utils-v0.0.20180206/iem_tab/tab_add-help.pd0000644000175000017500000000721512630366350021126 0ustar zmoelnigzmoelnig#N canvas 116 92 859 564 10; #N canvas 0 22 450 300 (subpatch) 0; #X array src1 100 float 1; #A 0 -0.442858 -0.414287 -0.385715 -0.342858 -0.314287 -0.257144 -0.128572 -0.0428573 0.128572 0.228572 0.285715 0.328572 0.400001 0.414287 0.457144 0.457144 0.442858 0.385715 0.314287 0.257144 0.214286 0.1 0.0428572 -0.0142858 -0.0428573 -0.114286 -0.142858 -0.200001 -0.242858 -0.285715 -0.328572 -0.342858 -0.37143 -0.385715 -0.414287 -0.414287 -0.414287 -0.414287 -0.400001 -0.357144 -0.314287 -0.257144 -0.185715 -0.0714288 0.0142857 0.0571429 0.171429 0.328572 0.400001 0.442858 0.47143 0.485715 0.485715 0.485715 0.485715 0.485715 0.442858 0.357144 0.242858 0.185715 0.114286 0.0714285 -0.071429 -0.242858 -0.300001 -0.328573 -0.357144 -0.37143 -0.385715 -0.400001 -0.442858 -0.457144 -0.47143 -0.457144 -0.428573 -0.400001 -0.378573 -0.328572 -0.271429 -0.242858 -0.200001 -0.128572 -0.0428574 -0.0285717 0.0142858 0.114286 0.128572 0.185715 0.214286 0.257144 0.285715 0.314287 0.342858 0.357144 0.357144 0.357144 0.357144 0.357144 0.342858 0.328572; #X coords 0 1 99 -1 200 140 1; #X restore 534 10 graph; #N canvas 0 22 450 300 (subpatch) 0; #X array dst 100 float 0; #X coords 0 1 99 -1 200 140 1; #X restore 535 358 graph; #X obj 61 31 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 61 106 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 59 340 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X msg 255 276 dst dst; #N canvas 0 22 450 300 (subpatch) 0; #X array src2 100 float 1; #A 0 0.557135 0.57142 0.557135 0.528564 0.499992 0.428564 0.357136 0.299994 0.0999951 -0.0571467 -0.157146 -0.228574 -0.300002 -0.328573 -0.357145 -0.385716 -0.400001 -0.400001 -0.385716 -0.385716 -0.37143 -0.364287 -0.357145 -0.328573 -0.300002 -0.271431 -0.24286 -0.214288 -0.14286 -0.085718 -0.0428611 -4.28595e-06 0.0428526 0.099995 0.171423 0.21428 0.257137 0.328565 0.371422 0.428564 0.457135 0.485707 0.499992 0.514278 0.499992 0.471421 0.44285 0.414279 0.357136 0.285708 0.171423 0.0999952 0.0142815 -0.100003 -0.214288 -0.314288 -0.385716 -0.457144 -0.471429 -0.514286 -0.500001 -0.47143 -0.442858 -0.414287 -0.37143 -0.300002 -0.228574 -0.157146 -0.0714324 0.0571381 0.128566 0.199994 0.271422 0.34285 0.414278 0.457135 0.485707 0.499992 0.528563 0.542849 0.499992 0.457135 0.428564 0.371422 0.314279 0.242851 0.0857095 -0.0857178 -0.271431 -0.400001 -0.514286 -0.542858 -0.557143 -0.585714 -0.585714 -0.6 -0.6 -0.614286 -0.614286 -0.614286; #X coords 0 1 99 -1 200 140 1; #X restore 535 161 graph; #X msg 136 233 src1 src1; #X msg 195 255 src2 src2; #X msg 59 211 50 50 20 50; #X text 45 139 list of 4 floats:; #X text 212 353 3.arg: destination-name; #X text 90 29 add the 2 src-arrays to dst-array; #X obj 61 78 tab_add src1 src2 dst; #X obj 59 301 tab_add src1 src2 dst; #X text 78 435 IEM KUG; #X text 58 423 musil; #X text 92 423 @; #X text 100 423 iem.at; #X text 61 445 Graz \, Austria; #X text 234 312 initial arguments:; #X text 72 319 output; #X text 306 275 xxx : change destination name; #X text 12 3 tab_add; #X text 225 86 the minimum of the 3 array lengths); #X text 56 177 3.) dst onset; #X text 56 155 1.) src_1 onset; #X text 56 166 2.) src_2 onset; #X text 56 187 4.) n samples to add; #X text 199 233 xxx : change source name 1; #X text 257 255 xxx : change source name 2; #X text 211 326 1.arg: source-name 1; #X text 211 339 2.arg: source-name 2; #X text 212 72 (the number of samples which were added are:; #X text 13 412 (c) Thomas Musil 2000 - 2009; #X connect 2 0 13 0; #X connect 5 0 14 0; #X connect 7 0 14 0; #X connect 8 0 14 0; #X connect 9 0 14 0; #X connect 13 0 3 0; #X connect 14 0 4 0; iem_utils-v0.0.20180206/iem_tab/tab_conv-help.pd0000644000175000017500000000716412630366350021346 0ustar zmoelnigzmoelnig#N canvas 18 36 1204 616 10; #X obj 55 56 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 55 97 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #N canvas 0 22 711 532 init_tables 0; #X obj 45 113 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0 1 ; #X obj 133 200 noise~; #X obj 104 144 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 149 15 inlet; #X obj 149 37 t b; #X obj 188 99 del 100; #X msg 53 82 1; #X msg 188 122 0; #X obj 167 64 del 100; #X obj 134 234 tabwrite~ in; #X obj 228 235 tabwrite~ filt; #X obj 229 180 *~ 10; #N canvas 0 22 238 185 dsp 0; #X msg 28 63 \; pd dsp \$1; #X obj 28 34 inlet; #X connect 1 0 0 0; #X restore 45 132 pd dsp; #N canvas 448 145 458 308 dirac~ 0; #X obj 75 23 inlet; #X obj 75 96 sig~; #X obj 75 121 biquad~ 0 0 1 -1 0; #X obj 75 143 clip~ 0 1; #X obj 75 169 outlet~; #X obj 110 48 del 2; #X msg 75 49 1; #X msg 111 69 0; #X connect 0 0 5 0; #X connect 0 0 6 0; #X connect 1 0 2 0; #X connect 2 0 3 0; #X connect 3 0 4 0; #X connect 5 0 7 0; #X connect 6 0 1 0; #X connect 7 0 1 0; #X restore 229 155 pd dirac~; #X obj 229 209 bp~ 1000 10; #X connect 0 0 12 0; #X connect 1 0 9 0; #X connect 2 0 9 0; #X connect 2 0 10 0; #X connect 3 0 4 0; #X connect 4 0 6 0; #X connect 4 0 8 0; #X connect 5 0 7 0; #X connect 6 0 0 0; #X connect 7 0 0 0; #X connect 8 0 5 0; #X connect 8 0 2 0; #X connect 8 0 13 0; #X connect 11 0 14 0; #X connect 13 0 11 0; #X connect 14 0 10 0; #X restore 678 278 pd init_tables; #X obj 678 233 loadbang; #N canvas 0 22 450 300 (subpatch) 0; #X array in 800 float 0; #X coords 0 1 799 -1 399 100 1; #X restore 483 25 graph; #N canvas 0 22 450 300 (subpatch) 0; #X array filt 200 float 0; #X coords 0 0.1 199 -0.1 99 100 1; #X restore 483 219 graph; #N canvas 0 22 450 300 (subpatch) 0; #X array out 800 float 0; #X coords 0 1 799 -1 399 100 1; #X restore 483 382 graph; #X text 94 464 IEM KUG; #X text 73 452 musil; #X text 108 452 @; #X text 116 452 iem.at; #X text 77 474 Graz \, Austria; #X text 248 365 initial arguments:; #X text 78 97 (the number of samples which were correlated are: the positive minimum of the difference (src1-src2) and dst array lengths) ; #X text 226 377 1.arg: source1-name; #X text 226 389 2.arg: source2-name; #X text 226 401 3.arg: destination-name; #X msg 77 302 bang; #X obj 678 257 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X text 12 12 tab_conv; #X obj 55 75 tab_conv in filt out; #X text 29 441 (c) Thomas Musil 2000 - 2009; #X msg 109 324 src1 in; #X msg 124 345 src2 filt; #X msg 135 366 dst out; #X obj 63 394 tab_conv in filt out; #X msg 54 251 0 0 0 800 200; #N canvas 0 22 450 300 (subpatch) 0; #X array in2 16 float 2; #X coords 0 1 16 -1 160 100 1; #X restore 903 25 graph; #N canvas 0 22 450 300 (subpatch) 0; #X array filt2 4 float 2; #X coords 0 1 4 -1 40 100 1; #X restore 903 151 graph; #N canvas 0 22 450 300 (subpatch) 0; #X array out2 19 float 2; #X coords 0 1 19 -1 190 100 1; #X restore 903 282 graph; #X obj 972 227 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 972 246 tab_conv in2 filt2 out2; #X msg 971 139 \; filt2 0 0.9 0.7 0.5 0.3 \; in2 const 0 \; in2 1 0.9 \; in2 8 0.9 \; in2 14 -0.9; #X text 162 250 not working yet; #X text 25 158 !!! array length of src1 + array length of src2 - 1 ; #X text 391 158 >= array length of dst !!!; #X text 78 39 convolutes the 2nd array "src2" with the 1st array "src1" to the destination array "dst"; #X connect 0 0 20 0; #X connect 3 0 18 0; #X connect 17 0 25 0; #X connect 18 0 2 0; #X connect 20 0 1 0; #X connect 22 0 25 0; #X connect 23 0 25 0; #X connect 24 0 25 0; #X connect 26 0 25 0; #X connect 30 0 31 0; iem_utils-v0.0.20180206/iem_tab/READ_ME.txt0000644000175000017500000000063512630366350020131 0ustar zmoelnigzmoelnigThis library extends the performance of miller puckette's pure data (pd). iem_tab is written by Thomas Musil from IEM Graz Austria and it is compatible to miller puckette's pd-0.37-3 to pd-0.39-2. see also LICENCE.txt, GnuGPL.txt. The objects of iem_tab manipulate tables or arrays; you can set constant, copy, fft, ifft, reverse, find minimum or maximum, compare, add, subtract, multiplicate, divide arrays. iem_utils-v0.0.20180206/iem_tab/tab_lt-help.pd0000644000175000017500000000647112630366350021020 0ustar zmoelnigzmoelnig#N canvas 116 92 859 564 10; #N canvas 0 0 450 300 graph1 0; #X array src1 100 float 1; #A 0 -0.442858 -0.414287 -0.385715 -0.342858 -0.314287 -0.257144 -0.128572 -0.0428573 0.128572 0.228572 0.285715 0.328572 0.400001 0.414287 0.457144 0.457144 0.442858 0.385715 0.314287 0.257144 0.214286 0.1 0.0428572 -0.0142858 -0.0428573 -0.114286 -0.142858 -0.200001 -0.242858 -0.285715 -0.328572 -0.342858 -0.37143 -0.385715 -0.414287 -0.414287 -0.414287 -0.414287 -0.400001 -0.357144 -0.314287 -0.257144 -0.185715 -0.0714288 0.0142857 0.0571429 0.171429 0.328572 0.400001 0.442858 0.47143 0.485715 0.485715 0.485715 0.485715 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.485715 0.471429 0.457144 0.442858 0.442858 0.428572 0.414286 0.385715 0.357143 0.342858 0.314286 0.285715 0.242857 0.185714 0.142857 0.114286 0.085714; #X coords 0 1 99 -1 200 140 1; #X restore 534 10 graph; #N canvas 0 0 450 300 graph1 0; #X array dst 100 float 0; #X coords 0 1 99 -1 200 140 1; #X restore 535 358 graph; #X obj 61 31 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 61 106 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 59 340 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X msg 255 276 dst dst; #N canvas 0 0 450 300 graph1 0; #X array src2 100 float 1; #A 0 0.557135 0.57142 0.557135 0.528564 0.499992 0.428564 0.357136 0.299994 0.0999951 -0.0571467 -0.157146 -0.228574 -0.300002 -0.328573 -0.357145 -0.385716 -0.400001 -0.400001 -0.385716 -0.385716 -0.37143 -0.364287 -0.357145 -0.328573 -0.300002 -0.271431 -0.24286 -0.214288 -0.14286 -0.085718 -0.0428611 -4.28595e-006 0.0428526 0.099995 0.171423 0.21428 0.257137 0.328565 0.371422 0.442849 0.457135 0.471421 0.471421 0.485706 0.485706 0.485706 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.485714 0.471429 0.457135 0.428564 0.371422 0.314279 0.242851 0.0857095 -0.0857178 -0.271431 -0.400001 -0.514286 -0.542858 -0.557143 -0.585714 -0.585714 -0.6 -0.6 -0.614286 -0.614286 -0.614286; #X coords 0 1 99 -1 200 140 1; #X restore 535 161 graph; #X msg 136 233 src1 src1; #X msg 195 255 src2 src2; #X msg 59 211 50 50 20 50; #X text 45 139 list of 4 floats:; #X text 212 353 3.arg: destination-name; #X text 78 435 IEM KUG; #X text 62 423 musil; #X text 92 423 @; #X text 98 423 iem.at; #X text 61 445 Graz \, Austria; #X text 13 412 (c) Thomas Musil 2000 - 2006; #X text 234 312 initial arguments:; #X text 72 319 output; #X text 306 275 xxx : change destination name; #X text 208 86 the minimum of the 3 array lengths); #X text 56 177 3.) dst onset; #X text 56 155 1.) src_1 onset; #X text 56 166 2.) src_2 onset; #X text 199 233 xxx : change source name 1; #X text 257 255 xxx : change source name 2; #X text 211 326 1.arg: source-name 1; #X text 211 339 2.arg: source-name 2; #X text 195 72 (the number of samples which were compared are:; #X text 56 187 4.) n samples to compare; #X text 12 3 tab_lt; #X text 90 29 compare less than" the 2 src-arrays to dst-array ; #X obj 61 78 tab_lt src1 src2 dst; #X obj 59 301 tab_lt src1 src2 dst; #X connect 2 0 33 0; #X connect 5 0 34 0; #X connect 7 0 34 0; #X connect 8 0 34 0; #X connect 9 0 34 0; #X connect 33 0 3 0; #X connect 34 0 4 0; iem_utils-v0.0.20180206/iem_tab/tab_gt-help.pd0000644000175000017500000000647512630366350021017 0ustar zmoelnigzmoelnig#N canvas 116 92 859 564 10; #N canvas 0 0 450 300 graph1 0; #X array src1 100 float 1; #A 0 -0.442858 -0.414287 -0.385715 -0.342858 -0.314287 -0.257144 -0.128572 -0.0428573 0.128572 0.228572 0.285715 0.328572 0.400001 0.414287 0.457144 0.457144 0.442858 0.385715 0.314287 0.257144 0.214286 0.1 0.0428572 -0.0142858 -0.0428573 -0.114286 -0.142858 -0.200001 -0.242858 -0.285715 -0.328572 -0.342858 -0.37143 -0.385715 -0.414287 -0.414287 -0.414287 -0.414287 -0.400001 -0.357144 -0.314287 -0.257144 -0.185715 -0.0714288 0.0142857 0.0571429 0.171429 0.328572 0.400001 0.442858 0.47143 0.485715 0.485715 0.485715 0.485715 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.485715 0.471429 0.457144 0.442858 0.442858 0.428572 0.414286 0.385715 0.357143 0.342858 0.314286 0.285715 0.242857 0.185714 0.142857 0.114286 0.085714; #X coords 0 1 99 -1 200 140 1; #X restore 534 10 graph; #N canvas 0 0 450 300 graph1 0; #X array dst 100 float 0; #X coords 0 1 99 -1 200 140 1; #X restore 535 358 graph; #X obj 61 31 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 61 106 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 59 340 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X msg 255 276 dst dst; #N canvas 0 0 450 300 graph1 0; #X array src2 100 float 1; #A 0 0.557135 0.57142 0.557135 0.528564 0.499992 0.428564 0.357136 0.299994 0.0999951 -0.0571467 -0.157146 -0.228574 -0.300002 -0.328573 -0.357145 -0.385716 -0.400001 -0.400001 -0.385716 -0.385716 -0.37143 -0.364287 -0.357145 -0.328573 -0.300002 -0.271431 -0.24286 -0.214288 -0.14286 -0.085718 -0.0428611 -4.28595e-006 0.0428526 0.099995 0.171423 0.21428 0.257137 0.328565 0.371422 0.442849 0.457135 0.471421 0.471421 0.485706 0.485706 0.485706 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.485714 0.471429 0.457135 0.428564 0.371422 0.314279 0.242851 0.0857095 -0.0857178 -0.271431 -0.400001 -0.514286 -0.542858 -0.557143 -0.585714 -0.585714 -0.6 -0.6 -0.614286 -0.614286 -0.614286; #X coords 0 1 99 -1 200 140 1; #X restore 535 161 graph; #X msg 136 233 src1 src1; #X msg 195 255 src2 src2; #X msg 59 211 50 50 20 50; #X text 45 139 list of 4 floats:; #X text 212 353 3.arg: destination-name; #X text 78 435 IEM KUG; #X text 62 423 musil; #X text 92 423 @; #X text 98 423 iem.at; #X text 61 445 Graz \, Austria; #X text 13 412 (c) Thomas Musil 2000 - 2006; #X text 234 312 initial arguments:; #X text 72 319 output; #X text 306 275 xxx : change destination name; #X text 208 86 the minimum of the 3 array lengths); #X text 56 177 3.) dst onset; #X text 56 155 1.) src_1 onset; #X text 56 166 2.) src_2 onset; #X text 199 233 xxx : change source name 1; #X text 257 255 xxx : change source name 2; #X text 211 326 1.arg: source-name 1; #X text 211 339 2.arg: source-name 2; #X text 195 72 (the number of samples which were compared are:; #X text 56 187 4.) n samples to compare; #X text 12 3 tab_gt; #X text 90 29 compare "greater than" the 2 src-arrays to dst-array ; #X obj 61 78 tab_gt src1 src2 dst; #X obj 59 301 tab_gt src1 src2 dst; #X connect 2 0 33 0; #X connect 5 0 34 0; #X connect 7 0 34 0; #X connect 8 0 34 0; #X connect 9 0 34 0; #X connect 33 0 3 0; #X connect 34 0 4 0; iem_utils-v0.0.20180206/iem_tab/tab_reverse-help.pd0000644000175000017500000000466012630366350022052 0ustar zmoelnigzmoelnig#N canvas 96 21 782 474 10; #N canvas 0 0 450 300 graph1 0; #X array src 100 float 1; #A 0 -0.871431 -0.84286 -0.814288 -0.814288 -0.800002 -0.771431 -0.757145 -0.742859 -0.728574 -0.714288 -0.685716 -0.671431 -0.657145 -0.642859 -0.628573 -0.614288 -0.600002 -0.585716 -0.57143 -0.542859 -0.542859 -0.528573 -0.514287 -0.500002 -0.485716 -0.47143 -0.457144 -0.442859 -0.428573 -0.414287 -0.400002 -0.385716 -0.385716 -0.357144 -0.342859 -0.342859 -0.328573 -0.314287 -0.300001 -0.285716 -0.27143 -0.257144 -0.228573 -0.228573 -0.200001 -0.185715 -0.185715 -0.17143 -0.142858 -0.142858 -0.128572 -0.114287 -0.085715 -0.085715 -0.0571435 -0.028572 -0.0142863 -5.01052e-007 0.0142853 0.028571 0.0571425 0.0714283 0.0714283 0.0999998 0.114286 0.142857 0.142857 0.171429 0.185714 0.214286 0.228572 0.242857 0.257143 0.285715 0.3 0.328572 0.342858 0.357143 0.371429 0.400001 0.414286 0.428572 0.457143 0.471429 0.485715 0.500001 0.514286 0.542858 0.571429 0.585715 0.600001 0.628572 0.642858 0.657144 0.685715 0.700001 0.714287 0.742858 0.757144 0.77143; #X coords 0 1 99 -1 200 140 1; #X restore 534 10 graph; #N canvas 0 0 450 300 graph1 0; #X array dst 100 float 0; #X coords 0 1 99 -1 200 140 1; #X restore 534 176 graph; #X obj 61 31 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 61 106 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 61 78 tab_reverse src dst; #X obj 59 341 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X msg 59 211 50 20 50; #X text 195 314 1.arg: source-name; #X text 195 327 2.arg: destination-name; #X msg 116 231 src src; #X msg 166 249 dst dst; #X obj 59 302 tab_reverse src dst; #X text 185 69 (the number of samples which are copied are:; #X text 198 83 the minimum of both array lengths); #X text 12 3 tab_reverse; #X text 90 29 copy value from src to dst in reverse arrangement ; #X text 44 164 list of 3 floats:; #X text 78 415 IEM KUG; #X text 62 403 musil; #X text 92 403 @; #X text 98 403 iem.at; #X text 61 425 Graz \, Austria; #X text 13 392 (c) Thomas Musil 2000 - 2006; #X text 56 175 1.) src onset; #X text 56 185 2.) dst onset; #X text 226 302 initial arguments:; #X text 74 319 output; #X text 173 229 xxx : change source name; #X text 219 248 xxx : change destination name; #X text 56 195 3.) n samples to copy reversal; #X connect 2 0 4 0; #X connect 4 0 3 0; #X connect 6 0 11 0; #X connect 9 0 11 0; #X connect 10 0 11 0; #X connect 11 0 5 0; iem_utils-v0.0.20180206/iem_tab/tab_sub-help.pd0000644000175000017500000000721612630366350021170 0ustar zmoelnigzmoelnig#N canvas 116 92 855 560 10; #N canvas 0 0 450 300 graph1 0; #X array src1 100 float 1; #A 0 -0.442858 -0.414287 -0.385715 -0.342858 -0.314287 -0.257144 -0.128572 -0.0428573 0.128572 0.228572 0.285715 0.328572 0.400001 0.414287 0.457144 0.457144 0.442858 0.385715 0.314287 0.257144 0.214286 0.1 0.0428572 -0.0142858 -0.0428573 -0.114286 -0.142858 -0.200001 -0.242858 -0.285715 -0.328572 -0.342858 -0.37143 -0.385715 -0.414287 -0.414287 -0.414287 -0.414287 -0.400001 -0.357144 -0.314287 -0.257144 -0.185715 -0.0714288 0.0142857 0.0571429 0.171429 0.328572 0.400001 0.442858 0.47143 0.485715 0.485715 0.485715 0.485715 0.485715 0.442858 0.357144 0.242858 0.185715 0.114286 0.0714285 -0.071429 -0.242858 -0.300001 -0.328573 -0.357144 -0.37143 -0.385715 -0.400001 -0.442858 -0.457144 -0.47143 -0.457144 -0.428573 -0.400001 -0.378573 -0.328572 -0.271429 -0.242858 -0.200001 -0.128572 -0.0428574 -0.0285717 0.0142858 0.114286 0.128572 0.185715 0.214286 0.257144 0.285715 0.314287 0.342858 0.357144 0.357144 0.357144 0.357144 0.357144 0.342858 0.328572; #X coords 0 1 99 -1 200 140 1; #X restore 534 20 graph; #N canvas 0 0 450 300 graph1 0; #X array dst 100 float 0; #X coords 0 1 99 -1 200 140 1; #X restore 535 368 graph; #X obj 61 41 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 61 116 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 59 350 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X msg 255 286 dst dst; #N canvas 0 0 450 300 graph1 0; #X array src2 100 float 1; #A 0 0.557135 0.57142 0.557135 0.528564 0.499992 0.428564 0.357136 0.299994 0.0999951 -0.0571467 -0.157146 -0.228574 -0.300002 -0.328573 -0.357145 -0.385716 -0.400001 -0.400001 -0.385716 -0.385716 -0.37143 -0.364287 -0.357145 -0.328573 -0.300002 -0.271431 -0.24286 -0.214288 -0.14286 -0.085718 -0.0428611 -4.28595e-006 0.0428526 0.099995 0.171423 0.21428 0.257137 0.328565 0.371422 0.428564 0.457135 0.485707 0.499992 0.514278 0.499992 0.471421 0.44285 0.414279 0.357136 0.285708 0.171423 0.0999952 0.0142815 -0.100003 -0.214288 -0.314288 -0.385716 -0.457144 -0.471429 -0.514286 -0.500001 -0.47143 -0.442858 -0.414287 -0.37143 -0.300002 -0.228574 -0.157146 -0.0714324 0.0571381 0.128566 0.199994 0.271422 0.34285 0.414278 0.457135 0.485707 0.499992 0.528563 0.542849 0.499992 0.457135 0.428564 0.371422 0.314279 0.242851 0.0857095 -0.0857178 -0.271431 -0.400001 -0.514286 -0.542858 -0.557143 -0.585714 -0.585714 -0.6 -0.6 -0.614286 -0.614286 -0.614286; #X coords 0 1 99 -1 200 140 1; #X restore 535 171 graph; #X msg 136 243 src1 src1; #X msg 195 265 src2 src2; #X msg 59 221 50 50 20 50; #X text 45 149 list of 4 floats:; #X text 212 363 3.arg: destination-name; #X text 78 445 IEM KUG; #X text 62 433 musil; #X text 92 433 @; #X text 98 433 iem.at; #X text 61 455 Graz \, Austria; #X text 13 422 (c) Thomas Musil 2000 - 2006; #X text 234 322 initial arguments:; #X text 72 329 output; #X text 306 285 xxx : change destination name; #X text 208 96 the minimum of the 3 array lengths); #X text 56 187 3.) dst onset; #X text 56 165 1.) src_1 onset; #X text 56 176 2.) src_2 onset; #X text 199 243 xxx : change source name 1; #X text 257 265 xxx : change source name 2; #X text 211 336 1.arg: source-name 1; #X text 211 349 2.arg: source-name 2; #X text 12 13 tab_sub; #X obj 61 88 tab_sub src1 src2 dst; #X obj 59 311 tab_sub src1 src2 dst; #X text 90 39 subtract the 2 src-arrays to dst-array; #X text 56 197 4.) n samples to subtract; #X text 195 82 (the number of samples which were subtracted are:; #X connect 2 0 30 0; #X connect 5 0 31 0; #X connect 7 0 31 0; #X connect 8 0 31 0; #X connect 9 0 31 0; #X connect 30 0 3 0; #X connect 31 0 4 0; iem_utils-v0.0.20180206/iem_tab/tab_powtodb-help.pd0000644000175000017500000000457712630366350022064 0ustar zmoelnigzmoelnig#N canvas 369 22 790 417 10; #N canvas 0 22 450 300 (subpatch) 0; #X array src 100 float 1; #A 0 0.0214324 0.0214324 0.0214324 0.0214324 0.0214324 0.0214324 0.0357179 0.0357179 0.0428607 0.0428607 0.0428607 0.0500035 0.0642891 0.0714318 0.0785746 0.0857174 0.0857174 0.100003 0.100003 0.107146 0.107146 0.114289 0.114289 0.121431 0.121431 0.128574 0.128574 0.135717 0.14286 0.14286 0.14286 0.150002 0.157145 0.157145 0.171431 0.178574 0.185716 0.192859 0.200002 0.214287 0.214287 0.22143 0.228573 0.242859 0.242859 0.257144 0.257144 0.264287 0.278573 0.292858 0.300001 0.314286 0.335715 0.35 0.357143 0.364286 0.378571 0.392857 0.407143 0.414285 0.435714 0.442857 0.449999 0.457142 0.471428 0.485713 0.492856 0.499999 0.521427 0.52857 0.542856 0.542856 0.564284 0.578569 0.599998 0.621426 0.635712 0.642854 0.649997 0.671426 0.685711 0.699997 0.707139 0.714282 0.735711 0.757139 0.764282 0.771425 0.778567 0.799996 0.807138 0.821424 0.83571 0.864281 0.885709 0.885709 0.899995 0.935709 0.949994 0.957137; #X coords 0 1 99 0 200 140 1; #X restore 534 10 graph; #N canvas 0 22 450 300 (subpatch) 0; #X array dst 100 float 0; #X coords 0 100 99 0 200 140 1; #X restore 534 166 graph; #X obj 61 31 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 61 106 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 59 301 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X msg 59 211 50 20 50; #X text 44 154 list of 3 floats:; #X text 222 273 1.arg: source-name; #X text 222 286 2.arg: destination-name; #X msg 154 213 src src; #X msg 185 234 dst dst; #X text 78 365 IEM KUG; #X text 57 353 musil; #X text 92 353 @; #X text 100 353 iem.at; #X text 61 375 Graz \, Austria; #X text 56 165 1.) src onset; #X text 56 175 2.) dst onset; #X text 231 261 initial arguments:; #X text 68 283 output; #X text 208 213 xxx : change source name; #X text 240 233 xxx : change destination name; #X text 205 69 (the number of samples which are copied are:; #X text 218 83 the minimum of both array lengths); #X text 13 342 (c) Thomas Musil 2000 - 2010; #X text 90 29 calculates the powtodb-value from src to dst; #X obj 61 78 tab_powtodb src dst; #X obj 59 264 tab_powtodb src dst; #X text 57 185 3.) n samples of powtodb; #X text 12 4 tab_powtodb; #X connect 2 0 26 0; #X connect 5 0 27 0; #X connect 9 0 27 0; #X connect 10 0 27 0; #X connect 26 0 3 0; #X connect 27 0 4 0; iem_utils-v0.0.20180206/iem_tab/tab_eq-help.pd0000644000175000017500000000651012630366350021000 0ustar zmoelnigzmoelnig#N canvas 116 92 863 568 10; #N canvas 0 22 450 300 (subpatch) 0; #X array src1 100 float 1; #A 0 -0.442858 -0.414287 -0.385715 -0.342858 -0.314287 -0.257144 -0.128572 -0.0428573 0.128572 0.228572 0.285715 0.328572 0.400001 0.414287 0.457144 0.457144 0.442858 0.385715 0.314287 0.257144 0.214286 0.1 0.0428572 -0.0142858 -0.0428573 -0.114286 -0.142858 -0.200001 -0.242858 -0.285715 -0.328572 -0.342858 -0.37143 -0.385715 -0.414287 -0.414287 -0.414287 -0.414287 -0.400001 -0.357144 -0.314287 -0.257144 -0.185715 -0.0714288 0.0142857 0.0571429 0.171429 0.328572 0.400001 0.442858 0.47143 0.485715 0.485715 0.485715 0.485715 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.485715 0.471429 0.457144 0.442858 0.442858 0.428572 0.414286 0.385715 0.357143 0.342858 0.314286 0.285715 0.242857 0.185714 0.142857 0.114286 0.085714; #X coords 0 1 99 -1 200 140 1; #X restore 584 10 graph; #N canvas 0 22 450 300 (subpatch) 0; #X array dst 100 float 0; #X coords 0 1 99 -1 200 140 1; #X restore 585 358 graph; #X obj 61 31 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 61 106 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 59 340 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X msg 255 276 dst dst; #N canvas 0 22 450 300 (subpatch) 0; #X array src2 100 float 1; #A 0 0.557135 0.57142 0.557135 0.528564 0.499992 0.428564 0.357136 0.299994 0.0999951 -0.0571467 -0.157146 -0.228574 -0.300002 -0.328573 -0.357145 -0.385716 -0.400001 -0.400001 -0.385716 -0.385716 -0.37143 -0.364287 -0.357145 -0.328573 -0.300002 -0.271431 -0.24286 -0.214288 -0.14286 -0.085718 -0.0428611 -4.28595e-06 0.0428526 0.099995 0.171423 0.21428 0.257137 0.328565 0.371422 0.442849 0.457135 0.471421 0.471421 0.485706 0.485706 0.485706 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.485714 0.471429 0.457135 0.428564 0.371422 0.314279 0.242851 0.0857095 -0.0857178 -0.271431 -0.400001 -0.514286 -0.542858 -0.557143 -0.585714 -0.585714 -0.6 -0.6 -0.614286 -0.614286 -0.614286; #X coords 0 1 99 -1 200 140 1; #X restore 585 161 graph; #X msg 136 233 src1 src1; #X msg 195 255 src2 src2; #X msg 59 211 50 50 20 50; #X text 45 139 list of 4 floats:; #X text 212 353 3.arg: destination-name; #X text 78 435 IEM KUG; #X text 57 423 musil; #X text 92 423 @; #X text 100 423 iem.at; #X text 61 445 Graz \, Austria; #X text 234 312 initial arguments:; #X text 72 319 output; #X text 316 275 xxx : change destination name; #X text 219 86 the minimum of the 3 array lengths); #X text 56 177 3.) dst onset; #X text 56 155 1.) src_1 onset; #X text 56 166 2.) src_2 onset; #X text 209 233 xxx : change source name 1; #X text 267 255 xxx : change source name 2; #X text 211 326 1.arg: source-name 1; #X text 211 339 2.arg: source-name 2; #X text 12 3 tab_eq; #X text 90 29 compare "equal to" the 2 src-arrays to dst-array ; #X obj 61 78 tab_eq src1 src2 dst; #X text 206 72 (the number of samples which were compared are:; #X text 56 187 4.) n samples to compare; #X obj 59 301 tab_eq src1 src2 dst; #X text 13 412 (c) Thomas Musil 2000 - 2009; #X connect 2 0 30 0; #X connect 5 0 33 0; #X connect 7 0 33 0; #X connect 8 0 33 0; #X connect 9 0 33 0; #X connect 30 0 3 0; #X connect 33 0 4 0; iem_utils-v0.0.20180206/iem_tab/tab_find_exact_peaks-help.pd0000644000175000017500000000572412630366350023670 0ustar zmoelnigzmoelnig#N canvas 178 103 949 490 10; #X obj 60 52 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 31 331 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X text 249 306 1.arg: source-name; #X floatatom 94 372 5 0 0 0 - - -; #X floatatom 143 373 5 0 0 0 - - -; #X msg 88 78 src src; #X msg 118 102 amp_sort; #X msg 120 124 freq_sort; #X floatatom 198 371 5 0 0 0 - - -; #X obj 263 369 pack 0 0 0; #X obj 263 392 print; #X msg 233 173 abs_min_height_diff 10; #X text 69 385 sort_index; #X text 204 382 amp; #X text 147 387 index; #N canvas 0 22 450 300 (subpatch) 0; #X array src 100 float 1; #A 0 9.99997 9.28569 9.28569 10.7143 7.14284 7.85712 8.5714 39 10 11 38 8.5714 7.85712 8.5714 9.28569 8.5714 9.99997 39 40 41 38 12.8571 12.8571 14.2857 12.8571 11.4285 12.1428 11.4285 9.99997 10.7143 11.4285 9.99997 9.28569 9.28569 9.99997 10.7143 10.7143 45 9.99997 9.99997 10.7143 11.4285 12.1428 10.7143 11.4285 12.1428 11.4285 46 11.4285 11.4285 11.4285 12.1428 12.8571 11.4285 11.4285 12.1428 12.8571 12.1428 12.1428 12.1428 12.1428 12.1428 11.4285 11.4285 11.4285 11.4285 10.7143 48 49 43 11.4285 12.1428 13.5714 15 13.5714 13.5714 14.2857 14.2857 15 15 14.2857 14.2857 14.2857 15 15 15.7142 15.7142 51 53 15 15 15 15 15 14.2857 14.2857 15 15.7142 16.4285 16.4285; #X coords 0 100 99 0 200 140 1; #X restore 658 93 graph; #X msg 171 149 max_peaks 9; #X text 20 347 ready; #X msg 289 194 width_range 1 4; #X msg 289 216 width_range 1 1; #N canvas 0 22 466 316 (subpatch) 0; #X msg 355 125 \; src const 0; #X msg 303 175 \; src 37 45; #X msg 310 223 \; src 47 46; #X msg 187 177 \; src 67 48 49 43; #X msg 180 218 \; src 87 51 53; #X msg 44 223 \; src 7 39 10 11 38; #X msg 50 181 \; src 17 39 40 41 38; #X obj 65 25 loadbang; #X msg 33 50 \; src xticks 0 1 5; #X msg 34 84 \; src xlabel -5.15 0 10 20 30 40 50 60 70 80 90; #X connect 7 0 8 0; #X connect 7 0 9 0; #X restore 716 289 pd; #X obj 314 73 loadbang; #X text 89 50 calculate all peaks (index bin amplitude); #X text 218 61 of an array; #X text 78 442 IEM KUG; #X text 57 430 musil; #X text 92 430 @; #X text 100 430 iem.at; #X text 61 452 Graz \, Austria; #X text 267 296 initial arguments:; #X text 192 111 kind of order; #X text 258 150 maximum number of peaks detected; #X text 395 168 vertical difference between peak; #X text 399 177 and noise; #X text 406 205 width range of peak in bins; #X text 21 6 tab_exact_find_peaks; #X obj 60 302 tab_find_exact_peaks src; #X text 184 7 same like tab_find_peaks; #X text 13 419 (c) Thomas Musil 2000 - 2009; #X msg 289 240 width_range 3 5; #X connect 0 0 36 0; #X connect 5 0 36 0; #X connect 6 0 36 0; #X connect 7 0 36 0; #X connect 9 0 10 0; #X connect 11 0 36 0; #X connect 16 0 36 0; #X connect 18 0 36 0; #X connect 19 0 36 0; #X connect 21 0 6 0; #X connect 21 0 16 0; #X connect 21 0 11 0; #X connect 21 0 18 0; #X connect 36 0 1 0; #X connect 36 1 3 0; #X connect 36 1 9 0; #X connect 36 2 4 0; #X connect 36 2 9 1; #X connect 36 3 8 0; #X connect 36 3 9 2; #X connect 39 0 36 0; iem_utils-v0.0.20180206/iem_tab/tab_get_size-help.pd0000644000175000017500000000312512630366350022203 0ustar zmoelnigzmoelnig#N canvas 116 92 706 333 10; #N canvas 0 22 450 300 (subpatch) 0; #X array src 100 float 1; #A 0 -0.442858 -0.414287 -0.385715 -0.342858 -0.314287 -0.257144 -0.128572 -0.0428573 0.128572 0.228572 0.285715 0.328572 0.400001 0.414287 0.457144 0.457144 0.442858 0.385715 0.314287 0.257144 0.214286 0.1 0.0428572 -0.0142858 -0.0428573 -0.114286 -0.142858 -0.200001 -0.242858 -0.285715 -0.328572 -0.342858 -0.37143 -0.385715 -0.414287 -0.414287 -0.414287 -0.414287 -0.400001 -0.357144 -0.314287 -0.257144 -0.185715 -0.0714288 0.0142857 0.0571429 0.171429 0.328572 0.400001 0.442858 0.47143 0.485715 0.485715 0.485715 0.485715 0.485715 0.442858 0.357144 0.242858 0.185715 0.114286 0.0714285 -0.071429 -0.242858 -0.300001 -0.328573 -0.357144 -0.37143 -0.385715 -0.400001 -0.442858 -0.457144 -0.47143 -0.457144 -0.428573 -0.400001 -0.378573 -0.328572 -0.271429 -0.242858 -0.200001 -0.128572 -0.0428574 -0.0285717 0.0142858 0.114286 0.128572 0.185715 0.214286 0.257144 0.285715 0.314287 0.342858 0.357144 0.357144 0.357144 0.357144 0.357144 0.342858 0.328572; #X coords 0 1 99 -1 200 140 1; #X restore 433 42 graph; #X obj 61 31 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X floatatom 60 102 5 0 0 0 - - -; #X text 93 224 IEM KUG; #X text 72 212 musil; #X text 107 212 @; #X text 115 212 iem.at; #X text 76 234 Graz \, Austria; #X text 201 68 initial arguments:; #X text 11 6 tab_sum; #X text 183 81 1.arg: source-name; #X text 28 201 (c) Thomas Musil 2000 - 2009; #X obj 61 78 tab_get_size src; #X text 56 116 array size; #X text 90 29 calc size of array; #X connect 1 0 12 0; #X connect 12 0 2 0; iem_utils-v0.0.20180206/iem_tab/tab_le-help.pd0000644000175000017500000000650512630366350020777 0ustar zmoelnigzmoelnig#N canvas 116 92 863 568 10; #N canvas 0 0 450 300 graph1 0; #X array src1 100 float 1; #A 0 -0.442858 -0.414287 -0.385715 -0.342858 -0.314287 -0.257144 -0.128572 -0.0428573 0.128572 0.228572 0.285715 0.328572 0.400001 0.414287 0.457144 0.457144 0.442858 0.385715 0.314287 0.257144 0.214286 0.1 0.0428572 -0.0142858 -0.0428573 -0.114286 -0.142858 -0.200001 -0.242858 -0.285715 -0.328572 -0.342858 -0.37143 -0.385715 -0.414287 -0.414287 -0.414287 -0.414287 -0.400001 -0.357144 -0.314287 -0.257144 -0.185715 -0.0714288 0.0142857 0.0571429 0.171429 0.328572 0.400001 0.442858 0.47143 0.485715 0.485715 0.485715 0.485715 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.485715 0.471429 0.457144 0.442858 0.442858 0.428572 0.414286 0.385715 0.357143 0.342858 0.314286 0.285715 0.242857 0.185714 0.142857 0.114286 0.085714; #X coords 0 1 99 -1 200 140 1; #X restore 534 10 graph; #N canvas 0 0 450 300 graph1 0; #X array dst 100 float 0; #X coords 0 1 99 -1 200 140 1; #X restore 535 358 graph; #X obj 61 31 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 61 106 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 59 340 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X msg 255 276 dst dst; #N canvas 0 0 450 300 graph1 0; #X array src2 100 float 1; #A 0 0.557135 0.57142 0.557135 0.528564 0.499992 0.428564 0.357136 0.299994 0.0999951 -0.0571467 -0.157146 -0.228574 -0.300002 -0.328573 -0.357145 -0.385716 -0.400001 -0.400001 -0.385716 -0.385716 -0.37143 -0.364287 -0.357145 -0.328573 -0.300002 -0.271431 -0.24286 -0.214288 -0.14286 -0.085718 -0.0428611 -4.28595e-006 0.0428526 0.099995 0.171423 0.21428 0.257137 0.328565 0.371422 0.442849 0.457135 0.471421 0.471421 0.485706 0.485706 0.485706 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.485714 0.471429 0.457135 0.428564 0.371422 0.314279 0.242851 0.0857095 -0.0857178 -0.271431 -0.400001 -0.514286 -0.542858 -0.557143 -0.585714 -0.585714 -0.6 -0.6 -0.614286 -0.614286 -0.614286; #X coords 0 1 99 -1 200 140 1; #X restore 535 161 graph; #X msg 136 233 src1 src1; #X msg 195 255 src2 src2; #X msg 59 211 50 50 20 50; #X text 45 139 list of 4 floats:; #X text 212 353 3.arg: destination-name; #X text 78 435 IEM KUG; #X text 62 423 musil; #X text 92 423 @; #X text 98 423 iem.at; #X text 61 445 Graz \, Austria; #X text 13 412 (c) Thomas Musil 2000 - 2006; #X text 234 312 initial arguments:; #X text 72 319 output; #X text 306 275 xxx : change destination name; #X text 208 86 the minimum of the 3 array lengths); #X text 56 177 3.) dst onset; #X text 56 155 1.) src_1 onset; #X text 56 166 2.) src_2 onset; #X text 199 233 xxx : change source name 1; #X text 257 255 xxx : change source name 2; #X text 211 326 1.arg: source-name 1; #X text 211 339 2.arg: source-name 2; #X text 195 72 (the number of samples which were compared are:; #X text 56 187 4.) n samples to compare; #X text 12 3 tab_le; #X obj 61 78 tab_le src1 src2 dst; #X obj 59 301 tab_le src1 src2 dst; #X text 90 29 compare "less than or equal to" the 2 src-arrays to dst-array; #X connect 2 0 32 0; #X connect 5 0 33 0; #X connect 7 0 33 0; #X connect 8 0 33 0; #X connect 9 0 33 0; #X connect 32 0 3 0; #X connect 33 0 4 0; iem_utils-v0.0.20180206/iem_tab/tab_mul-help.pd0000644000175000017500000000721612630366350021174 0ustar zmoelnigzmoelnig#N canvas 116 92 853 558 10; #N canvas 0 0 450 300 graph1 0; #X array src1 100 float 1; #A 0 -0.442858 -0.414287 -0.385715 -0.342858 -0.314287 -0.257144 -0.128572 -0.0428573 0.128572 0.228572 0.285715 0.328572 0.400001 0.414287 0.457144 0.457144 0.442858 0.385715 0.314287 0.257144 0.214286 0.1 0.0428572 -0.0142858 -0.0428573 -0.114286 -0.142858 -0.200001 -0.242858 -0.285715 -0.328572 -0.342858 -0.37143 -0.385715 -0.414287 -0.414287 -0.414287 -0.414287 -0.400001 -0.357144 -0.314287 -0.257144 -0.185715 -0.0714288 0.0142857 0.0571429 0.171429 0.328572 0.400001 0.442858 0.47143 0.485715 0.485715 0.485715 0.485715 0.485715 0.442858 0.357144 0.242858 0.185715 0.114286 0.0714285 -0.071429 -0.242858 -0.300001 -0.328573 -0.357144 -0.37143 -0.385715 -0.400001 -0.442858 -0.457144 -0.47143 -0.457144 -0.428573 -0.400001 -0.378573 -0.328572 -0.271429 -0.242858 -0.200001 -0.128572 -0.0428574 -0.0285717 0.0142858 0.114286 0.128572 0.185715 0.214286 0.257144 0.285715 0.314287 0.342858 0.357144 0.357144 0.357144 0.357144 0.357144 0.342858 0.328572; #X coords 0 1 99 -1 200 140 1; #X restore 534 20 graph; #N canvas 0 0 450 300 graph1 0; #X array dst 100 float 0; #X coords 0 1 99 -1 200 140 1; #X restore 535 368 graph; #X obj 61 41 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 61 116 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 59 350 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X msg 255 286 dst dst; #N canvas 0 0 450 300 graph1 0; #X array src2 100 float 1; #A 0 0.557135 0.57142 0.557135 0.528564 0.499992 0.428564 0.357136 0.299994 0.0999951 -0.0571467 -0.157146 -0.228574 -0.300002 -0.328573 -0.357145 -0.385716 -0.400001 -0.400001 -0.385716 -0.385716 -0.37143 -0.364287 -0.357145 -0.328573 -0.300002 -0.271431 -0.24286 -0.214288 -0.14286 -0.085718 -0.0428611 -4.28595e-006 0.0428526 0.099995 0.171423 0.21428 0.257137 0.328565 0.371422 0.428564 0.457135 0.485707 0.499992 0.514278 0.499992 0.471421 0.44285 0.414279 0.357136 0.285708 0.171423 0.0999952 0.0142815 -0.100003 -0.214288 -0.314288 -0.385716 -0.457144 -0.471429 -0.514286 -0.500001 -0.47143 -0.442858 -0.414287 -0.37143 -0.300002 -0.228574 -0.157146 -0.0714324 0.0571381 0.128566 0.199994 0.271422 0.34285 0.414278 0.457135 0.485707 0.499992 0.528563 0.542849 0.499992 0.457135 0.428564 0.371422 0.314279 0.242851 0.0857095 -0.0857178 -0.271431 -0.400001 -0.514286 -0.542858 -0.557143 -0.585714 -0.585714 -0.6 -0.6 -0.614286 -0.614286 -0.614286; #X coords 0 1 99 -1 200 140 1; #X restore 535 171 graph; #X msg 136 243 src1 src1; #X msg 195 265 src2 src2; #X msg 59 221 50 50 20 50; #X text 45 149 list of 4 floats:; #X text 212 363 3.arg: destination-name; #X text 78 445 IEM KUG; #X text 62 433 musil; #X text 92 433 @; #X text 98 433 iem.at; #X text 61 455 Graz \, Austria; #X text 13 422 (c) Thomas Musil 2000 - 2006; #X text 234 322 initial arguments:; #X text 72 329 output; #X text 306 285 xxx : change destination name; #X text 208 96 the minimum of the 3 array lengths); #X text 56 187 3.) dst onset; #X text 56 165 1.) src_1 onset; #X text 56 176 2.) src_2 onset; #X text 199 243 xxx : change source name 1; #X text 257 265 xxx : change source name 2; #X text 211 336 1.arg: source-name 1; #X text 211 349 2.arg: source-name 2; #X text 12 13 tab_mul; #X text 90 39 multiply the 2 src-arrays to dst-array; #X text 195 82 (the number of samples which were multiplied are:; #X text 56 197 4.) n samples to multiply; #X obj 59 311 tab_mul src1 src2 dst; #X obj 61 88 tab_mul src1 src2 dst; #X connect 2 0 34 0; #X connect 5 0 33 0; #X connect 7 0 33 0; #X connect 8 0 33 0; #X connect 9 0 33 0; #X connect 33 0 4 0; #X connect 34 0 3 0; iem_utils-v0.0.20180206/iem_tab/GnuGPL.txt0000644000175000017500000004311012630366350020124 0ustar zmoelnigzmoelnig GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License. iem_utils-v0.0.20180206/iem_tab/tab_le_scalar-help.pd0000644000175000017500000000462112630366350022321 0ustar zmoelnigzmoelnig#N canvas 22 55 884 588 10; #N canvas 0 0 450 300 graph1 0; #X array src 100 float 1; #A 0 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.485714 -0.457143 -0.4 -0.285713 -0.0571409 0.157146 0.328575 0.442861 0.557148 0.628577 0.714292 0.800006 0.85715 0.885721 0.885721 0.871435 0.842864 0.757149 0.557148 0.41429 0.257146 -0.0142835 -0.314285 -0.528572 -0.714287 -0.757145 -0.757145 -0.757145 -0.742859 -0.742859 -0.728573 -0.714287 -0.685715 -0.657144 -0.585715 -0.528572 -0.4 -0.242856 -0.0428551 0.157146 0.342861 0.51429 0.728577 0.800006 0.828578 0.828578 0.828578 0.828578 0.800006 0.771435 0.714292 0.571433 0.41429 0.242861 0.0857169 -0.0571409 -0.242856 -0.385714 -0.542858 -0.685716 -0.757145 -0.800002 -0.828574 -0.828574 -0.814288 -0.800002 -0.785716 -0.757145 -0.728573 -0.67143 -0.585715 -0.471429 -0.271428 -0.0857125 0.114288 0.228575 0.314289 0.385718 0.414285 0.428571 0.457143 0.471428 0.485714 0.485714 0.5 0.5 0.5 0.5 0.5 0.5 0.5; #X coords 0 1 99 -1 200 140 1; #X restore 527 116 graph; #N canvas 0 0 450 300 graph1 0; #X array dst 100 float 0; #X coords 0 1 99 -1 200 140 1; #X restore 527 325 graph; #X obj 61 106 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 59 370 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X msg 178 272 dst dst; #X msg 129 249 src src; #X msg 47 36 0.5; #X msg 82 37 -0.5; #X text 201 332 1.arg: source-name; #X text 201 345 2.arg: destination-name; #X text 31 163 list of 4 floats:; #X text 78 475 IEM KUG; #X text 62 463 musil; #X text 92 463 @; #X text 98 463 iem.at; #X text 61 485 Graz \, Austria; #X text 13 452 (c) Thomas Musil 2000 - 2006; #X text 224 318 initial arguments:; #X text 75 351 output; #X text 229 272 xxx : change destination name; #X text 218 86 the minimum of both array lengths); #X text 182 248 xxx : change source name; #X text 42 179 1.) src onset; #X text 42 190 2.) dst onset; #X text 42 201 3.) n samples to compare; #X text 42 210 4.) compared scalar value; #X text 205 72 (the number of samples which were compared are:; #X msg 48 228 0 0 100 0.5; #X text 12 3 tab_le_scalar; #X text 129 29 compare "less than or equal to" the src-array with this scalar to dst-array; #X obj 61 78 tab_le_scalar src dst; #X obj 59 331 tab_le_scalar src dst; #X connect 4 0 31 0; #X connect 5 0 31 0; #X connect 6 0 30 0; #X connect 7 0 30 0; #X connect 27 0 31 0; #X connect 30 0 2 0; #X connect 31 0 3 0; iem_utils-v0.0.20180206/iem_tab/tab_gt_scalar-help.pd0000644000175000017500000000460712630366350022337 0ustar zmoelnigzmoelnig#N canvas 22 55 880 584 10; #N canvas 0 0 450 300 graph1 0; #X array src 100 float 1; #A 0 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.485714 -0.457143 -0.4 -0.285713 -0.0571409 0.157146 0.328575 0.442861 0.557148 0.628577 0.714292 0.800006 0.85715 0.885721 0.885721 0.871435 0.842864 0.757149 0.557148 0.41429 0.257146 -0.0142835 -0.314285 -0.528572 -0.714287 -0.757145 -0.757145 -0.757145 -0.742859 -0.742859 -0.728573 -0.714287 -0.685715 -0.657144 -0.585715 -0.528572 -0.4 -0.242856 -0.0428551 0.157146 0.342861 0.51429 0.728577 0.800006 0.828578 0.828578 0.828578 0.828578 0.800006 0.771435 0.714292 0.571433 0.41429 0.242861 0.0857169 -0.0571409 -0.242856 -0.385714 -0.542858 -0.685716 -0.757145 -0.800002 -0.828574 -0.828574 -0.814288 -0.800002 -0.785716 -0.757145 -0.728573 -0.67143 -0.585715 -0.471429 -0.271428 -0.0857125 0.114288 0.228575 0.314289 0.385718 0.414285 0.428571 0.457143 0.471428 0.485714 0.485714 0.5 0.5 0.5 0.5 0.5 0.5 0.5; #X coords 0 1 99 -1 200 140 1; #X restore 527 116 graph; #N canvas 0 0 450 300 graph1 0; #X array dst 100 float 0; #X coords 0 1 99 -1 200 140 1; #X restore 527 325 graph; #X obj 61 106 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 59 370 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X msg 178 272 dst dst; #X msg 129 249 src src; #X msg 48 228 0 0 100 0.3; #X msg 47 36 0.5; #X msg 82 37 -0.5; #X text 201 332 1.arg: source-name; #X text 201 345 2.arg: destination-name; #X text 31 163 list of 4 floats:; #X text 78 475 IEM KUG; #X text 62 463 musil; #X text 92 463 @; #X text 98 463 iem.at; #X text 61 485 Graz \, Austria; #X text 13 452 (c) Thomas Musil 2000 - 2006; #X text 224 318 initial arguments:; #X text 75 351 output; #X text 229 272 xxx : change destination name; #X text 218 86 the minimum of both array lengths); #X text 182 248 xxx : change source name; #X text 42 179 1.) src onset; #X text 42 190 2.) dst onset; #X text 42 201 3.) n samples to compare; #X text 42 210 4.) compared scalar value; #X text 205 72 (the number of samples which were compared are:; #X text 12 3 tab_gt_scalar; #X obj 61 78 tab_gt_scalar src dst; #X obj 59 331 tab_gt_scalar src dst; #X text 129 29 compare "greater than" the src-array with this scalar to dst-array; #X connect 4 0 30 0; #X connect 5 0 30 0; #X connect 6 0 30 0; #X connect 7 0 29 0; #X connect 8 0 29 0; #X connect 29 0 2 0; #X connect 30 0 3 0; iem_utils-v0.0.20180206/iem_tab/tab_min_index-help.pd0000644000175000017500000000460212630366350022345 0ustar zmoelnigzmoelnig#N canvas 116 92 784 436 10; #N canvas 0 0 450 300 graph1 0; #X array src 100 float 1; #A 0 -0.442858 -0.414287 -0.385715 -0.342858 -0.314287 -0.257144 -0.128572 -0.0428573 0.128572 0.228572 0.285715 0.328572 0.400001 0.414287 0.457144 0.457144 0.442858 0.385715 0.314287 0.257144 0.214286 0.1 0.0428572 -0.0142858 -0.0428573 -0.114286 -0.142858 -0.200001 -0.242858 -0.285715 -0.328572 -0.342858 -0.37143 -0.385715 -0.414287 -0.414287 -0.414287 -0.414287 -0.400001 -0.357144 -0.314287 -0.257144 -0.185715 -0.0714288 0.0142857 0.0571429 0.185715 0.185715 0.200001 0.214286 0.214286 0.214286 0.228572 0.228572 0.214286 0.200001 0.185715 0.171429 0.142857 0.1 0.114286 0.0714285 -0.071429 -0.242858 -0.300001 -0.328573 -0.357144 -0.37143 -0.385715 -0.400001 -0.442858 -0.457144 -0.47143 -0.457144 -0.428573 -0.400001 -0.378573 -0.328572 -0.271429 -0.242858 -0.200001 -0.128572 -0.0428574 -0.0285717 0.0142858 0.114286 0.128572 0.185715 0.214286 0.257144 0.285715 0.314287 0.342858 0.357144 0.357144 0.357144 0.357144 0.357144 0.342858 0.328572; #X coords 0 1 99 -1 200 140 1; #X restore 529 24 graph; #X obj 61 31 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 61 106 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 59 294 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X text 205 270 1.arg: source-name; #X msg 101 213 src src; #X floatatom 109 103 5 0 0 0 - - -; #X floatatom 158 104 5 0 0 0 - - -; #X floatatom 107 320 5 0 0 0 - - -; #X floatatom 156 336 5 0 0 0 - - -; #X msg 59 193 35 50; #X text 75 384 IEM KUG; #X text 59 372 musil; #X text 89 372 @; #X text 95 372 iem.at; #X text 58 394 Graz \, Austria; #X text 10 361 (c) Thomas Musil 2000 - 2006; #X text 229 258 initial arguments:; #X text 65 280 output; #X text 152 213 xxx : change source name; #X text 43 150 list of 2 floats:; #X text 55 160 1.) src onset; #X text 11 6 tab_min_index; #X obj 61 78 tab_min_index src; #X obj 59 262 tab_min_index src; #X text 55 171 2.) n samples to calculate minimum; #X text 115 301 minimum index output; #X text 163 319 minimum value output; #X text 166 118 min; #X text 97 117 min_index; #X text 85 29 calculate minimum element and its index of array ; #X connect 1 0 23 0; #X connect 5 0 24 0; #X connect 10 0 24 0; #X connect 23 0 2 0; #X connect 23 1 6 0; #X connect 23 2 7 0; #X connect 24 0 3 0; #X connect 24 1 8 0; #X connect 24 2 9 0; iem_utils-v0.0.20180206/iem_tab/tab_div-help.pd0000644000175000017500000000722612630366350021162 0ustar zmoelnigzmoelnig#N canvas 116 92 851 556 10; #N canvas 0 22 450 300 (subpatch) 0; #X array src1 100 float 1; #A 0 -0.442858 -0.414287 -0.385715 -0.342858 -0.314287 -0.257144 -0.128572 -0.0428573 0.128572 0.228572 0.285715 0.328572 0.400001 0.414287 0.457144 0.457144 0.442858 0.385715 0.314287 0.257144 0.214286 0.1 0.0428572 -0.0142858 -0.0428573 -0.114286 -0.142858 -0.200001 -0.242858 -0.285715 -0.328572 -0.342858 -0.37143 -0.385715 -0.414287 -0.414287 -0.414287 -0.414287 -0.400001 -0.357144 -0.314287 -0.257144 -0.185715 -0.0714288 0.0142857 0.0571429 0.171429 0.328572 0.400001 0.442858 0.47143 0.485715 0.485715 0.485715 0.485715 0.485715 0.442858 0.357144 0.242858 0.185715 0.114286 0.0714285 -0.071429 -0.242858 -0.300001 -0.328573 -0.357144 -0.37143 -0.385715 -0.400001 -0.442858 -0.457144 -0.47143 -0.457144 -0.428573 -0.400001 -0.378573 -0.328572 -0.271429 -0.242858 -0.200001 -0.128572 -0.0428574 -0.0285717 0.0142858 0.114286 0.128572 0.185715 0.214286 0.257144 0.285715 0.314287 0.342858 0.357144 0.357144 0.357144 0.357144 0.357144 0.342858 0.328572; #X coords 0 1 99 -1 200 140 1; #X restore 574 20 graph; #N canvas 0 22 450 300 (subpatch) 0; #X array dst 100 float 0; #X coords 0 1 99 -1 200 140 1; #X restore 575 368 graph; #X obj 61 41 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 61 116 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 59 350 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X msg 255 286 dst dst; #N canvas 0 22 450 300 (subpatch) 0; #X array src2 100 float 1; #A 0 0.557135 0.57142 0.557135 0.528564 0.499992 0.428564 0.357136 0.299994 0.0999951 -0.0571467 -0.157146 -0.228574 -0.300002 -0.328573 -0.357145 -0.385716 -0.400001 -0.400001 -0.385716 -0.385716 -0.37143 -0.364287 -0.357145 -0.328573 -0.300002 -0.271431 -0.24286 -0.214288 -0.14286 -0.085718 -0.0428611 -4.28595e-06 0.0428526 0.099995 0.171423 0.21428 0.257137 0.328565 0.371422 0.428564 0.457135 0.485707 0.499992 0.514278 0.499992 0.471421 0.44285 0.414279 0.357136 0.285708 0.171423 0.0999952 0.0142815 -0.100003 -0.214288 -0.314288 -0.385716 -0.457144 -0.471429 -0.514286 -0.500001 -0.47143 -0.442858 -0.414287 -0.37143 -0.300002 -0.228574 -0.157146 -0.0714324 0.0571381 0.128566 0.199994 0.271422 0.34285 0.414278 0.457135 0.485707 0.499992 0.528563 0.542849 0.499992 0.457135 0.428564 0.371422 0.314279 0.242851 0.0857095 -0.0857178 -0.271431 -0.400001 -0.514286 -0.542858 -0.557143 -0.585714 -0.585714 -0.6 -0.6 -0.614286 -0.614286 -0.614286; #X coords 0 1 99 -1 200 140 1; #X restore 575 171 graph; #X msg 136 243 src1 src1; #X msg 195 265 src2 src2; #X msg 59 221 50 50 20 50; #X text 45 149 list of 4 floats:; #X text 212 363 3.arg: destination-name; #X text 78 445 IEM KUG; #X text 56 433 musil; #X text 92 433 @; #X text 100 433 iem.at; #X text 61 455 Graz \, Austria; #X text 234 322 initial arguments:; #X text 72 329 output; #X text 314 285 xxx : change destination name; #X text 229 96 the minimum of the 3 array lengths); #X text 56 187 3.) dst onset; #X text 56 165 1.) src_1 onset; #X text 56 176 2.) src_2 onset; #X text 207 243 xxx : change source name 1; #X text 265 265 xxx : change source name 2; #X text 211 336 1.arg: source-name 1; #X text 211 349 2.arg: source-name 2; #X text 12 13 tab_div; #X text 90 39 divide the 2 src-arrays to dst-array; #X text 216 82 (the number of samples which were divided are:; #X text 56 197 4.) n samples to divide; #X obj 61 88 tab_div src1 src2 dst; #X obj 59 311 tab_div src1 src2 dst; #X text 13 422 (c) Thomas Musil 2000 - 2009; #X connect 2 0 32 0; #X connect 5 0 33 0; #X connect 7 0 33 0; #X connect 8 0 33 0; #X connect 9 0 33 0; #X connect 32 0 3 0; #X connect 33 0 4 0; iem_utils-v0.0.20180206/iem_tab/tab_copy-help.pd0000644000175000017500000000461512630366350021351 0ustar zmoelnigzmoelnig#N canvas 116 92 784 483 10; #N canvas 0 22 450 300 (subpatch) 0; #X array src 100 float 1; #A 0 -0.442858 -0.414287 -0.385715 -0.342858 -0.314287 -0.257144 -0.128572 -0.0428573 0.128572 0.228572 0.285715 0.328572 0.400001 0.414287 0.457144 0.457144 0.442858 0.385715 0.314287 0.257144 0.214286 0.1 0.0428572 -0.0142858 -0.0428573 -0.114286 -0.142858 -0.200001 -0.242858 -0.285715 -0.328572 -0.342858 -0.37143 -0.385715 -0.414287 -0.414287 -0.414287 -0.414287 -0.400001 -0.357144 -0.314287 -0.257144 -0.185715 -0.0714288 0.0142857 0.0571429 0.171429 0.328572 0.400001 0.442858 0.47143 0.485715 0.485715 0.485715 0.485715 0.485715 0.442858 0.357144 0.242858 0.185715 0.114286 0.0714285 -0.071429 -0.242858 -0.300001 -0.328573 -0.357144 -0.37143 -0.385715 -0.400001 -0.442858 -0.457144 -0.47143 -0.457144 -0.428573 -0.400001 -0.378573 -0.328572 -0.271429 -0.242858 -0.200001 -0.128572 -0.0428574 -0.0285717 0.0142858 0.114286 0.128572 0.185715 0.214286 0.257144 0.285715 0.314287 0.342858 0.357144 0.357144 0.357144 0.357144 0.357144 0.342858 0.328572; #X coords 0 1 99 -1 200 140 1; #X restore 533 14 graph; #N canvas 0 22 450 300 (subpatch) 0; #X array dst 100 float 0; #X coords 0 1 99 -1 200 140 1; #X restore 533 180 graph; #X obj 60 35 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 60 110 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 58 345 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X msg 58 215 50 20 50; #X text 194 318 1.arg: source-name; #X text 194 331 2.arg: destination-name; #X msg 115 235 src src; #X msg 165 253 dst dst; #X text 184 73 (the number of samples which are copied are:; #X text 197 87 the minimum of both array lengths); #X text 43 168 list of 3 floats:; #X text 77 419 IEM KUG; #X text 56 407 musil; #X text 91 407 @; #X text 99 407 iem.at; #X text 60 429 Graz \, Austria; #X text 55 179 1.) src onset; #X text 55 189 2.) dst onset; #X text 225 306 initial arguments:; #X text 73 323 output; #X text 172 233 xxx : change source name; #X text 218 252 xxx : change destination name; #X text 11 7 tab_copy; #X text 89 33 copy value from src to dst; #X obj 60 82 tab_copy src dst; #X text 55 198 3.) n samples to copy; #X obj 58 306 tab_copy src dst; #X text 12 396 (c) Thomas Musil 2000 - 2009; #X connect 2 0 26 0; #X connect 5 0 28 0; #X connect 8 0 28 0; #X connect 9 0 28 0; #X connect 26 0 3 0; #X connect 28 0 4 0; iem_utils-v0.0.20180206/iem_tab/tab_ifft-help.pd0000644000175000017500000002423112630366350021323 0ustar zmoelnigzmoelnig#N canvas 265 105 961 540 10; #N canvas 0 22 450 300 (subpatch) 0; #X array src_re 100 float 0; #X coords 0 1 99 -1 199 100 1; #X restore 694 10 graph; #N canvas 0 22 450 300 (subpatch) 0; #X array dst_re 100 float 0; #X coords 0 1 99 -1 199 100 1; #X restore 694 239 graph; #X obj 24 47 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 24 122 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 62 371 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #N canvas 0 22 450 300 (subpatch) 0; #X array dst_im 100 float 0; #X coords 0 1 99 -1 199 100 1; #X restore 694 353 graph; #X msg 103 276 dst_re dst_re; #X msg 118 299 dst_im dst_im; #X msg 139 322 fftsize 64; #X floatatom 474 22 5 0 63 0 - - -; #X msg 546 341 \; dst_re const 0 \; dst_im const 0; #X text 102 464 IEM KUG; #X text 81 452 musil; #X text 116 452 @; #X text 124 452 iem.at; #X text 85 474 Graz \, Austria; #N canvas 0 22 478 328 generate_a_dirac 0; #X obj 61 62 clip 0 63; #X obj 61 32 inlet; #X msg 60 103 \; src_re const 0 \; src_re \$1 1; #X connect 0 0 2 0; #X connect 1 0 0 0; #X restore 474 41 pd generate_a_dirac; #X floatatom 514 22 5 -32 32 0 - - -; #N canvas 0 22 543 496 generate_a_cos 0; #X obj 120 18 inlet; #X obj 219 176 t f f; #X obj 219 211 / 32; #X obj 219 232 * 3.14159; #X obj 219 283 cos; #X obj 219 257 * 8; #X obj 219 127 t b f; #X obj 219 331 tabwrite src_re; #X obj 120 43 moses 0; #X obj 39 178 t f f; #X obj 39 213 / 32; #X obj 39 234 * 3.14159; #X obj 39 285 cos; #X obj 39 259 * 8; #X obj 39 129 t b f; #X obj 39 333 tabwrite src_re; #X obj 90 70 * -1; #N canvas 193 158 454 304 counter 0; #X obj 108 25 inlet; #X obj 109 163 outlet; #X obj 109 133 f; #X obj 142 133 + 1; #X obj 108 50 t b b; #X msg 154 76 0; #X msg 109 75 64; #X obj 110 98 until; #X connect 0 0 4 0; #X connect 2 0 3 0; #X connect 2 0 1 0; #X connect 3 0 2 1; #X connect 4 0 6 0; #X connect 4 1 5 0; #X connect 5 0 2 1; #X connect 6 0 7 0; #X connect 7 0 2 0; #X restore 219 151 pd counter; #N canvas 193 158 454 304 counter 0; #X obj 108 25 inlet; #X obj 109 163 outlet; #X obj 109 133 f; #X obj 142 133 + 1; #X obj 108 50 t b b; #X msg 154 76 0; #X msg 109 75 64; #X obj 110 98 until; #X connect 0 0 4 0; #X connect 2 0 3 0; #X connect 2 0 1 0; #X connect 3 0 2 1; #X connect 4 0 6 0; #X connect 4 1 5 0; #X connect 5 0 2 1; #X connect 6 0 7 0; #X connect 7 0 2 0; #X restore 38 154 pd counter; #X obj 39 310 * -1; #X obj 219 106 clip 0 32; #X obj 39 108 clip 0 32; #X connect 0 0 8 0; #X connect 1 0 2 0; #X connect 1 1 7 1; #X connect 2 0 3 0; #X connect 3 0 5 0; #X connect 4 0 7 0; #X connect 5 0 4 0; #X connect 6 0 17 0; #X connect 6 1 5 1; #X connect 8 0 16 0; #X connect 8 1 20 0; #X connect 9 0 10 0; #X connect 9 1 15 1; #X connect 10 0 11 0; #X connect 11 0 13 0; #X connect 12 0 19 0; #X connect 13 0 12 0; #X connect 14 0 18 0; #X connect 14 1 13 1; #X connect 16 0 21 0; #X connect 17 0 1 0; #X connect 18 0 9 0; #X connect 19 0 15 0; #X connect 20 0 6 0; #X connect 21 0 14 0; #X restore 514 61 pd generate_a_cos; #X floatatom 555 22 5 -31 31 0 - - -; #N canvas 0 22 499 423 generate_a_sin 0; #X obj 102 37 inlet; #X obj 246 182 t f f; #X obj 246 217 / 32; #X obj 246 238 * 3.14159; #X obj 246 263 * 8; #X obj 246 112 clip 0 31; #X obj 246 133 t b f; #X obj 246 337 tabwrite src_re; #X obj 246 289 sin; #X obj 54 180 t f f; #X obj 54 215 / 32; #X obj 54 236 * 3.14159; #X obj 54 261 * 8; #X obj 54 110 clip 0 31; #X obj 54 132 t b f; #X obj 54 335 tabwrite src_re; #X obj 54 287 sin; #X obj 102 60 moses 0; #X obj 54 88 * -1; #N canvas 193 158 454 304 counter 0; #X obj 108 25 inlet; #X obj 109 163 outlet; #X obj 109 133 f; #X obj 142 133 + 1; #X obj 108 50 t b b; #X msg 154 76 0; #X msg 109 75 64; #X obj 110 98 until; #X connect 0 0 4 0; #X connect 2 0 3 0; #X connect 2 0 1 0; #X connect 3 0 2 1; #X connect 4 0 6 0; #X connect 4 1 5 0; #X connect 5 0 2 1; #X connect 6 0 7 0; #X connect 7 0 2 0; #X restore 54 156 pd counter; #N canvas 193 158 454 304 counter 0; #X obj 108 25 inlet; #X obj 109 163 outlet; #X obj 109 133 f; #X obj 142 133 + 1; #X obj 108 50 t b b; #X msg 154 76 0; #X msg 109 75 64; #X obj 110 98 until; #X connect 0 0 4 0; #X connect 2 0 3 0; #X connect 2 0 1 0; #X connect 3 0 2 1; #X connect 4 0 6 0; #X connect 4 1 5 0; #X connect 5 0 2 1; #X connect 6 0 7 0; #X connect 7 0 2 0; #X restore 246 156 pd counter; #X obj 54 312 * -1; #X connect 0 0 17 0; #X connect 1 0 2 0; #X connect 1 1 7 1; #X connect 2 0 3 0; #X connect 3 0 4 0; #X connect 4 0 8 0; #X connect 5 0 6 0; #X connect 6 0 20 0; #X connect 6 1 4 1; #X connect 8 0 7 0; #X connect 9 0 10 0; #X connect 9 1 15 1; #X connect 10 0 11 0; #X connect 11 0 12 0; #X connect 12 0 16 0; #X connect 13 0 14 0; #X connect 14 0 19 0; #X connect 14 1 12 1; #X connect 16 0 21 0; #X connect 17 0 18 0; #X connect 17 1 5 0; #X connect 18 0 13 0; #X connect 19 0 9 0; #X connect 20 0 1 0; #X connect 21 0 15 0; #X restore 555 82 pd generate_a_sin; #X text 299 365 initial arguments:; #X text 37 147 list of 4 floats:; #X text 49 178 3.) dst_re-onset; #X text 49 188 4.) dst_im-onset; #X text 49 158 1.) src_re-onset; #X text 49 168 2.) src_im-onset; #X msg 62 207 20 20 30 30; #X text 259 412 4.arg: imag_destination-name; #X text 259 400 3.arg: real_destination-name; #X text 259 389 2.arg: imag_source-name; #X text 259 378 1.arg: real_source-name; #N canvas 0 22 450 300 (subpatch) 0; #X array src_im 100 float 0; #X coords 0 1 99 -1 199 100 1; #X restore 694 124 graph; #X msg 76 230 src_re src_re; #X msg 90 253 src_im src_im; #X msg 546 283 \; src_re const 0 \; src_im const 0; #X floatatom 474 132 5 0 63 0 - - -; #N canvas 0 22 478 328 generate_a_dirac 0; #X obj 61 62 clip 0 63; #X obj 61 32 inlet; #X msg 61 99 \; src_im const 0 \; src_im \$1 1; #X connect 0 0 2 0; #X connect 1 0 0 0; #X restore 474 151 pd generate_a_dirac; #X floatatom 514 132 5 -32 32 0 - - -; #N canvas 0 22 499 423 generate_a_cos 0; #X obj 120 18 inlet; #X obj 219 176 t f f; #X obj 219 211 / 32; #X obj 219 232 * 3.14159; #X obj 219 283 cos; #X obj 219 257 * 8; #X obj 219 127 t b f; #X obj 120 43 moses 0; #X obj 39 178 t f f; #X obj 39 213 / 32; #X obj 39 234 * 3.14159; #X obj 39 285 cos; #X obj 39 259 * 8; #X obj 39 129 t b f; #X obj 90 70 * -1; #X obj 40 334 tabwrite src_im; #X obj 220 331 tabwrite src_im; #N canvas 193 158 454 304 counter 0; #X obj 108 25 inlet; #X obj 109 163 outlet; #X obj 109 133 f; #X obj 142 133 + 1; #X obj 108 50 t b b; #X msg 154 76 0; #X msg 109 75 64; #X obj 110 98 until; #X connect 0 0 4 0; #X connect 2 0 3 0; #X connect 2 0 1 0; #X connect 3 0 2 1; #X connect 4 0 6 0; #X connect 4 1 5 0; #X connect 5 0 2 1; #X connect 6 0 7 0; #X connect 7 0 2 0; #X restore 39 153 pd counter; #N canvas 193 158 454 304 counter 0; #X obj 108 25 inlet; #X obj 109 163 outlet; #X obj 109 133 f; #X obj 142 133 + 1; #X obj 108 50 t b b; #X msg 154 76 0; #X msg 109 75 64; #X obj 110 98 until; #X connect 0 0 4 0; #X connect 2 0 3 0; #X connect 2 0 1 0; #X connect 3 0 2 1; #X connect 4 0 6 0; #X connect 4 1 5 0; #X connect 5 0 2 1; #X connect 6 0 7 0; #X connect 7 0 2 0; #X restore 219 153 pd counter; #X obj 39 311 * -1; #X obj 219 106 clip 0 32; #X obj 39 108 clip 0 32; #X connect 0 0 7 0; #X connect 1 0 2 0; #X connect 1 1 16 1; #X connect 2 0 3 0; #X connect 3 0 5 0; #X connect 4 0 16 0; #X connect 5 0 4 0; #X connect 6 0 18 0; #X connect 6 1 5 1; #X connect 7 0 14 0; #X connect 7 1 20 0; #X connect 8 0 9 0; #X connect 8 1 15 1; #X connect 9 0 10 0; #X connect 10 0 12 0; #X connect 11 0 19 0; #X connect 12 0 11 0; #X connect 13 0 17 0; #X connect 13 1 12 1; #X connect 14 0 21 0; #X connect 17 0 8 0; #X connect 18 0 1 0; #X connect 19 0 15 0; #X connect 20 0 6 0; #X connect 21 0 13 0; #X restore 514 171 pd generate_a_cos; #X floatatom 555 132 5 -31 31 0 - - -; #N canvas 0 22 495 419 generate_a_sin 0; #X obj 102 37 inlet; #X obj 246 182 t f f; #X obj 246 217 / 32; #X obj 246 238 * 3.14159; #X obj 246 263 * 8; #X obj 246 112 clip 0 31; #X obj 246 133 t b f; #X obj 246 289 sin; #X obj 54 180 t f f; #X obj 54 215 / 32; #X obj 54 236 * 3.14159; #X obj 54 261 * 8; #X obj 54 110 clip 0 31; #X obj 54 131 t b f; #X obj 54 287 sin; #X obj 102 60 moses 0; #X obj 54 88 * -1; #X obj 246 337 tabwrite src_im; #X obj 54 336 tabwrite src_im; #N canvas 193 158 454 304 counter 0; #X obj 108 25 inlet; #X obj 109 163 outlet; #X obj 109 133 f; #X obj 142 133 + 1; #X obj 108 50 t b b; #X msg 154 76 0; #X msg 109 75 64; #X obj 110 98 until; #X connect 0 0 4 0; #X connect 2 0 3 0; #X connect 2 0 1 0; #X connect 3 0 2 1; #X connect 4 0 6 0; #X connect 4 1 5 0; #X connect 5 0 2 1; #X connect 6 0 7 0; #X connect 7 0 2 0; #X restore 54 156 pd counter; #N canvas 193 158 454 304 counter 0; #X obj 108 25 inlet; #X obj 109 163 outlet; #X obj 109 133 f; #X obj 142 133 + 1; #X obj 108 50 t b b; #X msg 154 76 0; #X msg 109 75 64; #X obj 110 98 until; #X connect 0 0 4 0; #X connect 2 0 3 0; #X connect 2 0 1 0; #X connect 3 0 2 1; #X connect 4 0 6 0; #X connect 4 1 5 0; #X connect 5 0 2 1; #X connect 6 0 7 0; #X connect 7 0 2 0; #X restore 246 156 pd counter; #X obj 53 312 * -1; #X connect 0 0 15 0; #X connect 1 0 2 0; #X connect 1 1 17 1; #X connect 2 0 3 0; #X connect 3 0 4 0; #X connect 4 0 7 0; #X connect 5 0 6 0; #X connect 6 0 20 0; #X connect 6 1 4 1; #X connect 7 0 17 0; #X connect 8 0 9 0; #X connect 8 1 18 1; #X connect 9 0 10 0; #X connect 10 0 11 0; #X connect 11 0 14 0; #X connect 12 0 13 0; #X connect 13 0 19 0; #X connect 13 1 11 1; #X connect 14 0 21 0; #X connect 15 0 16 0; #X connect 15 1 5 0; #X connect 16 0 12 0; #X connect 19 0 8 0; #X connect 20 0 1 0; #X connect 21 0 18 0; #X restore 555 192 pd generate_a_sin; #X text 37 441 (c) Thomas Musil 2000 - 2009; #X text 10 0 tab_ifft; #X text 93 -1 complex inverse FTT with arrays; #X text 45 56 calculates a complex inverse fourier transformation of complex src-arrays to complex dst-arrays; #X obj 24 94 tab_ifft src_re src_im dst_re dst_im 64; #X obj 62 348 tab_ifft src_re src_im dst_re dst_im 64; #X text 259 424 5.arg: ifftsize; #X connect 2 0 46 0; #X connect 6 0 47 0; #X connect 7 0 47 0; #X connect 8 0 47 0; #X connect 9 0 16 0; #X connect 17 0 18 0; #X connect 19 0 20 0; #X connect 27 0 47 0; #X connect 33 0 47 0; #X connect 34 0 47 0; #X connect 36 0 37 0; #X connect 38 0 39 0; #X connect 40 0 41 0; #X connect 46 0 3 0; #X connect 47 0 4 0; iem_utils-v0.0.20180206/iem_tab/tab_ne-help.pd0000644000175000017500000000647512630366350021007 0ustar zmoelnigzmoelnig#N canvas 116 92 863 568 10; #N canvas 0 0 450 300 graph1 0; #X array src1 100 float 1; #A 0 -0.442858 -0.414287 -0.385715 -0.342858 -0.314287 -0.257144 -0.128572 -0.0428573 0.128572 0.228572 0.285715 0.328572 0.400001 0.414287 0.457144 0.457144 0.442858 0.385715 0.314287 0.257144 0.214286 0.1 0.0428572 -0.0142858 -0.0428573 -0.114286 -0.142858 -0.200001 -0.242858 -0.285715 -0.328572 -0.342858 -0.37143 -0.385715 -0.414287 -0.414287 -0.414287 -0.414287 -0.400001 -0.357144 -0.314287 -0.257144 -0.185715 -0.0714288 0.0142857 0.0571429 0.171429 0.328572 0.400001 0.442858 0.47143 0.485715 0.485715 0.485715 0.485715 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.485715 0.471429 0.457144 0.442858 0.442858 0.428572 0.414286 0.385715 0.357143 0.342858 0.314286 0.285715 0.242857 0.185714 0.142857 0.114286 0.085714; #X coords 0 1 99 -1 200 140 1; #X restore 534 10 graph; #N canvas 0 0 450 300 graph1 0; #X array dst 100 float 0; #X coords 0 1 99 -1 200 140 1; #X restore 535 358 graph; #X obj 61 31 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 61 106 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 59 340 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X msg 255 276 dst dst; #N canvas 0 0 450 300 graph1 0; #X array src2 100 float 1; #A 0 0.557135 0.57142 0.557135 0.528564 0.499992 0.428564 0.357136 0.299994 0.0999951 -0.0571467 -0.157146 -0.228574 -0.300002 -0.328573 -0.357145 -0.385716 -0.400001 -0.400001 -0.385716 -0.385716 -0.37143 -0.364287 -0.357145 -0.328573 -0.300002 -0.271431 -0.24286 -0.214288 -0.14286 -0.085718 -0.0428611 -4.28595e-006 0.0428526 0.099995 0.171423 0.21428 0.257137 0.328565 0.371422 0.442849 0.457135 0.471421 0.471421 0.485706 0.485706 0.485706 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.485714 0.471429 0.457135 0.428564 0.371422 0.314279 0.242851 0.0857095 -0.0857178 -0.271431 -0.400001 -0.514286 -0.542858 -0.557143 -0.585714 -0.585714 -0.6 -0.6 -0.614286 -0.614286 -0.614286; #X coords 0 1 99 -1 200 140 1; #X restore 535 161 graph; #X msg 136 233 src1 src1; #X msg 195 255 src2 src2; #X msg 59 211 50 50 20 50; #X text 45 139 list of 4 floats:; #X text 212 353 3.arg: destination-name; #X text 78 435 IEM KUG; #X text 62 423 musil; #X text 92 423 @; #X text 98 423 iem.at; #X text 61 445 Graz \, Austria; #X text 13 412 (c) Thomas Musil 2000 - 2006; #X text 234 312 initial arguments:; #X text 72 319 output; #X text 306 275 xxx : change destination name; #X text 208 86 the minimum of the 3 array lengths); #X text 56 177 3.) dst onset; #X text 56 155 1.) src_1 onset; #X text 56 166 2.) src_2 onset; #X text 199 233 xxx : change source name 1; #X text 257 255 xxx : change source name 2; #X text 211 326 1.arg: source-name 1; #X text 211 339 2.arg: source-name 2; #X text 195 72 (the number of samples which were compared are:; #X text 56 187 4.) n samples to compare; #X text 12 3 tab_ne; #X text 90 29 compare "not equal to" the 2 src-arrays to dst-array ; #X obj 61 78 tab_ne src1 src2 dst; #X obj 59 301 tab_ne src1 src2 dst; #X connect 2 0 33 0; #X connect 5 0 34 0; #X connect 7 0 34 0; #X connect 8 0 34 0; #X connect 9 0 34 0; #X connect 33 0 3 0; #X connect 34 0 4 0; iem_utils-v0.0.20180206/iem_tab/tab_abs-help.pd0000644000175000017500000000466512630366350021151 0ustar zmoelnigzmoelnig#N canvas 369 22 790 417 10; #N canvas 0 22 450 300 (subpatch) 0; #X array src 100 float 1; #A 0 -0.442858 -0.414287 -0.385715 -0.342858 -0.314287 -0.257144 -0.128572 -0.0428573 0.128572 0.228572 0.285715 0.328572 0.400001 0.414287 0.457144 0.457144 0.442858 0.385715 0.314287 0.257144 0.214286 0.1 0.0428572 -0.0142858 -0.0428573 -0.114286 -0.142858 -0.200001 -0.242858 -0.285715 -0.328572 -0.342858 -0.37143 -0.385715 -0.414287 -0.414287 -0.414287 -0.414287 -0.400001 -0.357144 -0.314287 -0.257144 -0.185715 -0.0714288 0.0142857 0.0571429 0.171429 0.328572 0.400001 0.442858 0.47143 0.485715 0.485715 0.485715 0.485715 0.485715 0.442858 0.357144 0.242858 0.185715 0.114286 0.0714285 -0.071429 -0.242858 -0.300001 -0.328573 -0.357144 -0.37143 -0.385715 -0.400001 -0.442858 -0.457144 -0.47143 -0.457144 -0.428573 -0.400001 -0.378573 -0.328572 -0.271429 -0.242858 -0.200001 -0.128572 -0.0428574 -0.0285717 0.0142858 0.114286 0.128572 0.185715 0.214286 0.257144 0.285715 0.314287 0.342858 0.357144 0.357144 0.357144 0.357144 0.357144 0.342858 0.328572; #X coords 0 1 99 -1 200 140 1; #X restore 534 10 graph; #N canvas 0 22 450 300 (subpatch) 0; #X array dst 100 float 0; #X coords 0 1 99 -1 200 140 1; #X restore 534 166 graph; #X obj 61 31 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 61 106 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 59 301 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X msg 59 211 50 20 50; #X text 44 154 list of 3 floats:; #X text 162 273 1.arg: source-name; #X text 162 286 2.arg: destination-name; #X msg 154 213 src src; #X msg 185 234 dst dst; #X obj 61 78 tab_abs src dst; #X obj 59 264 tab_abs src dst; #X text 78 365 IEM KUG; #X text 57 353 musil; #X text 92 353 @; #X text 100 353 iem.at; #X text 61 375 Graz \, Austria; #X text 12 3 tab_abs; #X text 90 29 copy absolute-value from src to dst; #X text 56 165 1.) src onset; #X text 56 175 2.) dst onset; #X text 171 261 initial arguments:; #X text 68 283 output; #X text 208 213 xxx : change source name; #X text 240 233 xxx : change destination name; #X text 175 69 (the number of samples which are copied are:; #X text 188 83 the minimum of both array lengths); #X text 56 185 3.) n samples to copy; #X text 190 185 absolute value; #X text 13 342 (c) Thomas Musil 2000 - 2009; #X connect 2 0 11 0; #X connect 5 0 12 0; #X connect 9 0 12 0; #X connect 10 0 12 0; #X connect 11 0 3 0; #X connect 12 0 4 0; iem_utils-v0.0.20180206/kiosk-plugin/0000755000175000017500000000000012661077615017313 5ustar zmoelnigzmoelnigiem_utils-v0.0.20180206/kiosk-plugin/LICENSE.txt0000644000175000017500000000304112661077615021134 0ustar zmoelnigzmoelnigThis software is copyrighted by Miller Puckette and others. The following terms (the "Standard Improved BSD License") apply to all files associated with the software unless explicitly disclaimed in individual files: Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. The name of the author may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. iem_utils-v0.0.20180206/kiosk-plugin/kiosk-plugin.tcl0000644000175000017500000001124112661077615022432 0ustar zmoelnigzmoelnig# META NAME Kiosk # META DESCRIPTION all windows in fullscreen mode # META DESCRIPTION main window invisible # META DESCRIPTION no keybindings # META AUTHOR IOhannes m zmölnig package require Tcl 8.5 package require Tk package require pdwindow 0.1 namespace eval ::kiosk:: { variable ::kiosk::config } ## default values set ::kiosk::config(KioskNewWindow) False set ::kiosk::config(ShowMenu) True set ::kiosk::config(FullScreen) False set ::kiosk::config(HideMain) False #set ::kiosk::config(WindowTitle) "Pd KIOSK" set ::kiosk::config(WindowTitle) "" set ::kiosk::config(HidePopup) False set ::kiosk::config(ScrollBars) True set ::kiosk::config(QuitOnClose) False set ::kiosk::config(PreventClose) False set ::kiosk::config(Bindings) True set ::kiosk::config(QuitBinding) True set ::kiosk::config(GeometryMain) "" proc ::kiosk::readconfig {{fname kiosk.cfg}} { set orgname $fname if {[file exists $fname]} { set fp [open $fname r] } else { set fname [file join $::current_plugin_loadpath $fname] if {[file exists $fname]} { set fp [open $fname r] } else { puts "kiosk-configuration not found: $orgname" return False } } while {![eof $fp]} { set data [gets $fp] if { [string is list $data ] } { if { [llength $data ] > 1 } { set ::kiosk::config([lindex $data 0]) [lindex $data 1] } } } return True } # this is just an empty menu menu .kioskmenu ## KIOSkify a window proc ::kiosk::makekiosk {mywin} { ## refuse to kioskify the main Pd window if { $mywin == ".pdwindow" } { return; } # puts "KIOSKing $mywin" #remove menu if { $::kiosk::config(ShowMenu) } { } { $mywin configure -menu .kioskmenu; } # make fullscreen if { $::kiosk::config(FullScreen) } { wm attributes $mywin -fullscreen 1 } # set the title of the window # (makes mostly sense in non-fullscren...) if { $::kiosk::config(WindowTitle) != "" } { wm title $mywin $::kiosk::config(WindowTitle) } # close pd if the window is closed (or no close at all) if { $::kiosk::config(PreventClose) } { # prevent WindowClose using Alt-F4 or clicking on the "x" wm protocol $mywin WM_DELETE_WINDOW ";" } { # if we do allow closing of windows, we might want to Quit as well if { $::kiosk::config(QuitOnClose) } { #wm protocol $mywin WM_DELETE_WINDOW "pdsend \"pd quit\"" bind $mywin "pdsend \"pd quit\"" } } set mycnv [tkcanvas_name $mywin ] # remove all special key/mouse bindings from the window if { $::kiosk::config(QuitBinding) } { } { # bind $mycnv {} # bind $mycnv {} # bind all {} # bind all {} bind $mycnv {} bind $mycnv {} bind all {} bind all {} } # remove all special key/mouse bindings from the window if { $::kiosk::config(Bindings) } { } { bindtags $mywin "" bindtags $mycnv "$mycnv" # rebind ordinary keypress events bind $mycnv {::pd_bindings::sendkey %W 1 %K %A 0} bind $mycnv {::pd_bindings::sendkey %W 0 %K %A 0} bind $mycnv {::pd_bindings::sendkey %W 1 %K %A 1} bind $mycnv {::pd_bindings::sendkey %W 0 %K %A 1} } } ###################################### ## read the default configuration file "kiosk.cfg" if { [info exists ::env(PD_KIOSK_CONFIG) ] } { ::kiosk::readconfig $::env(PD_KIOSK_CONFIG) } { ::kiosk::readconfig } ###### do some global KIOSK-settings ## set the geometry of the Pd window if { $::kiosk::config(GeometryMain) != "" } { wm geometry .pdwindow =$::kiosk::config(GeometryMain) } ## hide the Pd window if { $::kiosk::config(HideMain) } { set ::stderr 1 wm state .pdwindow withdraw } ## don't show popup menu on right-click if { $::kiosk::config(HidePopup) } { proc ::pdtk_canvas::pdtk_canvas_popup {mytoplevel xcanvas ycanvas hasproperties hasopen} { } } if { $::kiosk::config(ScrollBars) } { } { proc ::pdtk_canvas::pdtk_canvas_getscroll {tkcanvas} { } } # do the KIOSK-setting per existing window (those windows loaded at startup) foreach kioskwin [array names ::loaded] { ::kiosk::makekiosk $kioskwin } # do the KIOSKification for newly created windows as well if { $::kiosk::config(KioskNewWindow) } { ## not the most elegant way: KIOSKifying each window as it get's focus bind PatchWindow "+::kiosk::makekiosk %W" } pdtk_post "loaded: kiosk-plugin 0.2\n" iem_utils-v0.0.20180206/kiosk-plugin/kiosk.cfg0000644000175000017500000000301612661077615021114 0ustar zmoelnigzmoelnig# whether we want to hide the main PdWindow #HideMain True HideMain False # if main Window is not hidden, we can force a geometry to it #GeometryMain "500x400+20+50" # by default, only initially opened PatchWindows are KIOSKed # you can apply KIOSK settings to new windows, if you set the following to "True" #KioskNewWindow False KioskNewWindow False # whether you want to show the Menu-bar in the PatchWindows #ShowMenu False ShowMenu True # whether PatchWindows should be fullscreen #FullScreen True FullScreen False # override the name of the PatchWindowS (display this string rather than the # patch-name) # if set to "", the original window name is displayed #WindowTitle "Pd KIOSK" WindowTitle "" # prevent the PatchWindow to be closed using Alt-F4, clicking on the # "close-window" icon and the like #PreventClose True PreventClose False # if window closing is allowed and the main window is hidden, it is probably a # good idea to quit Pd, if one of the PatchWindowS is closed #QuitOnClose True QuitOnClose False # prevent the context menu to show up on Right-Click #HidePopup True HidePopup False # prevent special key-bindings (e.g. Control-Q for close) # ordinary key-bindings are still allowed to allow users to type #QuitBinding False QuitBinding True # prevent all special key-bindings (e.g. Control-W for close) # ordinary key-bindings are still allowed to allow users to type #Bindings False Bindings True # disable scroll-bars to appear, even if the content does not fit on the window #ScrollBars False ScrollBars True iem_utils-v0.0.20180206/kiosk-plugin/README.txt0000644000175000017500000000234112661077615021011 0ustar zmoelnigzmoelnigKIOSK mode for Pure Data ======================== KIOSK mode allows you to enable one or more of the following features * hiding the main Pd-window * disabling the menu bar in the patch window * making a patch window to be shown at fullsreen * setting a window name for the patch window (independent of the patch name) * prevent closing of patch windows (using Alt-F4, clicking on the "Close * Window" icon, et al.) * quit Pd when a patch window is closed * disable the (right click) context menu * disable key-bindings (like Ctrl-N) * prevent scroll bars from appearing, even if the patch content does not fit * on a single window you can enable/disable the parts you want to by editing a kiosk.cfg file. this config file is searched for in the working directory of Pd, and (if not found) in the plugin directory of the kiosk-plugin (usually ~/pd-externals/kiosk-plugin/) INSTALLATION ------------ just copy this directoy to ~/pd-externals/kiosk-plugin/ it will be automatically used, the next time you start Pd PREREQUISITES ------------- gui-plugins only work with Pd>=0.43 AUTHOR ------ IOhannes m zmölnig (though the fullscreen part was copied from András Murányi's "fullscreen" plugin) iem_utils-v0.0.20180206/patch2svg-plugin/0000755000175000017500000000000013207347064020067 5ustar zmoelnigzmoelnigiem_utils-v0.0.20180206/patch2svg-plugin/LICENSE.txt0000644000175000017500000000304512661077616021722 0ustar zmoelnigzmoelnigThis software is copyrighted by IOhannes m zmölnig and others. The following terms (the "Standard Improved BSD License") apply to all files associated with the software unless explicitly disclaimed in individual files: Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. The name of the author may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. iem_utils-v0.0.20180206/patch2svg-plugin/README.md0000644000175000017500000000212413207347064021345 0ustar zmoelnigzmoelnigSave Pd patches as SVG ====================== This adds a new menu-item to the "File" menu: "Save patch as SVG..." It allows you to save the current Pd patch as an SVG graphics. ## Installing Simply copy the [patch2svg-plugin.tcl](https://git.iem.at/pd-gui/patch2svg-plugin/raw/master/patch2svg-plugin.tcl) into your Pd searchpath. ## Repository The official repository is https://git.iem.at/pd-gui/patch2svg-plugin/ There is also a mirror on github: https://github.com/iem-projects/patch2svg-plugin ## Reporting Issues If you have discovered a bug or are missing some functionality, please do not hestitate to let me know. We are currently accepting bug-reports (and pull-requests) on our github mirror: https://github.com/iem-projects/patch2svg-plugin/issues ### Translating If you want the "Save patch as SVG..." menu-entry to be displayed in another language, please send me a translation (you can use the patch-tracker for this). ## AUTHORS - IOhannes m zmölnig - the canvas2svg converter was original written by Mats Bengtsson (and virtually no changes have been made to it). iem_utils-v0.0.20180206/patch2svg-plugin/patch2svg-plugin.tcl0000644000175000017500000013166212677304647024013 0ustar zmoelnigzmoelnig# META convert a patch to a picture (SVG) # META DESCRIPTION exports your patch as an SVG-image # META AUTHOR IOhannes m zmölnig # META VERSION 0.1 package require pdwindow 0.1 if [catch { package require msgcat ::msgcat::mcload po }] { puts "patch2svg: i18n failed" } #package require uriencode #package require tinyfileutils namespace eval ::patch2svg:: { variable label proc export {mytoplevel filename} { can2svg::canvas2file [tkcanvas_name $mytoplevel] $filename } # ::patch2svg::exportall proc exportall {{template "%s%x.svg"}} { ## exports all open windows to SVG ## template vars: ## - '%s' window name ## - '%x' window id if {[string length $template] == 0 } {set template "%s%x.svg" } foreach w [get_patchwindows] { set wname [lookup_windowname $w] set name [string map [list %s "$wname" %x "$w"] $template] pdtk_post "exporting to SVG: $name\n" puts "w $w" puts "wname $wname" puts "name $name" puts "template $template" puts "" export $w $name } } proc is_patchwindow {w} { #expr {[winfo toplevel $w] eq $w && ![catch {$w cget -menu}]} expr {[winfo class $w] eq "PatchWindow"} } proc get_patchwindows {{w .}} { set list {} if {[is_patchwindow $w]} { lappend list $w } foreach w [winfo children $w] { lappend list {*}[get_patchwindows $w] } return $list } # can2svg.tcl --- # # This file provides translation from canvas commands to XML/SVG format. # # Copyright (c) 2002-2007 Mats Bengtsson # # This file is distributed under BSD style license. # # $Id: can2svg.tcl,v 1.26 2008-01-27 08:19:36 matben Exp $ # # ########################### USAGE ############################################ # # NAME # can2svg - translate canvas command to SVG. # # SYNOPSIS # can2svg canvasCmd ?options? # canvasCmd is everything except the widget path name. # # can2svg::canvas2file widgetPath fileName ?options? # options: -height # -width # # can2svg::can2svg canvasCmd ?options? # options: -httpbasedir path # -imagehandler tclProc # -ovalasellipse 0|1 # -reusedefs 0|1 # -uritype file|http # -usestyleattribute 0|1 # -usetags 0|all|first|last # -windowitemhandler tclProc # # can2svg::config ?options? # options: -allownewlines 0 # -filtertags "" # -httpaddr localhost # -ovalasellipse 0 # -reusedefs 1 # -uritype file # -usetags all # -usestyleattribute 1 # -windowitemhandler tclProc # # ########################### CHANGES ########################################## # # 0.1 first release # 0.2 URI encoded image file path # 0.3 uses xmllists more, added svgasxmllist # # ########################### TODO ############################################# # # handle units (m->mm etc.) # better support for stipple patterns # how to handle tk editing? DOM? # # ... # We need URN encoding for the file path in images. From my whiteboard code. namespace eval can2svg { # namespace export can2svg canvas2file variable confopts array set confopts { -allownewlines 0 -filtertags "" -httpaddr localhost -ovalasellipse 0 -reusedefs 1 -uritype file -usetags all -usestyleattribute 1 -windowitemhandler "" } set confopts(-httpbasedir) [info script] variable formatArrowMarker variable formatArrowMarkerLast # The key into this array is 'arrowMarkerDef_$col_$a_$b_$c', where # col is color, and a, b, c are the arrow's shape. variable defsArrowMarkerArr # Similarly for stipple patterns. variable defsStipplePatternArr # This shouldn't be hardcoded! variable defaultFont {Helvetica 12} variable pi 3.14159265359 variable anglesToRadians [expr {$pi/180.0}] variable grayStipples {gray75 gray50 gray25 gray12} # Make 4x4 squares. Perhaps could be improved. variable stippleDataArr set stippleDataArr(gray75) \ {M 0 0 h3 M 0 1 h1 M 2 1 h2 M 0 2 h3 M 0 3 h1 M 2 3 h1} set stippleDataArr(gray50) \ {M 0 0 h1 M 2 0 h1 M 1 1 h1 M 3 1 h1 M 0 2 h1 M 2 2 h1 M 1 3 h1 M 3 3 h1} set stippleDataArr(gray25) \ {M 3 0 h1 M 1 1 h1 M 3 2 h1 M 1 3 h1} set stippleDataArr(gray12) \ {M 1 1 h1 M 3 3 h1} } proc can2svg::config {args} { variable confopts set options [lsort [array names confopts -*]] set usage [join $options ", "] if {[llength $args] == 0} { set result {} foreach name $options { lappend result $name $confopts($name) } return $result } regsub -all -- - $options {} options set pat ^-([join $options |])$ if {[llength $args] == 1} { set flag [lindex $args 0] if {[regexp -- $pat $flag]} { return $confopts($flag) } else { return -code error "Unknown option $flag, must be: $usage" } } else { foreach {flag value} $args { if {[regexp -- $pat $flag]} { set confopts($flag) $value } else { return -code error "Unknown option $flag, must be: $usage" } } } } # can2svg::can2svg -- # # Make xml out of a canvas command, widgetPath removed. # # Arguments: # cmd canvas create commands without prepending widget path. # args -httpbasedir path # -imagehandler tclProc # -ovalasellipse 0|1 # -reusedefs 0|1 # -uritype file|http # -usestyleattribute 0|1 # -usetags 0|all|first|last # # Results: # xml data proc can2svg::can2svg {cmd args} { set xml "" foreach xmllist [eval {svgasxmllist $cmd} $args] { append xml [MakeXML $xmllist] } return $xml } # can2svg::svgasxmllist -- # # Make a list of xmllists out of a canvas command, widgetPath removed. # # Arguments: # cmd canvas create command without prepending widget path. # args -httpbasedir path # -imagehandler tclProc # -ovalasellipse 0|1 # -reusedefs 0|1 # -uritype file|http # -usestyleattribute 0|1 # -usetags 0|all|first|last # # Results: # a list of xmllist = {tag attrlist isempty cdata {child1 child2 ...}} proc can2svg::svgasxmllist {cmd args} { variable confopts variable defsArrowMarkerArr variable defsStipplePatternArr variable defaultFont variable grayStipples set nonum_ {[^0-9]} set wsp_ {[ ]+} set xmlLL [list] array set argsA [array get confopts] array set argsA $args set args [array get argsA] if {![string equal [lindex $cmd 0] "create"]} { return } set type [lindex $cmd 1] set rest [lrange $cmd 2 end] # Separate coords from options. set indopt [lsearch -regexp $rest "-${nonum_}"] if {$indopt < 0} { set ind end set opts [list] } else { set ind [expr {$indopt - 1}] set opts [lrange $rest $indopt end] } # Flatten coordinate list! set coo [lrange $rest 0 $ind] if {[llength $coo] == 1} { set coo [lindex $coo 0] } array set optA $opts # Is the item in normal state? If not, return. if {[info exists optA(-state)] && $optA(-state) != "normal"} { return } # Figure out if we've got a spline. set haveSpline 0 if {[info exists optA(-smooth)] && ($optA(-smooth) != "0") && \ [info exists optA(-splinesteps)] && ($optA(-splinesteps) > 2)} { set haveSpline 1 } if {[info exists optA(-fill)]} { set fillValue $optA(-fill) if {![regexp {#[0-9]+} $fillValue]} { set fillValue [FormatColorName $fillValue] } } else { set fillValue black } if {[string length $argsA(-filtertags)] && [info exists optA(-tags)]} { set tag [uplevel #0 $argsA(-filtertags) [list $optA(-tags)]] set idAttr [list id $tag] } elseif {($argsA(-usetags) != "0") && [info exists optA(-tags)]} { # Remove any 'current' tag. set optA(-tags) \ [lsearch -all -not -inline $optA(-tags) current] switch -- $argsA(-usetags) { all { set idAttr [list id $optA(-tags)] } first { set idAttr [list id [lindex $optA(-tags) 0]] } last { set idAttr [list id [lindex $optA(-tags) end]] } } } else { set idAttr "" } # If we need a marker (arrow head) need to make that first. if {[info exists optA(-arrow)] && ![string equal $optA(-arrow) "none"]} { if {[info exists optA(-arrowshape)]} { # Make a key of the arrowshape list into the array. regsub -all -- $wsp_ $optA(-arrowshape) _ shapeKey set arrowKey ${fillValue}_${shapeKey} set arrowShape $optA(-arrowshape) } else { set arrowKey ${fillValue} set arrowShape {8 10 3} } if {!$argsA(-reusedefs) || \ ![info exists defsArrowMarkerArr($arrowKey)]} { set defsArrowMarkerArr($arrowKey) \ [eval {MakeArrowMarker} $arrowShape {$fillValue}] set xmlLL \ [concat $xmlLL $defsArrowMarkerArr($arrowKey)] } } # If we need a stipple bitmap, need to make that first. Limited!!! # Only: gray12, gray25, gray50, gray75 foreach key {-stipple -outlinestipple} { if {[info exists optA($key)] && \ ([lsearch $grayStipples $optA($key)] >= 0)} { set stipple $optA($key) if {![info exists defsStipplePatternArr($stipple)]} { set defsStipplePatternArr($stipple) \ [MakeGrayStippleDef $stipple] } lappend xmlLL $defsStipplePatternArr($stipple) } } #puts "can2svg::svgasxmllist cmd=$cmd, args=$args" switch -- $type { arc { # Had to do it the hard way! (?) # "Wrong" coordinate system :-( set attr [CoordsToAttr $type $coo $opts elem] if {[string length $idAttr] > 0} { set attr [concat $attr $idAttr] } set attr [concat $attr [MakeAttrList \ $type $opts $argsA(-usestyleattribute)]] lappend xmlLL [MakeXMLList $elem -attrlist $attr] } bitmap - image { if {[info exists optA(-image)]} { set elem "image" set attr [eval {MakeImageAttr $coo $opts} $args] if {[string length $idAttr] > 0} { set attr [concat $attr $idAttr] } set subEs [list] if {[info exists argsA(-imagehandler)]} { set subE [uplevel #0 $argsA(-imagehandler) [list $cmd] $args] if {[llength $subE]} { set subEs [list $subE] } } lappend xmlLL [MakeXMLList $elem -attrlist $attr -subtags $subEs] } } line { set attr [CoordsToAttr $type $coo $opts elem] if {[string length $idAttr] > 0} { set attr [concat $attr $idAttr] } set attr [concat $attr [MakeAttrList \ $type $opts $argsA(-usestyleattribute)]] lappend xmlLL [MakeXMLList $elem -attrlist $attr] } oval { set attr [CoordsToAttr $type $coo $opts elem] foreach {x y w h} [NormalizeRectCoords $coo] break if {[expr {$w == $h}] && !$argsA(-ovalasellipse)} { # set elem "circle";# circle needs an r: not an rx & ry set elem "ellipse" } else { set elem "ellipse" } if {[string length $idAttr] > 0} { set attr [concat $attr $idAttr] } set attr [concat $attr [MakeAttrList \ $type $opts $argsA(-usestyleattribute)]] lappend xmlLL [MakeXMLList $elem -attrlist $attr] } polygon { set attr [CoordsToAttr $type $coo $opts elem] if {[string length $idAttr] > 0} { set attr [concat $attr $idAttr] } set attr [concat $attr [MakeAttrList \ $type $opts $argsA(-usestyleattribute)]] lappend xmlLL [MakeXMLList $elem -attrlist $attr] } rectangle { set attr [CoordsToAttr $type $coo $opts elem] if {[string length $idAttr] > 0} { set attr [concat $attr $idAttr] } set attr [concat $attr [MakeAttrList \ $type $opts $argsA(-usestyleattribute)]] lappend xmlLL [MakeXMLList $elem -attrlist $attr] } text { set elem "text" set chdata "" set nlines 1 if {[info exists optA(-font)]} { set theFont $optA(-font) } else { set theFont $defaultFont } set ascent [font metrics $theFont -ascent] set lineSpace [font metrics $theFont -linespace] if {[info exists optA(-text)]} { set chdata $optA(-text) if {[info exists optA(-width)]} { # MICK O'DONNELL: if the text is wrapped in the wgt, we need # to simulate linebreaks # # If the item has got -width != 0 then we must wrap it ourselves # using newlines since the -text does not have extra newlines # at these linebreaks. set lines [split $chdata \n] set newlines {} foreach line $lines { set lines2 [SplitWrappedLines $line $theFont $optA(-width)] set newlines [concat $newlines $lines2] } set chdata [join $newlines \n] if {!$argsA(-allownewlines) || \ ([llength $newlines] > [llength $lines])} { set nlines [expr {[regexp -all "\n" $chdata] + 1}] } } else { if {!$argsA(-allownewlines)} { set nlines [expr {[regexp -all "\n" $chdata] + 1}] } } } # Figure out the coords of the first baseline. set anchor center if {[info exists optA(-anchor)]} { set anchor $optA(-anchor) } foreach {xbase ybase} \ [GetTextSVGCoords $coo $anchor $chdata $theFont $nlines] {} set attr [list "x" $xbase "y" $ybase] if {[string length $idAttr] > 0} { set attr [concat $attr $idAttr] } set attr [concat $attr [MakeAttrList \ $type $opts $argsA(-usestyleattribute)]] set dy 0 if {$nlines > 1} { # Use the 'tspan' trick here. set subList {} foreach line [split $chdata "\n"] { lappend subList [MakeXMLList "tspan" \ -attrlist [list "x" $xbase "dy" $dy] -chdata $line] set dy $lineSpace } lappend xmlLL [MakeXMLList $elem -attrlist $attr \ -subtags $subList] } else { lappend xmlLL [MakeXMLList $elem -attrlist $attr \ -chdata $chdata] } } window { # There is no svg for this; must be handled by application layer. #puts "window: $cmd" if {[string length $argsA(-windowitemhandler)]} { set xmllist \ [uplevel #0 $argsA(-windowitemhandler) [list $cmd] $args] if {[llength $xmllist]} { lappend xmlLL $xmllist } } } } return $xmlLL } # can2svg::CoordsToAttr -- # # Makes a list of attributes corresponding to type and coords. # # Arguments: # # # Results: # a list of attributes. proc can2svg::CoordsToAttr {type coo opts svgElementVar} { upvar $svgElementVar elem array set optA $opts # Figure out if we've got a spline. set haveSpline 0 if {[info exists optA(-smooth)] && ($optA(-smooth) != "0") && \ [info exists optA(-splinesteps)] && ($optA(-splinesteps) > 2)} { set haveSpline 1 } set attr {} switch -- $type { arc { set elem "path" set data [MakeArcPath $coo $opts] set attr [list "d" $data] } bitmap - image { array set __optA $opts if {[info exists __optA(-image)]} { set elem "image" set attr [ImageCoordsToAttr $coo $opts] } } line { if {$haveSpline} { set elem "path" set data [ParseSplineToPath $type $coo] set attr [list "d" $data] } else { set elem "polyline" set attr [list "points" $coo] } } oval { # Assume SVG ellipse. set elem "ellipse" foreach {x y w h} [NormalizeRectCoords $coo] break set attr [list \ "cx" [expr {$x + $w/2.0}] "cy" [expr {$y + $h/2.0}] \ "rx" [expr {$w/2.0}] "ry" [expr {$h/2.0}]] } polygon { if {$haveSpline} { set elem "path" set data [ParseSplineToPath $type $coo] set attr [list "d" $data] } else { set elem "polygon" set attr [list "points" $coo] } } rectangle { set elem "rect" foreach {x y w h} [NormalizeRectCoords $coo] break set attr [list "x" $x "y" $y "width" $w "height" $h] } text { set elem "text" # ? } } return $attr } # can2svg::MakeArcPath -- # # Makes a path using A commands from an arc. # Conversion from center to endpoint parameterization. # From: http://www.w3.org/TR/2003/REC-SVG11-20030114 proc can2svg::MakeArcPath {coo opts} { variable anglesToRadians variable pi # Canvas defaults. array set optA { -extent 90 -start 0 -style pieslice } array set optA $opts # Extract center and radius from bounding box. foreach {x1 y1 x2 y2} $coo break set cx [expr {($x1 + $x2)/2.0}] set cy [expr {($y1 + $y2)/2.0}] set rx [expr {abs($x1 - $x2)/2.0}] set ry [expr {abs($y1 - $y2)/2.0}] set start [expr {$anglesToRadians * $optA(-start)}] set extent [expr {$anglesToRadians * $optA(-extent)}] # NOTE: direction of angles are opposite for Tk and SVG! set theta1 [expr {-1*$start}] set delta [expr {-1*$extent}] set theta2 [expr {$theta1 + $delta}] set phi 0.0 # F.6.4 Conversion from center to endpoint parameterization. set x1 [expr {$cx + $rx * cos($theta1) * cos($phi) - \ $ry * sin($theta1) * sin($phi)}] set y1 [expr {$cy + $rx * cos($theta1) * sin($phi) + \ $ry * sin($theta1) * cos($phi)}] set x2 [expr {$cx + $rx * cos($theta2) * cos($phi) - \ $ry * sin($theta2) * sin($phi)}] set y2 [expr {$cy + $rx * cos($theta2) * sin($phi) + \ $ry * sin($theta2) * cos($phi)}] set fa [expr {abs($delta) > $pi ? 1 : 0}] set fs [expr {$delta > 0.0 ? 1 : 0}] set data [format "M %.1f %.1f A" $x1 $y1] append data [format " %.1f %.1f %.1f %1d %1d %.1f %.1f" \ $rx $ry $phi $fa $fs $x2 $y2] switch -- $optA(-style) { arc { # empty. } chord { append data " Z" } pieslice { append data [format " L %.1f %.1f Z" $cx $cy] } } return $data } # can2svg::MakeArcPathNonA -- # # Makes a path without any A commands from an arc. proc can2svg::MakeArcPathNonA {coo opts} { variable anglesToRadians array set optA $opts foreach {x1 y1 x2 y2} $coo break set cx [expr {($x1 + $x2)/2.0}] set cy [expr {($y1 + $y2)/2.0}] set rx [expr {abs($x1 - $x2)/2.0}] set ry [expr {abs($y1 - $y2)/2.0}] set rmin [expr {$rx > $ry ? $ry : $rx}] # This approximation gives a maximum half pixel error. set deltaPhi [expr {2.0/sqrt($rmin)}] set extent [expr {$anglesToRadians * $optA(-extent)}] set start [expr {$anglesToRadians * $optA(-start)}] set nsteps [expr {int(abs($extent)/$deltaPhi) + 2}] set delta [expr {$extent/$nsteps}] set data [format "M %.1f %.1f L" \ [expr {$cx + $rx*cos($start)}] [expr {$cy - $ry*sin($start)}]] for {set i 0} {$i <= $nsteps} {incr i} { set phi [expr {$start + $i * $delta}] append data [format " %.1f %.1f" \ [expr {$cx + $rx*cos($phi)}] [expr {$cy - $ry*sin($phi)}]] } if {[info exists optA(-style)]} { switch -- $optA(-style) { chord { append data " Z" } pieslice { append data [format " %.1f %.1f Z" $cx $cy] } } } else { # Pieslice is the default. append data [format " %.1f %.1f Z" $cx $cy] } return $data } # can2svg::MakeAttrList -- # # Handles the use of style attributes or presenetation attributes. proc can2svg::MakeAttrList {type opts usestyleattribute} { if {$usestyleattribute} { set attrList [list style [MakeStyleAttr $type $opts]] } else { set attrList [MakeStyleList $type $opts] } return $attrList } # can2svg::MakeStyleAttr -- # # Produce the SVG style attribute from the canvas item options. # # Arguments: # type tk canvas widget item type # opts # # Results: # The SVG style attribute as a a string. proc can2svg::MakeStyleAttr {type opts} { set style "" foreach {key value} [MakeStyleList $type $opts] { append style "${key}: ${value}; " } return [string trim $style] } proc can2svg::MakeStyleList {type opts args} { array set argsA { -setdefaults 1 } array set argsA $args # Defaults for everything except text. if {$argsA(-setdefaults) && ![string equal $type "text"]} { array set styleArr {fill none stroke black} } set fillCol black foreach {key value} $opts { switch -- $key { -arrow { set arrowValue $value } -arrowshape { set arrowShape $value } -capstyle { if {[string equal $value "projecting"]} { set value "square" } if {![string equal $value "butt"]} { set styleArr(stroke-linecap) $value } } -dash { set dashValue $value } -dashoffset { if {$value != 0} { set styleArr(stroke-dashoffset) $value } } -extent { # empty } -fill { # Need to translate names to hex spec. if {![regexp {#[0-9]+} $value]} { set value [FormatColorName $value] } set fillCol $value if {[string equal $type "line"]} { set styleArr(stroke) [MapEmptyToNone $value] } else { set styleArr(fill) [MapEmptyToNone $value] } } -font { array set styleArr [MakeFontStyleList $value] } -joinstyle { set styleArr(stroke-linejoin) $value } -outline { set styleArr(stroke) [MapEmptyToNone $value] } -outlinestipple { set outlineStippleValue $value } -start { # empty } -stipple { set stippleValue $value } -width { set styleArr(stroke-width) $value } } } # If any arrow specify its marker def url key. if {[info exists arrowValue]} { if {[info exists arrowShape]} { foreach {a b c} $arrowShape break set arrowIdKey "arrowMarkerDef_${fillCol}_${a}_${b}_${c}" set arrowIdKeyLast "arrowMarkerLastDef_${fillCol}_${a}_${b}_${c}" } else { set arrowIdKey "arrowMarkerDef_${fillCol}" set arrowIdKeyLast $arrowIdKey } switch -- $arrowValue { first { set styleArr(marker-start) "url(#$arrowIdKey)" } last { set styleArr(marker-end) "url(#$arrowIdKeyLast)" } both { set styleArr(marker-start) "url(#$arrowIdKey)" set styleArr(marker-end) "url(#$arrowIdKeyLast)" } } } if {[info exists stippleValue]} { # Overwrite any existing. set styleArr(fill) "url(#tile[string trimleft $stippleValue @])" } if {[info exists outlineStippleValue]} { # Overwrite any existing. set styleArr(stroke) "url(#tile[string trimleft $stippleValue @])" } # Transform dash value. if {[info exists dashValue]} { # Two different syntax here. if {[regexp {[\.,\-_]} $dashValue]} { # .=2 ,=4 -=6 space=4 times stroke width. # A space enlarges the... space. # Not foolproof! regsub -all -- {[^ ]} $dashValue "& " dash regsub -all -- " " $dash "12 " dash regsub -all -- " " $dash "8 " dash regsub -all -- " " $dash "4 " dash regsub -all -- {\.} $dash "2 " dash regsub -all -- {,} $dash "4 " dash regsub -all -- {-} $dash "6 " dash # Multiply with stroke width if > 1. if {[info exists styleArr(stroke-width)] && \ ($styleArr(stroke-width) > 1)} { set width $styleArr(stroke-width) set dashOrig $dash set dash {} foreach num $dashOrig { lappend dash [expr {int($width * $num)}] } } set styleArr(stroke-dasharray) [string trim $dash] } else { set dashValue [string trim $dashValue] if {$dashValue ne ""} { set styleArr(stroke-dasharray) $dashValue } } } if {[string equal $type "polygon"]} { set styleArr(fill-rule) "evenodd" } return [array get styleArr] } proc can2svg::FormatColorName {value} { if {[string length $value] == 0} { return $value } switch -- $value { black - white - red - green - blue { set col $value } default { # winfo rgb . white -> 65535 65535 65535 foreach rgb [winfo rgb . $value] { lappend rgbx [expr {$rgb >> 8}] } set col [eval {format "#%02x%02x%02x"} $rgbx] } } return $col } # can2svg::MakeFontStyleList -- # # Takes a tk font description and returns a flat style array. # # Arguments: # fontDesc a tk font description # # Results: # flat style array proc can2svg::MakeFontStyleList {fontDesc} { # MICK Modify - break a named font into its component fields set font [lindex $fontDesc 0] if {[lsearch -exact [font names] $font] > -1} { # This is a font name set styleArr(font-family) [font config $font -family] set fsize [font config $font -size] if {$fsize > 0} { # points set funit pt } else { # pixels (actually user units) set funit px } set styleArr(font-size) "[expr {abs($fsize)}]$funit" if {[font config $font -slant] == "italic"} { set styleArr(font-style) italic } if {[font config $font -weight] == "bold"} { set styleArr(font-weight) bold } if {[font config $font -underline]} { set styleArr(text-decoration) underline } if {[font config $font -overstrike]} { set styleArr(text-decoration) overline } } else { set styleArr(font-family) [lindex $fontDesc 0] if {[llength $fontDesc] > 1} { # Mick: added pt at end set fsize [lindex $fontDesc 1] if {$fsize > 0} { # points set funit pt } else { # pixels (actually user units) set funit px } set styleArr(font-size) "[expr {abs($fsize)}]$funit" } if {[llength $fontDesc] > 2} { set tkstyle [lindex $fontDesc 2] switch -- $tkstyle { bold { set styleArr(font-weight) $tkstyle } italic { set styleArr(font-style) $tkstyle } underline { set styleArr(text-decoration) underline } overstrike { set styleArr(text-decoration) overline } } } } return [array get styleArr] } # can2svg::SplitWrappedLines -- # # MICK O'DONNELL: added code to split wrapped lines # This is actally only needed for text items with -width != 0. # If -width = 0 then just return it. proc can2svg::SplitWrappedLines {line font wgtWidth} { # If the text is shorter than the widget width, no need to wrap # If the wgtWidth comes out as 0, don't wrap if {$wgtWidth == 0 || [font measure $font $line] <= $wgtWidth} { return [list $line] } # Wrap the line set width 0 set endchar 0 while {$width < $wgtWidth} { set substr [string range $line 0 [incr endchar]] set width [font measure $font $substr] } # Go back till we find a nonwhite char set char [string index $line $endchar] set default [expr {$endchar -1}] while {[BreakChar $char] == 0} { if {$endchar == 0} { # we got to the front without breaking, so break midword set endchar $default break } set char [string index $line [incr endchar -1]] } set first [string range $line 0 $endchar] set rest [string range $line [expr {$endchar+1}] end] return [concat [list $first] [SplitWrappedLines $rest $font $wgtWidth]] } proc can2svg::BreakChar {char} { if [string is space $char] {return 1} if {$char == "-"} {return 1} if {$char == ","} {return 1} return 0 } # can2svg::MakeImageAttr -- # # Special code is needed to make the attributes for an image item. # # Arguments: # elem # # Results: # proc can2svg::MakeImageAttr {coo opts args} { variable confopts array set optA {-anchor nw} array set optA $opts array set argsA $args set attrList [ImageCoordsToAttr $coo $opts] # We should make this an URI. set image $optA(-image) set fileName [$image cget -file] if {$fileName ne ""} { if {[string equal $argsA(-uritype) "file"]} { set uri [FileUriFromLocalFile $fileName] } elseif {[string equal $argsA(-uritype) "http"]} { set uri [HttpFromLocalFile $fileName] } lappend attrList "xlink:href" $uri } else { # Unclear if we can use base64 data in svg. } return $attrList } # Function Ê Ê: can2svg::ImageCoordsToAttr # ------------------------------ ------------------------------ --------- # Returns Ê Ê : list of x y width and height including description # Parameters Ê: coo Ê- coordinates of the image # Ê Ê Ê Ê Ê Ê Ê opts - argument list -anchor nw ... # # Description : # fixme (Roger) 01/25/2008 :Why not using the bounding box? # # Written Ê Ê : 2002-2007, Mats # Rewritten Ê : 01/25/2008, Roger # ------------------------------ ------------------------------ --------- proc can2svg::ImageCoordsToAttr {coo opts} { array set optArr {-anchor nw} array set optArr $opts if {![info exists optArr(-image)]} { return -code error "Missing -image option; can't parse that" } set theImage $optArr(-image) lassign $coo x0 y0 set w [image width $theImage] set h [image height $theImage] set x [expr {$x0 - $w/2.0}] set y [expr {$y0 - $h/2.0}] if { "center" ne $optArr(-anchor) } { foreach orientation [split $optArr(-anchor) {}] { switch $orientation { n { set y $y0 } s { set y [expr {$y0 - $w}] } e { set x [expr {$x0 - $h}] } w { set x $x0 } default {} } } } return [list "x" $x "y" $y "width" $w "height" $h] } proc can2svg::ImageCoordsToAttrBU {coo opts} { array set optA {-anchor nw} array set optA $opts if {[info exists optA(-image)]} { set theImage $optA(-image) set w [image width $theImage] set h [image height $theImage] } else { return -code error "Missing -image option; can't parse that" } foreach {x0 y0} $coo break switch -- $optA(-anchor) { nw { set x $x0 set y $y0 } n { set x [expr {$x0 - $w/2.0}] set y $y0 } ne { set x [expr {$x0 - $w}] set y $y0 } e { set x $x0 set y [expr {$y0 - $h/2.0}] } se { set x [expr {$x0 - $w}] set y [expr {$y0 - $h}] } s { set x [expr {$x0 - $w/2.0}] set y [expr {$y0 - $h}] } sw { set x $x0 set y [expr {$y0 - $h}] } w { set x $x0 set y [expr {$y0 - $h/2.0}] } center { set x [expr {$x0 - $w/2.0}] set y [expr {$y0 - $h/2.0}] } } set attrList [list "x" $x "y" $y "width" $w "height" $h] return $attrList } # can2svg::GetTextSVGCoords -- # # Figure out the baseline coords of the svg text element from # the canvas text item. # # Arguments: # coo {x y} # anchor # chdata character data, newlines included. # # Results: # raw xml data of the marker def element. proc can2svg::GetTextSVGCoords {coo anchor chdata theFont nlines} { foreach {x y} $coo break set ascent [font metrics $theFont -ascent] set lineSpace [font metrics $theFont -linespace] # If not anchored to the west it gets more complicated. if {![string match $anchor "*w*"]} { # Need to figure out the extent of the text. if {$nlines <= 1} { set textWidth [font measure $theFont $chdata] } else { set textWidth 0 foreach line [split $chdata "\n"] { set lineWidth [font measure $theFont $line] if {$lineWidth > $textWidth} { set textWidth $lineWidth } } } } switch -- $anchor { nw { set xbase $x set ybase [expr {$y + $ascent}] } w { set xbase $x set ybase [expr {$y - $nlines*$lineSpace/2.0 + $ascent}] } sw { set xbase $x set ybase [expr {$y - $nlines*$lineSpace + $ascent}] } s { set xbase [expr {$x - $textWidth/2.0}] set ybase [expr {$y - $nlines*$lineSpace + $ascent}] } se { set xbase [expr {$x - $textWidth}] set ybase [expr {$y - $nlines*$lineSpace + $ascent}] } e { set xbase [expr {$x - $textWidth}] set ybase [expr {$y - $nlines*$lineSpace/2.0 + $ascent}] } ne { set xbase [expr {$x - $textWidth}] set ybase [expr {$y + $ascent}] } n { set xbase [expr {$x - $textWidth/2.0}] set ybase [expr {$y + $ascent}] } center { set xbase [expr {$x - $textWidth/2.0}] set ybase [expr {$y - $nlines*$lineSpace/2.0 + $ascent}] } } return [list $xbase $ybase] } # can2svg::ParseSplineToPath -- # # Make the path data string for a bezier. # # Arguments: # type canvas type: line or polygon # coo its coordinate list # # Results: # path data string proc can2svg::ParseSplineToPath {type coo} { set npts [expr {[llength $coo]/2}] # line is open ended while the polygon must be closed. # Need to construct a closed smooth polygon with path instructions. switch -- $npts { 1 { set data "M [lrange $coo 0 1]" } 2 { set data "M [lrange $coo 0 1] L [lrange $coo 2 3]" } 3 { set data "M [lrange $coo 0 1] Q [lrange $coo 2 5]" } default { if {[string equal $type "polygon"]} { set x0s [expr {([lindex $coo 0] + [lindex $coo end-1])/2.}] set y0s [expr {([lindex $coo 1] + [lindex $coo end])/2.}] set data "M $x0s $y0s" # Add Q1 and Q2 points. append data " Q [lrange $coo 0 1]" set x0 [expr {([lindex $coo 0] + [lindex $coo 2])/2.}] set y0 [expr {([lindex $coo 1] + [lindex $coo 3])/2.}] append data " $x0 $y0" set xctrlp [lindex $coo 2] set yctrlp [lindex $coo 3] set tind 4 } else { set data "M [lrange $coo 0 1]" # Add Q1 and Q2 points. append data " Q [lrange $coo 2 3]" set x0 [expr {([lindex $coo 2] + [lindex $coo 4])/2.}] set y0 [expr {([lindex $coo 3] + [lindex $coo 5])/2.}] append data " $x0 $y0" set xctrlp [lindex $coo 4] set yctrlp [lindex $coo 5] set tind 6 } append data " T" foreach {x y} [lrange $coo $tind end-2] { #puts "x=$x, y=$y, xctrlp=$xctrlp, yctrlp=$yctrlp" # The T point is the midpoint between the # two control points. set x0 [expr {($x + $xctrlp)/2.0}] set y0 [expr {($y + $yctrlp)/2.0}] set xctrlp $x set yctrlp $y append data " $x0 $y0" #puts "data=$data" } if {[string equal $type "polygon"]} { set x0 [expr {([lindex $coo end-1] + $xctrlp)/2.0}] set y0 [expr {([lindex $coo end] + $yctrlp)/2.0}] append data " $x0 $y0" append data " $x0s $y0s" } else { append data " [lrange $coo end-1 end]" } #puts "data=$data" } } return $data } # can2svg::MakeArrowMarker -- # # Make the xml for an arrow marker def element. # # Arguments: # a arrows length along its symmetry line # b arrows total length # c arrows half width # col its color # # Results: # a list of xmllists of the marker def elements, both start and last. proc can2svg::MakeArrowMarker {a b c col} { variable formatArrowMarker variable formatArrowMarkerLast unset -nocomplain formatArrowMarker if {![info exists formatArrowMarker]} { # "M 0 c, b 0, a c, b 2*c Z" for the start marker. # "M 0 0, b c, 0 2*c, b-a c Z" for the last marker. set data "M 0 %s, %s 0, %s %s, %s %s Z" set style "fill: %s; stroke: %s;" set attr [list "d" $data "style" $style] set arrowList [MakeXMLList "path" -attrlist $attr] set markerAttr [list "id" %s "markerWidth" %s "markerHeight" %s \ "refX" %s "refY" %s "orient" "auto"] set defElemList [MakeXMLList "defs" -subtags \ [list [MakeXMLList "marker" -attrlist $markerAttr \ -subtags [list $arrowList] ] ] ] set formatArrowMarker $defElemList # ...and the last arrow marker. set dataLast "M 0 0, %s %s, 0 %s, %s %s Z" set attrLast [list "d" $dataLast "style" $style] set arrowLastList [MakeXMLList "path" -attrlist $attrLast] set defElemLastList [MakeXMLList "defs" -subtags \ [list [MakeXMLList "marker" -attrlist $markerAttr \ -subtags [list $arrowLastList] ] ] ] set formatArrowMarkerLast $defElemLastList } set idKey "arrowMarkerDef_${col}_${a}_${b}_${c}" set idKeyLast "arrowMarkerLastDef_${col}_${a}_${b}_${c}" # Figure out the order of all %s substitutions. set markerXML [format $formatArrowMarker $idKey \ $b [expr {2*$c}] 0 $c \ $c $b $a $c $b [expr {2*$c}] $col $col] set markerLastXML [format $formatArrowMarkerLast $idKeyLast \ $b [expr {2*$c}] $b $c \ $b $c [expr {2*$c}] [expr {$b-$a}] $c $col $col] return [list $markerXML $markerLastXML] } # can2svg::MakeGrayStippleDef -- # # proc can2svg::MakeGrayStippleDef {stipple} { variable stippleDataArr set pathList [MakeXMLList "path" -attrlist \ [list "d" $stippleDataArr($stipple) "style" "stroke: black; fill: none;"]] set patterAttr [list "id" "tile$stipple" "x" 0 "y" 0 "width" 4 "height" 4 \ "patternUnits" "userSpaceOnUse"] set defElemList [MakeXMLList "defs" -subtags \ [list [MakeXMLList "pattern" -attrlist $patterAttr \ -subtags [list $pathList] ] ] ] return $defElemList } # can2svg::MapEmptyToNone -- # # # Arguments: # elem # # Results: # proc can2svg::MapEmptyToNone {val} { if {[string length $val] == 0} { return "none" } else { return $val } } # can2svg::NormalizeRectCoords -- # # # Arguments: # elem # # Results: # proc can2svg::NormalizeRectCoords {coo} { foreach {x1 y1 x2 y2} $coo {} return [list [expr {$x2 > $x1 ? $x1 : $x2}] \ [expr {$y2 > $y1 ? $y1 : $y2}] \ [expr {abs($x1-$x2)}] \ [expr {abs($y1-$y2)}]] } # can2svg::makedocument -- # # Adds the prefix and suffix elements to make a complete XML/SVG # document. # # Arguments: # elem # # Results: # proc can2svg::makedocument {width height xml} { set pre "\n\ " set svgStart "" set svgEnd "" return "${pre}\n${svgStart}\n${xml}${svgEnd}" } # can2svg::canvas2file -- # # Takes everything on a canvas widget, translates it to XML/SVG, # and puts it on a file. # # Arguments: # wcan the canvas widget path # path the file path # args: -height # -width # # Results: # proc can2svg::canvas2file {wcan path args} { variable confopts variable defsArrowMarkerArr variable defsStipplePatternArr array set argsA [array get confopts] foreach {x y width height} [$wcan cget -scrollregion] break array set argsA [list -width $width -height $height] array set argsA $args set args [array get argsA] # Need to make a fresh start for marker def's. unset -nocomplain defsArrowMarkerArr defsStipplePatternArr set fd [open $path w] # This could have been done line by line. set xml "" foreach id [$wcan find all] { set type [$wcan type $id] set opts [$wcan itemconfigure $id] set opcmd {} foreach opt $opts { set op [lindex $opt 0] set val [lindex $opt 4] # Empty val's except -fill can be stripped off. if {![string equal $op "-fill"] && ([string length $val] == 0)} { continue } lappend opcmd $op $val } set co [$wcan coords $id] set cmd [concat "create" $type $co $opcmd] append xml "\t[eval {can2svg $cmd} $args]\n" } puts $fd [makedocument $argsA(-width) $argsA(-height) $xml] close $fd } # can2svg::MakeXML -- # # Creates raw xml data from a hierarchical list of xml code. # This proc gets called recursively for each child. # It makes also internal entity replacements on character data. # Mixed elements aren't treated correctly generally. # # Arguments: # xmlList a list of xml code in the format described in the header. # # Results: # raw xml data. proc can2svg::MakeXML {xmlList} { # Extract the XML data items. foreach {tag attrlist isempty chdata childlist} $xmlList {} set rawxml "<$tag" foreach {attr value} $attrlist { append rawxml " ${attr}='${value}'" } if {$isempty} { append rawxml "/>" return $rawxml } else { append rawxml ">" } # Call ourselves recursively for each child element. # There is an arbitrary choice here where childs are put before PCDATA. foreach child $childlist { append rawxml [MakeXML $child] } # Make standard entity replacements. if {[string length $chdata]} { append rawxml [XMLCrypt $chdata] } append rawxml "" return $rawxml } # can2svg::MakeXMLList -- # # Build an element list given the tag and the args. # # Arguments: # tagname: the name of this element. # args: # -empty 0|1 Is this an empty tag? If $chdata # and $subtags are empty, then whether # to make the tag empty or not is decided # here. (default: 1) # -attrlist {attr1 value1 attr2 value2 ..} Vars is a list # consisting of attr/value pairs, as shown. # -chdata $chdata ChData of tag (default: ""). # -subtags {$subchilds $subchilds ...} is a list containing xmldata # of $tagname's subtags. (default: no sub-tags) # # Results: # a list suitable for can2svg::MakeXML. proc can2svg::MakeXMLList {tagname args} { # Fill in the defaults. array set xmlarr {-isempty 1 -attrlist {} -chdata {} -subtags {}} # Override the defults with actual values. if {[llength $args] > 0} { array set xmlarr $args } if {!(($xmlarr(-chdata) eq "") && ($xmlarr(-subtags) eq ""))} { set xmlarr(-isempty) 0 } # Build sub elements list. set sublist [list] foreach child $xmlarr(-subtags) { lappend sublist $child } set xmlList [list $tagname $xmlarr(-attrlist) $xmlarr(-isempty) \ $xmlarr(-chdata) $sublist] return $xmlList } # can2svg::FileUriFromLocalFile -- # # Not foolproof! proc can2svg::FileUriFromLocalFile {path} { # Quote the disallowed characters according to the RFC for URN scheme. # ref: RFC2141 sec2.2 return file://[uriencode::quotepath $path] } # can2svg::HttpFromLocalFile -- # # Translates an absolute file path to an uri encoded http address. proc can2svg::HttpFromLocalFile {path} { variable confopts set relPath [::tfileutils::relative $confopts(-httpbasedir) $path] set relPath [uriencode::quotepath $relPath] return "http://$confopts(-httpaddr)/$relPath" } # can2svg::XMLCrypt -- # # Makes standard XML entity replacements. # # Arguments: # chdata: character data. # # Results: # chdata with XML standard entities replaced. proc can2svg::XMLCrypt {chdata} { foreach from {\& < > {"} {'}} \ to {{\&} {\<} {\>} {\"} {\'}} { regsub -all $from $chdata $to chdata } return $chdata } ## the following dummy is only here to undo the quoting error ## produced by some syntax-highlighters in the above function proc can2svg::dummy {} { puts {"} } #------------------------------------------------------------------------------- proc menu_export {mytoplevel} { if { ! [file isdirectory $::fileopendir]} {set ::fileopendir $::env(HOME)} set name [lookup_windowname $mytoplevel] # check if this is the default name 'Untitled' and if so, use 'pd.svg' # else strip the trailing .pd and add .svg set filename [tk_getSaveFile -initialfile ${name}.svg \ -defaultextension .svg \ -filetypes { {{Scalable Vector Graphics} {.svg}} } \ -initialdir $::fileopendir \ ] if {$filename ne ""} { set cnv [tkcanvas_name $mytoplevel] can2svg::canvas2file $cnv $filename set ::fileopendir [file dirname $filename] } } proc focus {winid state} { set menustate [expr $state?"normal":"disabled"] .menubar.file entryconfigure $::patch2svg::label -state $menustate } proc register {} { # create an entry for our "print2svg" in the "file" menu set ::patch2svg::label [_ "Export patch as SVG..."] set mymenu .menubar.file if {$::windowingsystem eq "aqua"} { set inserthere 8 } else { set inserthere 8 } #$mymenu insert $inserthere separator $mymenu insert $inserthere command \ -label $::patch2svg::label \ -state disabled \ -command {::patch2svg::menu_export $::focused_window} # bind all <$::modifier-Key-s> {::deken::open_helpbrowser .helpbrowser2} bind PatchWindow "+::patch2svg::focus %W 1" bind PdWindow "+::patch2svg::focus %W 0" set rpdr ::pd_connect::register_plugin_dispatch_receiver if {[info procs $rpdr] == $rpdr} { ${rpdr} ::patch2svg::exportall ::patch2svg::exportall } pdtk_post "loaded patch2svg-plugin\n" } } ::patch2svg::register iem_utils-v0.0.20180206/patch2svg-plugin/autoexport.pd0000644000175000017500000000054512661077616022640 0ustar zmoelnigzmoelnig#N canvas 446 419 596 293 10; #X obj 103 83 loadbang; #X obj 103 105 t b; #X obj 103 127 delay 1000; #X obj 103 149 t b b; #X obj 103 171 delay 100; #X msg 103 193 \; pd quit; #X msg 182 180 \; pd plugin-dispatch ::patch2svg::exportall; #X connect 0 0 1 0; #X connect 1 0 2 0; #X connect 2 0 3 0; #X connect 3 0 4 0; #X connect 3 1 6 0; #X connect 4 0 5 0; iem_utils-v0.0.20180206/patch2svg-plugin/po/0000755000175000017500000000000012661414061020500 5ustar zmoelnigzmoelnigiem_utils-v0.0.20180206/patch2svg-plugin/po/de.po0000644000175000017500000000110312661414036021425 0ustar zmoelnigzmoelnigmsgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: http://bugs.puredata.info\n" "POT-Creation-Date: 2016-02-17 22:39+0100\n" "PO-Revision-Date: \n" "Last-Translator: \n" "Language-Team: \n" "Language: de\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 1.8.7\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" # SOME DESCRIPTIVE TITLE. # This file is put in the public domain. # FIRST AUTHOR , YEAR. # msgid "Export patch as SVG..." msgstr "Patch als SVG exportieren..." iem_utils-v0.0.20180206/patch2svg-plugin/po/Makefile0000644000175000017500000000220612661414013022135 0ustar zmoelnigzmoelnig PACKAGE_NAME = patch to SVG PACKAGE_VERSION = 1.0 TCLFILES = patch2svg-plugin.tcl # we use all language files found here POFILES=$(wildcard *.po) MSGFILES=$(POFILES:.po=.msg) TEMPLATE = patch2svg.pot FILES = $(addprefix ../, $(TCLFILES)) # generate .msg files from the .po files all: $(TEMPLATE) $(MSGFILES) # refresh .po files from the template clean: -rm -f -- $(MSGFILES) -rm -f -- $(POFILES:=~) -rm -f -- $(TEMPLATE) distclean: clean po: $(TEMPLATE) $(POFILES) $(TEMPLATE): $(FILES) touch $(TEMPLATE) xgettext --join-existing \ --from-code=UTF-8 --language=Tcl --keyword=_ \ --sort-output --no-location --output=$(TEMPLATE) \ --package-name="$(PACKAGE_NAME)" \ --package-version=$(PACKAGE_VERSION) \ --copyright-holder='This file is put in the public domain' \ --foreign-user \ --msgid-bugs-address=http://bugs.puredata.info \ $(FILES) $(POFILES): $(TEMPLATE) touch $@ msgmerge --sort-output --no-fuzzy-matching --no-location --update $@ $(TEMPLATE) %.msg: %.po msgfmt --check --tcl --locale=$* -d . $< #install: $(MSGFILES) # install -d $(DESTDIR) # install $(MSGFILES) $(DESTDIR) install: @echo "nothing to install" iem_utils-v0.0.20180206/punish/0000755000175000017500000000000013207347074016201 5ustar zmoelnigzmoelnigiem_utils-v0.0.20180206/punish/triggerize-plugin/0000755000175000017500000000000013236306220021636 5ustar zmoelnigzmoelnigiem_utils-v0.0.20180206/punish/triggerize-plugin/triggerize-plugin.tcl0000644000175000017500000000355013004410214026004 0ustar zmoelnigzmoelnig# META helper plugin for triggerize-selection # META DESCRIPTION adds menu to tell the 'triggerize' library to doit # META AUTHOR IOhannes m zmölnig # META VERSION 0.1 package require pdwindow 0.1 if [catch { package require msgcat ::msgcat::mcload po }] { puts "iem::punish::triggerize: i18n failed" } namespace eval ::iem::punish::triggerize:: { variable label proc focus {winid state} { set menustate [expr $state?"normal":"disabled"] .menubar.edit entryconfigure "$::iem::punish::triggerize::label" -state $menustate } proc register {} { # create an entry for our "triggerize" in the "edit" menu set ::iem::punish::triggerize::label [_ "Triggerize Selection"] set accelerator $::pd_menus::accelerator set mymenu .menubar.edit if {$::windowingsystem eq "aqua"} { set inserthere 8 set accelerator "$accelerator" } else { set inserthere 8 set accelerator "$accelerator" } set accelerator "$accelerator+T" $mymenu insert $inserthere command \ -label $::iem::punish::triggerize::label \ -state disabled \ -accelerator "$accelerator" \ -command { menu_send $::focused_window triggerize } bind all <$::modifier-Key-t> {menu_send %W triggerize} bind PatchWindow "+::iem::punish::triggerize::focus %W 1" bind PdWindow "+::iem::punish::triggerize::focus %W 0" # attempt to load the 'triggerize' library from iem::punish # (that does all the work) set lib [string map {" " "\\ "} [file join $::current_plugin_loadpath triggerize]] pdsend "pd-_float_template declare -lib $lib" pdtk_post "loaded iem::punish::triggerize-plugin\n" } } ::iem::punish::triggerize::register iem_utils-v0.0.20180206/punish/triggerize-plugin/README.md0000644000175000017500000000443313004410214023111 0ustar zmoelnigzmoelnigtriggerize ========== - replace fan-outs with [t a a ...] - when selecting a single line: insert [t a] - when selecting a [trigger]: insert "a" at the beginning # Usage ### removing fan-outs - Select objects with fan-outs - Press Control+t - the (msg) fan-outs will be replaced by (connected) [t a a] objects ### removing all fan-outs - Select All objects (Control-a) - Press Control+t - all fan-outs will be replaced by (connected) [t a a] objects ### adding new left-hand outlet to [trigger] - Select a [trigger] object - Press Control+t - a new (unconnected) left-most outlet of type "a" will be created. ### inserting triggers - Select a single (msg) connection - Press Control+t - the connection will be replaced by a (connected) `[t a]` object ### inserting nop~ for signals - Select a single signal connection - Press Control+t - the connection will be replaced by a (connected) `[pd nop~]` object You can also use the menu: - `Edit` -> `Triggerize` OSX users should use Cmd instead of Control # Installation ## Building Build the external: make If you have an unusual setup (and/or your Pd installation is at a place not found by the compiler), you can parameterize the build. Try this first: make help ## Installing Put both the externals (`triggerize.pd_linux` or similar) an dthe GUI plugin (`triggerize-plugin.tcl`) into a directory `triggerize-plugin`, and put that into a place where Pd can find it. make install E.g. $ ~/.local/lib/pd/extra/triggerize-plugin/ ~/.local/lib/pd/extra/triggerize-plugin/triggerize.pd_linux ~/.local/lib/pd/extra/triggerize-plugin/triggerize-plugin.tcl # BUGS ## none known TODO # AUTHORS IOhannes m zmölnig # LICENSE `triggerize` is released under the Gnu GPL version 2 (or later). See LICENSE.md for the full text of the GPLv2. ## Special license grant to Miller Puckette I hereby grant Miller S. Puckette the exclusive right to include `triggerize` into Pure Data (Pd) under the BSD 3-clause license under which Pd is currently released. Once it has been included into Pd it is of course re-distributable under that license. Until then, the Gnu GPL v2 (or later) applies. iem_utils-v0.0.20180206/punish/triggerize-plugin/Makefile.pdlibbuilder0000644000175000017500000011642213207347074025756 0ustar zmoelnigzmoelnig# Makefile.pdlibbuilder dated 2016-11-22 version = 0.4.4 # Helper makefile for Pure Data external libraries. # Written by Katja Vetter March-June 2015 for the public domain. No warranties. # Inspired by Hans Christoph Steiner's Makefile Template and Stephan Beal's # ShakeNMake. # # Grab the newest version of Makefile.pdlibbuilder from # https://github.com/pure-data/pd-lib-builder/ # # GNU make version >= 3.81 required. # # #=== characteristics =========================================================== # # # - defines build settings based on autodetected OS and architecture # - defines rules to build Pd class- or lib executables from C or C++ sources # - defines rules for libdir installation # - defines convenience targets for developer and user # - evaluates implicit dependencies for non-clean builds # # #=== basic usage =============================================================== # # # In your Makefile, define your Pd lib name and class files, and include # Makefile.pdlibbuilder at the end of the Makefile. Like so: # # ________________________________________________________________________ # # # Makefile for mylib # # lib.name = mylib # # class.sources = myclass1.c myclass2.c # # datafiles = myclass1-help.pd myclass2-help.pd README.txt LICENSE.txt # # include Makefile.pdlibbuilder # ________________________________________________________________________ # # # For files in class.sources it is assumed that class basename == source file # basename. The default target builds all classes as individual executables # with Pd's default extension for the platform. For anything more than the # most basic usage, continue reading. # # #=== list of Makefile.pdlibbuilder API variables =============================== # # # Variables available for definition in your library Makefile: # # - lib.name # - lib.setup.sources # - class.sources # - common.sources # - shared.sources # - .class.sources # - .class.ldflags # - .class.ldlibs # - cflags # - ldflags # - ldlibs # - datafiles # - datadirs # - makefiles # - makefiledirs # - externalsdir # # Optional multiline defines evaluated per operating system: # # - forLinux # - forDarwin # - forWindows # # Variables available for your makefile or make command line: # # - make-lib-executable # - suppress-wunused # # Path variables for make command line or environment: # # - PDDIR # - PDINCLUDEDIR # - PDBINDIR # - PDLIBDIR # # Standard make variables for make command line or environment: # # - CPPFLAGS # - CFLAGS # - LDFLAGS # - CC # - CXX # - INSTALL # - DESTDIR # # Deprecated path variables: # # - PD_PATH # - pdincludepath # - pdbinpath # - objectsdir # # #=== descriptions of Makefile.pdlibbuilder API variables ======================= # # # lib.name: # Name of the library directory as it will be installed / distributed. Also the # name of the lib executable in the case where all classes are linked into # a single binary. # # lib.setup.sources: # Source file(s) (C or C++) which must be compiled only when linking all classes # into a single lib binary. # # class.sources: # All sources files (C or C++) for which the condition holds that # class name == source file basename. # # .class.sources: # Source file(s) (C or C++) specific to class . Use this for # multiple-source classes or when class name != source file basename. # # common.sources: # Source file(s) which must be statically linked to each class in the library. # # shared.sources: # Source file(s) (C or C++) to build a shared dynamic link lib, to be linked # with all class executables. # # cflags, ldflags, ldlibs: # Define cflags (preprocessor&compiler), ldflags (linker) and ldlibs (dynamic # link libs) for the whole library. These flags are added to platform-specific # flags defined by Makefile.pdlibbuilder. # # .class.ldflags and .class.ldlibs: # Define ldflags resp. ldlibs specific to class . These flags are # added to platform-specific flags defined by Makefile.pdlibbuilder, and flags # defined in your Makefile for the whole library. Note: cflags can not be # defined per class in the current implementation. # # datafiles and datadirs: # All extra files you want to include in binary distributions of the # library: abstractions and help patches, example patches, meta patch, readme # and license texts, manuals, sound files, etcetera. Use 'datafiles' for all # files that should go into your lib rootdir and 'datadirs' for complete # directories you want to copy from source to distribution. # # forLinux, forDarwin, forWindows: # Shorthand for 'variable definitions for Linux only' etc. Use like: # define forLinux # cflags += -DLINUX # class.sources += linuxthing.c # endef # # makefiles and makefiledirs: # Extra makefiles or directories with makefiles that should be made in sub-make # processes. # # make-lib-executable: # When this variable is defined 'yes' in your makefile or as command argument, # Makefile.pdlibbuilder will try to build all classes into a single library # executable (but it will force exit if lib.setup.sources is undefined). # If your makefile defines 'make-lib-executable=yes' as the library default, # this can still be overriden with 'make-lib-executable=no' as command argument # to build individual class executables (the Makefile.pdlibbuilder default.) # # suppress-wunused: # When this variable is defined ('yes' or any other value), -Wunused-variable, # -Wunused-parameter, -Wunused-value and -Wunused-function are suppressed, # but the other warnings from -Wall are retained. # # PDDIR: # Root directory of 'portable' pd package. When defined, PDINCLUDEDIR and # PDBINDIR will be evaluated as $(PDDIR)/src and $(PDDIR)/bin. # # PDINCLUDEDIR: # Directory where Pd API m_pd.h should be found, and other Pd header files. # Overrides the default search path. # # PDBINDIR: # Directory where pd.dll should be found for linking (Windows only). Overrides # the default search path. # # PDLIBDIR: # Root directory for installation of Pd library directories. Overrides the # default install location. # # DESTDIR: # Prepended path component for staged install. # # CPPFLAGS: # Preprocessor flags which are not strictly required for building. # # CFLAGS: # Compiler flags which are not strictly required for building. Compiler flags # defined by Makefile.pdlibbuilder for warning, optimization and architecture # specification are overriden by CFLAGS. # # LDFLAGS: # Linker flags which are not strictly required for building. Linker flags # defined by Makefile.pdlibbuilder for architecture specification are overriden # by LDFLAGS. # # CC and CXX: # C and C++ compiler programs as defined in your build environment. # # INSTALL # Definition of install program. # # PD_PATH: # Equivalent to PDDIR. Supported for compatibility with pd-extended central # makefile, but deprecated otherwise. # # objectsdir: # Root directory for installation of Pd library directories, like PDLIBDIR but # not overridable by environment. Supported for compatibility with pd-extended # central makefile, but deprecated otherwise. # # pdincludepath, pdbinpath: # As PDINCLUDEDIR and PDBINDIR but not overridable by environment. Deprecated # as user variables. # # #=== paths ===================================================================== # # # Source files in directories other than current working directory must be # prefixed with their relative path. Do not rely on VPATH or vpath. # Object (.o) files are built in the directory of their source files. # Executables are built in current working directory. # # Default search path for m_pd.h and other API header files is platform # dependent, and overridable by PDINCLUDEDIR: # # Linux: /usr/include/pd # # OSX: /Applications/Pd*.app/Contents/Resources/src # # Windows: %PROGRAMFILES%/pd/src # # Default location to install pd libraries is platform dependent, and # overridable by PDLIBDIR: # # Linux: /usr/local/lib/pd-externals # OSX: ~/Library/Pd # Windows: %APPDATA%/Pd # # https://puredata.info/docs/faq/how-do-i-install-externals-and-help-files # The rationale for not installing to ~/pd-externals by default on Linux # is that some people share the home dir between 32 and 64 bit installations. # # #=== targets =================================================================== # # # all: build $(executables) plus optional post target # post: target to build after $(executables) # alldebug: build all with -g option turned on for debug symbols # : force clean build of an individual class # .pre: make preprocessor output file in current working directory # .lst: make asm/source output file in current working directory # # install: install executables and data files # clean: remove build products from source tree # # help: print help text # vars: print makefile variables # allvars: print all variables # depend: print generated prerequisites # coffee: dummy target # # Variable $(executables) expands to class executables plus optional shared lib, # or alternatively to single lib executable when make-lib-executable=true. # Targets pre and post can be defined by library makefile. Make sure to include # Makefile.pdlibbuilder first so default target all will not be redefined. # # #=== Pd-extended libdir concept ================================================ # # # For libdir layout as conceived by Hans-Christoph Steiner, see: # # https://puredata.info/docs/developer/Libdir # # Files README.txt, LICENSE.txt and -meta.pd are part of the libdir # convention. Help patches for each class and abstraction are supposed to be # available. Makefile.pdlibbuilder does not force the presence of these files # however. It does not automatically include such files in libdir installations. # Data files you want to include in distributions must be defined explicitly in # your Makefile. # # #=== Makefile.pdlibbuilder syntax conventions ================================== # # # Makefile.pdlibbuilder variable names are lower case. Default make variables, # environment variables, and standard user variables (CC, CXX, CFLAGS, DESTDIR) # are upper case. Use target 'allvars' to print all variables and their values. # # 'Fields' in data variables are separated by dots, like in 'foo.class.sources'. # Words in variables expressing a function or command are separated by dashes, # like in 'make-lib-executable'. # # #=== useful make options ======================================================= # # # Use 'make -d ' to print debug details of the make process. # Use 'make -p ' to print make's database. # # #=== TODO ====================================================================== # # # - decide whether to use -static-libgcc or shared dll in MinGW # - cygwin support # - android support # - Windows 64 bit support # - figure out how to handle '$' in filenames # - add makefile template targets dpkg-source dist libdir distclean tags? # # #=== end of documentation sections ============================================= # # ################################################################################ ################################################################################ ################################################################################ # GNU make version 3.81 (2006) or higher is required because of the following: # - function 'info' # - variable '.DEFAULT_GOAL' # force exit when make version is < 3.81 ifneq ($(firstword $(sort 3.81 $(MAKE_VERSION))), 3.81) $(error GNU make version 3.81 or higher is required) endif # Relative path to externals root dir in multi-lib source tree like # pd-extended SVN. Default is parent of current working directory. May be # defined differently in including makefile. externalsdir ?= .. # variable you can use to check if Makefile.pdlibbuilder is already included Makefile.pdlibbuilder = true ################################################################################ ### variables: library name and version ######################################## ################################################################################ # strip possibles spaces from lib.name, they mess up calculated file names lib.name := $(strip $(lib.name)) # if meta file exists, check library version metafile := $(wildcard $(lib.name)-meta.pd) ifdef metafile lib.version := $(shell sed -n \ 's|^\#X text [0-9][0-9]* [0-9][0-9]* VERSION \(.*\);|\1|p' \ $(metafile)) endif ################################################################################ ### variables: files ########################################################### ################################################################################ #=== sources =================================================================== # (re)define .class.sources using file names in class.sources define add-class-source $(notdir $(basename $v)).class.sources += $v endef $(foreach v, $(class.sources), $(eval $(add-class-source))) # derive class names from .class.sources variables sourcevariables := $(filter %.class.sources, $(.VARIABLES)) classes := $(basename $(basename $(sourcevariables))) # accumulate all source files specified in makefile classes.sources := $(sort $(foreach v, $(sourcevariables), $($v))) all.sources := $(classes.sources) $(lib.setup.sources) \ $(shared.sources) $(common.sources) #=== object files ============================================================== # construct object filenames from all C and C++ source file names classes.objects := $(addsuffix .o, $(basename $(classes.sources))) common.objects := $(addsuffix .o, $(basename $(common.sources))) shared.objects := $(addsuffix .o, $(basename $(shared.sources))) lib.setup.objects := $(addsuffix .o, $(basename $(lib.setup.sources))) all.objects = $(classes.objects) $(common.objects) $(shared.objects) \ $(lib.setup.objects) #=== executables =============================================================== # use recursive variables here because executable extension is not yet known # construct class executable names from class names classes.executables = $(addsuffix .$(extension), $(classes)) # construct shared lib executable name if shared sources are defined ifdef shared.sources shared.lib = lib$(lib.name).$(shared.extension) else shared.lib = endif ################################################################################ ### variables per platform ##################################################### ################################################################################ #=== flags per architecture ==================================================== # Set architecture-dependent cflags, mainly for Linux. For Mac and Windows, # arch.c.flags are overriden below. machine := $(shell uname -m) # Raspberry Pi 1st generation ifeq ($(machine), armv6l) arch.c.flags = -march=armv6 -mfpu=vfp -mfloat-abi=hard endif # Beagle, Udoo, RPi2 etc. ifeq ($(machine), armv7l) arch.c.flags = -march=armv7-a -mfpu=vfpv3 -mfloat-abi=hard endif # Intel 32 bit, build with SSE and SSE2 instructions ifeq ($(findstring $(machine), i386 i686), $(machine)) arch.c.flags = -march=pentium4 -mfpmath=sse -msse -msse2 endif # Intel/AMD 64 bit, build with SSE, SSE2 and SSE3 instructions ifeq ($(findstring $(machine), ia64 x86_64), $(machine)) arch.c.flags = -march=core2 -mfpmath=sse -msse -msse2 -msse3 endif #=== operating system ========================================================== # The following systems are defined: Linux, Darwin, Windows. GNU and # GNU/kFreeBSD are treated as Linux to get the same options. uname := $(shell uname) ifeq ($(findstring $(uname), Linux GNU GNU/kFreeBSD), $(uname)) system = Linux endif ifeq ($(uname), Darwin) system = Darwin endif ifeq ($(findstring MSYS, $(uname)), MSYS) system = Windows endif ifeq ($(findstring MINGW, $(uname)), MINGW) system = Windows endif # evaluate possible system-specific multiline defines from library makefile $(eval $(for$(system))) # TODO: Cygwin, Android #=== flags and paths for Linux ================================================= ifeq ($(system), Linux) prefix = /usr/local libdir := $(prefix)/lib pkglibdir = $(libdir)/pd-externals pdincludepath := $(wildcard /usr/include/pd) extension = pd_linux cpp.flags := -DUNIX c.flags := -fPIC c.ldflags := -rdynamic -shared -fPIC -Wl,-rpath,"\$$ORIGIN",--enable-new-dtags c.ldlibs := -lc -lm cxx.flags := -fPIC -fcheck-new cxx.ldflags := -rdynamic -shared -fPIC -Wl,-rpath,"\$$ORIGIN",--enable-new-dtags cxx.ldlibs := -lc -lm -lstdc++ shared.extension = so shared.ldflags := -rdynamic -fPIC -shared -Wl,-soname,$(shared.lib) stripflags = --strip-unneeded -R .note -R .comment endif #=== flags and paths for Darwin ================================================ # On OSX we try to build fat binaries by default. It is assumed that OSX i386 # can build for ppc and OSX x86_64 can't. TODO: try to refine this condition. # LLVM-clang doesn't support -fcheck-new, therefore this flag is omitted for # OSX x86_64. ifeq ($(system), Darwin) pkglibdir = $(HOME)/Library/Pd pdincludepath := $(firstword $(wildcard \ /Applications/Pd*.app/Contents/Resources/src)) extension = pd_darwin cpp.flags := -DUNIX -DMACOSX -I /sw/include c.flags := c.ldflags := -undefined suppress -flat_namespace -bundle c.ldlibs := -lc cxx.ldflags := -undefined suppress -flat_namespace -bundle cxx.ldlibs := -lc shared.extension = dylib shared.ldflags = -dynamiclib -undefined dynamic_lookup \ -install_name @loader_path/$(shared.lib) \ -compatibility_version 1 -current_version 1.0 stripflags = -x version.flag := $(filter $(cflags), -mmacosx-version-min=%) ifeq ($(machine), i386) cxx.flags := -fcheck-new arch := ppc i386 x86_64 version.flag ?= -mmacosx-version-min=10.4 endif ifeq ($(machine), x86_64) arch := i386 x86_64 version.flag ?= -mmacosx-version-min=10.5 endif arch.c.flags := $(addprefix -arch , $(arch)) $(version.flag) arch.ld.flags := $(arch.c.flags) endif #=== flags and paths for Windows =============================================== # Standard paths on Windows contain spaces, and GNU make functions treat such # paths as lists, with unintended effects. Therefore we must use shell function # ls instead of make's wildcard, and probe for each standard path individually. # Using double quotes around paths with spaces is obligatory. Since some path # variables are assembled or re-expanded later, great care must be taken to put # quotes at appropriate points throughout the makefile. Thanks, Bill. # paths for 32-bit executables on 64-bit Windows aren't yet defined here (TODO) ifeq ($(system), Windows) pkglibdir := $(APPDATA)/Pd ifndef pdbinpath pdbinpath := $(shell ls -d "$(PROGRAMFILES)/pd/bin") endif ifndef pdincludepath pdincludepath := $(shell ls -d "$(PROGRAMFILES)/pd/src") endif endif # On Windows we build 32 bit by default to match Pd(-extended) binary # distributions. This may change in the future. # TODO: decide whether -mms-bitfields should be specified. ifeq ($(system), Windows) extension = dll CC = gcc CXX = g++ arch.c.flags := -march=pentium4 -msse -msse2 -mfpmath=sse cpp.flags := -DMSW -DNT c.flags := c.ldflags = -static-libgcc -shared \ -Wl,--enable-auto-import "$(pdbinpath)/pd.dll" c.ldlibs := cxx.flags := -fcheck-new cxx.ldflags = -static-libstdc++ -shared \ -Wl,--enable-auto-import "$(pdbinpath)/pd.dll" cxx.ldlibs := shared.extension = dll shared.ldflags = -static-libgcc -shared "$(pdbinpath)/pd.dll" stripflags = --strip-unneeded -R .note -R .comment endif #=== paths ===================================================================== # Platform-dependent default paths are specified above, but overridable. # Path variables in upper case can be defined as make command argument or in the # environment. 'PD_PATH' and 'objectsdir' are supported for compatibility with # the build system that pd-l2ork has inherited from pd-extended. PDDIR ?= $(PD_PATH) PDINCLUDEDIR ?= $(pdincludepath) PDBINDIR ?= $(pdbinpath) PDLIBDIR ?= $(firstword $(objectsdir) $(pkglibdir)) ifneq ($(PDDIR),) PDINCLUDEDIR := $(wildcard $(PDDIR)/src) PDBINDIR := $(wildcard $(PDDIR)/bin) endif # base path where all components of the lib will be installed by default installpath := $(DESTDIR)$(PDLIBDIR)/$(lib.name) # check if include path contains spaces (as is often the case on Windows) # if so, store the path so we can later do checks with it pdincludepathwithspaces := $(if $(word 2, $(PDINCLUDEDIR)), $(PDINCLUDEDIR)) #=== accumulated build flags =================================================== # From GNU make docs: 'Users expect to be able to specify CFLAGS freely # themselves.' So we use CFLAGS to define options which are not strictly # required for compilation: optimizations, architecture specifications, and # warnings. CFLAGS can be safely overriden using a make command argument. # Variables cflags, ldflags and ldlibs may be defined in including makefile. optimization.flags = -O3 -ffast-math -funroll-loops -fomit-frame-pointer warn.flags = -Wall -Wextra -Wshadow -Winline -Wstrict-aliasing # suppress -Wunused-variable & Co if you don't want to clutter a build log ifdef suppress-wunused warn.flags += $(addprefix -Wno-unused-, function parameter value variable) endif CFLAGS = $(warn.flags) $(optimization.flags) $(arch.c.flags) # preprocessor flags cpp.flags := -DPD -I "$(PDINCLUDEDIR)" $(cpp.flags) $(CPPFLAGS) # flags for dependency checking (cflags from makefile may define -I options) depcheck.flags := $(cpp.flags) $(cflags) # architecture specifications for linker are overridable by LDFLAGS LDFLAGS := $(arch.ld.flags) # now add the same ld flags to shared dynamic lib shared.ldflags := $(shared.ldflags) $(LDFLAGS) # accumulated flags for C compiler / linker c.flags := $(cpp.flags) $(c.flags) $(cflags) $(CFLAGS) c.ldflags := $(c.ldflags) $(ldflags) $(LDFLAGS) c.ldlibs := $(c.ldlibs) $(ldlibs) # accumulated flags for C++ compiler / linker cxx.flags := $(cpp.flags) $(cxx.flags) $(cflags) $(CFLAGS) cxx.ldflags := $(cxx.ldflags) $(ldflags) $(LDFLAGS) cxx.ldlibs := $(cxx.ldlibs) $(ldlibs) ################################################################################ ### variables: tools ########################################################### ################################################################################ # aliases so we can later define 'compile-$1' and set 'c' or 'cxx' as argument compile-c := $(CC) compile-cxx := $(CXX) ################################################################################ ### checks ##################################################################### ################################################################################ # At this point most variables are defined. Now do some checks and info's # before rules begin. # 'forward declaration' of default target, needed to do checks all: # To avoid unpredictable results, make sure the default target is not redefined # by including makefile. ifneq ($(.DEFAULT_GOAL), all) $(error Default target must be 'all'.) endif # find out which target(s) will be made ifdef MAKECMDGOALS goals := $(MAKECMDGOALS) else goals := all endif # store path to Pd API m_pd.h if it is found ifdef PDINCLUDEDIR mpdh := $(shell ls "$(PDINCLUDEDIR)/m_pd.h") endif # print Makefile.pdlibbuilder version $(info ++++ info: using Makefile.pdlibbuilder version $(version)) # when making target all, check if m_pd.h is found and print info about it ifeq ($(goals), all) $(if $(mpdh), \ $(info ++++ info: using Pd API $(mpdh)), \ $(warning Where is Pd API m_pd.h? Do 'make help' for info.)) endif # print target info $(info ++++ info: making target $(goals) $(if $(lib.name),in lib $(lib.name))) # when installing, print installpath info $(if $(filter install install-lib, $(goals)), $(info ++++ info: \ installpath is '$(installpath)')) #=== define executables ======================================================== # By default we build class executables, and optionally a shared dynamic link # lib. When make-lib-executable=yes we build all classes into a single lib # executable, on the condition that variable lib.setup.sources is defined. ifeq ($(make-lib-executable),yes) $(if $(lib.setup.sources), ,\ $(error Can not build library blob because lib.setup.sources is undefined)) executables := $(lib.name).$(extension) else executables := $(classes.executables) $(shared.lib) endif ################################################################################ ### rules: special targets ##################################################### ################################################################################ # Disable built-in rules. If some target can't be built with the specified # rules, it should not be built at all. MAKEFLAGS += --no-builtin-rules .PRECIOUS: .SUFFIXES: .PHONY: all post build-lib \ $(classes) $(makefiledirs) $(makefiles) \ install install-executables install-datafiles install-datadirs \ force clean vars allvars depend help ################################################################################ ### rules: build targets ####################################################### ################################################################################ # Target all forces the build of targets [$(executables) post] in # deterministic order. Target $(executables) builds class executables plus # optional shared lib or alternatively a single lib executable when # make-lib-executable=true. Target post is optionally defined by # library makefile. all: post post: $(executables) all: $(info ++++info: target all in lib $(lib.name) completed) # build all with -g option turned on for debug symbols alldebug: c.flags += -g alldebug: cxx.flags += -g alldebug: all #=== class executable ========================================================== # recipe for linking objects in class executable # argument $1 = compiler type (c or cxx) # argument $2 = class basename define link-class $(compile-$1) \ $($1.ldflags) $($2.class.ldflags) \ -o $2.$(extension) \ $(addsuffix .o, $(basename $($2.class.sources))) \ $(addsuffix .o, $(basename $(common.sources))) \ $($1.ldlibs) $($2.class.ldlibs) $(shared.lib) endef # general rule for linking object files in class executable %.$(extension): $(shared.lib) $(info ++++ info: linking objects in $@ for lib $(lib.name)) $(if $(filter %.cc %.cpp, $($*.class.sources)), \ $(call link-class,cxx,$*), \ $(call link-class,c,$*)) #=== library blob ============================================================== # build all classes into single executable build-lib: $(lib.name).$(extension) $(info ++++ info: library blob $(lib.name).$(extension) completed) # recipe for linking objects in lib executable # argument $1 = compiler type (c or cxx) define link-lib $(compile-$1) \ $($1.ldflags) $(lib.ldflags) \ -o $(lib.name).$(extension) $(all.objects) \ $($1.ldlibs) $(lib.ldlibs) endef # rule for linking objects in lib executable # declared conditionally to avoid name clashes ifeq ($(make-lib-executable),yes) $(lib.name).$(extension): $(all.objects) $(if $(filter %.cc %.cpp, $(all.sources)), \ $(call link-lib,cxx), \ $(call link-lib,c)) endif #=== shared dynamic lib ======================================================== # recipe for linking objects in shared executable # argument $1 = compiler type (c or cxx) define link-shared $(compile-$1) \ $(shared.ldflags) \ -o lib$(lib.name).$(shared.extension) $(shared.objects) \ $($1.ldlibs) $(shared.ldlibs) endef # rule for linking objects in shared executable # build recipe is in macro 'link-shared' lib$(lib.name).$(shared.extension): $(shared.objects) $(info ++++ info: linking objects in shared lib $@) $(if $(filter %.cc %.cpp, $(shared.sources)), \ $(call link-shared,cxx), \ $(call link-shared,c)) #=== object files ============================================================== # recipe to make .o file from source # argument $1 is compiler type (c or cxx) define make-object-file $(info ++++ info: making $@ in lib $(lib.name)) $(compile-$1) \ $($1.flags) \ -o $@ -c $< endef # Three rules to create .o files. These are double colon 'terminal' rules, # meaning they are the last in a rules chain. %.o:: %.c $(call make-object-file,c) %.o:: %.cc $(call make-object-file,cxx) %.o:: %.cpp $(call make-object-file,cxx) #=== explicit prerequisites for class executables ============================== # For class executables, prerequisite rules are declared in run time. Target # 'depend' prints these rules for debugging purposes. # declare explicit prerequisites rule like 'class: class.extension' # argument $v is class basename define declare-class-target $v: $v.$(extension) endef # declare explicit prerequisites rule like 'class.extension: object1.o object2.o' # argument $v is class basename define declare-class-executable-target $v.$(extension): $(addsuffix .o, $(basename $($v.class.sources))) \ $(addsuffix .o, $(basename $(common.sources))) endef # evaluate explicit prerequisite rules for all classes $(foreach v, $(classes), $(eval $(declare-class-target))) $(foreach v, $(classes), $(eval $(declare-class-executable-target))) #=== implicit prerequisites for class executables ============================== # Evaluating implicit prerequisites (header files) with help from the # preprocessor is 'expensive' so this is done conditionally and selectively. # Note that it is also possible to trigger a build via install targets, in # which case implicit prerequisites are not checked. # When the Pd include path contains spaces it will mess up the implicit # prerequisites rules. disable-dependency-tracking := $(strip $(pdincludepathwithspaces)) ifndef disable-dependency-tracking must-build-everything := $(filter all, $(goals)) must-build-class := $(filter $(classes), $(goals)) must-build-sources := $(foreach v, $(must-build-class), $($v.class.sources)) endif # declare implicit prerequisites rule like 'object.o: header1.h header2.h ...' # argument $1 is input source file(s) # dir is explicitly added because option -MM strips it by default define declare-object-target $(dir $1)$(filter %.o: %.h, $(shell $(CPP) $(depcheck.flags) -MM $1)) $(MAKEFILE_LIST) endef # evaluate implicit prerequisite rules when rebuilding everything ifdef must-build-everything $(if $(wildcard $(all.objects)), \ $(info ++++ info: evaluating implicit prerequisites in lib $(lib.name).....) \ $(foreach v, $(all.sources), $(eval $(call declare-object-target, $v)))) endif # evaluate implicit prerequisite rules when selectively building classes ifdef must-build-class $(foreach v, $(must-build-sources), \ $(eval $(call declare-object-target, $v))) $(foreach v, $(shared.sources), \ $(eval $(call declare-object-target, $v))) endif ################################################################################ ### rules: preprocessor and assembly files ##################################### ################################################################################ # Preprocessor and assembly output files for bug tracing etc. They are not part # of the build processes for executables. By default these files are created in # the current working directory. Dependency tracking is not performed, the build # is forced instead to make sure it's up to date. force: #=== preprocessor file ========================================================= # make preprocessor output file with extension .pre # argument $1 = compiler type (c or cxx) define make-preprocessor-file $(info ++++ info: making preprocessor output file $(notdir $*.pre) \ in current working directory) $(compile-$1) -E $< $(c.flags) $($1.flags) -o $(notdir $*.pre) endef %.pre:: %.c force $(call make-preprocessor-file,c) %.pre:: %.cc force $(call make-preprocessor-file,cxx) %.pre:: %.cpp force $(call make-preprocessor-file,cxx) #=== assembly file ============================================================= # make C / assembly interleaved output file with extension .lst # argument $1 = compiler type (c or cxx) define make-assembly-file $(info ++++ info: making assembly output file $(notdir $*.lst) \ in current working directory) $(compile-$1) \ -c -Wa,-a,-ad -fverbose-asm \ $($1.flags) \ $< > $(notdir $*.lst) endef %.lst:: %.c force $(call make-assembly-file,c) %.lst:: %.cc force $(call make-assembly-file,cxx) %.lst:: %.cpp force $(call make-assembly-file,cxx) ################################################################################ ### rules: installation targets ################################################ ################################################################################ # Install targets depend on successful exit status of target all because nothing # must be installed in case of a build error. # -p = preserve time stamps # -m = set permission mode (as in chmod) # -d = create all components of specified directories INSTALL = install INSTALL_PROGRAM := $(INSTALL) -p -m 644 INSTALL_DATA := $(INSTALL) -p -m 644 INSTALL_DIR := $(INSTALL) -m 755 -d # strip spaces from file names executables := $(strip $(executables)) datafiles := $(strip $(datafiles)) datadirs := $(strip $(datadirs)) # Do not make any install sub-target with empty variable definition because the # install program would exit with an error. install: $(if $(executables), install-executables) install: $(if $(datafiles), install-datafiles) install: $(if $(datadirs), install-datadirs) install-executables: all $(INSTALL_DIR) -v "$(installpath)" $(foreach v, $(executables), \ $(INSTALL_PROGRAM) '$v' "$(installpath)";) $(info ++++ info: executables of lib $(lib.name) installed \ from $(CURDIR) to $(installpath)) install-datafiles: all $(INSTALL_DIR) -v "$(installpath)" $(foreach v, $(datafiles), \ $(INSTALL_DATA) '$(v)' "$(installpath)";) $(info ++++ info: data files of lib $(lib.name) installed \ from $(CURDIR) to $(installpath)) install-datadirs: all $(foreach v, $(datadirs), $(INSTALL_DIR) "$(installpath)/$v";) $(foreach v, $(datadirs), \ $(INSTALL_DATA) $(wildcard $v/*) "$(installpath)/$v";) $(info ++++ info: data directories of lib $(lib.name) installed \ from $(CURDIR) to $(installpath)) ################################################################################ ### rules: distribution targets ################################################ ################################################################################ # TODO # These targets are implemented in Makefile Template, but I have to figure out # how to do it under the not-so-strict conditions of Makefile.pdlibbuilder. # make source package dist: @echo "target dist not yet implemented" # make Debian source package dpkg-source: @echo "target dpkg-source not yet implemented" $(ORIGDIR): $(DISTDIR): ################################################################################ ### rules: clean targets ####################################################### ################################################################################ # delete build products from build tree clean: rm -f $(all.objects) rm -f $(classes.executables) $(lib.name).$(extension) $(shared.lib) rm -f *.pre *.lst # remove distribution directories and tarballs from build tree distclean: clean @echo "target distclean not yet implemented" ################################################################################ ### rules: submake targets ##################################################### ################################################################################ # Iterate over sub-makefiles or makefiles in other directories. # When 'continue-make=yes' is set, sub-makes will report 'true' to the parent # process regardless of their real exit status. This prevents the parent make # from being aborted by a sub-make error. Useful when you want to quickly find # out which sub-makes from a large set will succeed. ifeq ($(continue-make),yes) continue = || true endif # These targets will trigger sub-make processes for entries in 'makefiledirs' # and 'makefiles'. all alldebug install clean distclean dist dkpg-source: \ $(makefiledirs) $(makefiles) # this expands to identical rules for each entry in 'makefiledirs' $(makefiledirs): $(MAKE) --directory=$@ $(MAKECMDGOALS) $(continue) # this expands to identical rules for each entry in 'makefiles' $(makefiles): $(MAKE) --directory=$(dir $@) --makefile=$(notdir $@) $(MAKECMDGOALS) $(continue) ################################################################################ ### rules: convenience targets ################################################# ################################################################################ #=== show variables ============================================================ # Several 'function' macro's cause errors when expanded within a rule or without # proper arguments. Variables which are set with the define directive are only # shown by name for that reason. functions = \ add-class-source \ declare-class-target \ declare-class-executable-target \ declare-object-target \ link-class \ link-lib \ link-shared \ make-object-file \ make-preprocessor-file \ make-assembly-file # show variables from makefiles vars: $(info ++++ info: showing makefile variables:) $(foreach v,\ $(sort $(filter-out $(functions) functions, $(.VARIABLES))),\ $(if $(filter file, $(origin $v)),\ $(info variable $v = $($v)))) $(foreach v, $(functions), $(info 'function' name: $v)) @echo # show all variables allvars: $(info ++++ info: showing default, automatic and makefile variables:) $(foreach v, \ $(sort $(filter-out $(functions) functions, $(.VARIABLES))), \ $(info variable ($(origin $v)) $v = $($v))) $(foreach v, $(functions), $(info 'function' name: $v)) @echo #=== show dependencies ========================================================= # show generated prerequisites rules depend: $(info ++++ info: generated prerequisite rules) $(foreach v, $(classes), $(info $(declare-class-target))) $(foreach v, $(classes), $(info $(declare-class-executable-target))) $(foreach v, $(all.sources), $(info $(call declare-object-target, $v))) @echo #=== show help text ============================================================ # brief info about targets and paths ifdef mpdh mpdhinfo := $(mpdh) else mpdhinfo := m_pd.h was not found. Is Pd installed? endif help: @echo @echo " Main targets:" @echo " all: build executables (default target)" @echo " install: install all components of the library" @echo " vars: print makefile variables for troubleshooting" @echo " allvars: print all variables for troubleshooting" @echo " help: print this help text" @echo @echo " Pd API m_pd.h:" @echo " $(mpdhinfo)" @echo " You may specify your preferred Pd include directory as argument" @echo " to the make command, like 'PDINCLUDEDIR=path/to/pd/src'." @echo @echo " Path for installation of your libdir(s):" @echo " $(PDLIBDIR)" @echo " Alternatively you may specify your path for installation as argument" @echo " to the make command, like 'PDLIBDIR=path/to/pd-externals'." @echo @echo " Default paths are listed in the doc sections in Makefile.pdlibbuilder." @echo #=== dummy target ============================================================== coffee: @echo "Makefile.pdlibbuilder: Can not make coffee. Sorry." ################################################################################ ### end of rules sections ###################################################### ################################################################################ # for syntax highlighting in vim and github # vim: set filetype=make: iem_utils-v0.0.20180206/punish/triggerize-plugin/triggerize-help.pd0000644000175000017500000000251413004410214025256 0ustar zmoelnigzmoelnig#N canvas 165 134 692 566 10; #X text 53 45 1st \, select a few objects; #X floatatom 45 189 5 0 0 0 - - -, f 5; #X obj 45 238 *; #X floatatom 45 260 5 0 0 0 - - -, f 5; #X floatatom 95 189 5 0 0 0 - - -, f 5; #X obj 95 238 *; #X floatatom 95 260 5 0 0 0 - - -, f 5; #X floatatom 391 411 5 0 0 0 - - -, f 5; #X floatatom 391 467 5 0 0 0 - - -, f 5; #X text 35 166 select numbox; #X text 369 372 select coord; #X floatatom 105 393 5 0 0 0 - - -, f 5; #X obj 105 412 t b f; #X obj 119 448 i; #X floatatom 119 470 5 0 0 0 - - -, f 5; #X text 90 369 select [trigger]; #X obj 488 411 sig~ 3; #X obj 488 466 osc~; #X text 469 371 select coord; #X floatatom 249 210 5 0 0 0 - - -, f 5; #X obj 253 251 + 1; #X obj 249 229 t b f; #X floatatom 284 254 5 0 0 0 - - -, f 5; #X text 239 178 select [trigger]; #X text 48 71 then press + (+ on OSX) to add [trigger] objects ad lib., f 75; #X text 33 336 expand [t] to the left::; #X text 37 137 getting rid of fan-out::; #X text 342 337 insert objects into coord::; #X connect 1 0 2 0; #X connect 1 0 2 1; #X connect 2 0 3 0; #X connect 4 0 5 1; #X connect 4 0 5 0; #X connect 5 0 6 0; #X connect 7 0 8 0; #X connect 11 0 12 0; #X connect 12 0 13 0; #X connect 12 1 13 1; #X connect 13 0 14 0; #X connect 16 0 17 0; #X connect 19 0 21 0; #X connect 21 0 20 0; #X connect 21 1 20 1; #X connect 21 1 22 0; iem_utils-v0.0.20180206/punish/triggerize-plugin/Makefile0000755000175000017500000000164113207347074023315 0ustar zmoelnigzmoelnig#!/usr/bin/make -f # Makefile for pure data externals in lib creb. # Needs Makefile.pdlibbuilder to work (https://github.com/pure-data/pd-lib-builder) punish.name = triggerize lib.name = $(punish.name)-plugin # special file that does not provide a class lib.setup.sources = # all other C and C++ files in subdirs are source files per class # (alternatively, enumerate them by hand) class.sources = $(punish.name).c datafiles = \ $(punish.name)-plugin.tcl \ $(wildcard *-help.pd) \ README.md LICENSE.md datadirs = ################################################################################ ### pdlibbuilder ############################################################### ################################################################################ # Include Makefile.pdlibbuilder from this directory, # or else from some user-defined folder PDLIBBUILDER_DIR=./ include $(PDLIBBUILDER_DIR)/Makefile.pdlibbuilder iem_utils-v0.0.20180206/punish/triggerize-plugin/LICENSE.md0000644000175000017500000004364213004410214023243 0ustar zmoelnigzmoelnigGNU GENERAL PUBLIC LICENSE ========================== Version 2, June 1991 > Copyright (C) 1989, 1991 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. # Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Lesser General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. # GNU GENERAL PUBLIC LICENSE # ## TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION ## - *0\.* This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. - 1\. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. - 2\. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. - 3\. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. - 4\. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. - 5\. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. - 6\. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. - 7\. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. - 8\. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. - 9\. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. - 10\. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. ## NO WARRANTY - 11\. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - 12\. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. ## END OF TERMS AND CONDITIONS ## --------------------------------------------------------------------------- ### How to Apply These Terms to Your New Programs ### If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. iem_utils-v0.0.20180206/punish/triggerize-plugin/triggerize.c0000644000175000017500000003144113207347074024172 0ustar zmoelnigzmoelnig/****************************************************** * * triggerize - implementation file * * copyleft (c) IOhannes m zmölnig * * 2016:forum::für::umläute:2016 * * institute of electronic music and acoustics (iem) * ****************************************************** * * license: GNU General Public License v.2 (or later) * ******************************************************/ #include "m_pd.h" #include "g_canvas.h" #include "m_imp.h" #define MARK() post("%s:%d\t%s", __FILE__, __LINE__, __FUNCTION__) /* ------------ utilities ---------- */ static t_gobj*o2g(t_object*obj) { return &(obj->te_g); } static t_object*g2o(t_gobj*gobj) { return pd_checkobject(&gobj->g_pd); } t_gobj*glist_getlast(t_glist*cnv) { t_gobj*result=NULL; for(result=cnv->gl_list; result->g_next;) result=result->g_next; return result; } static void dereconnect(t_glist*cnv, t_object*org, t_object*replace) { t_gobj*gobj; for(gobj=cnv->gl_list; gobj; gobj=gobj->g_next) { t_object*obj=g2o(gobj); int obj_nout=0; int nout; if(!obj)continue; obj_nout=obj_noutlets(obj); for(nout=0; noutgl_pd; s__N.s_thing = &pd_canvasmaker; binbuf_eval(b, 0, 0, 0); s__X.s_thing = boundx; s__N.s_thing = boundn; return g2o(glist_getlast(x)); } static void stack_conn(t_object*new, int*newoutlet, t_object*org, int orgoutlet, t_outconnect*conn){ t_object*dest=0; t_inlet *in =0; int which; conn=obj_nexttraverseoutlet(conn, &dest, &in, &which); if(conn) stack_conn(new, newoutlet, org, orgoutlet, conn); obj_disconnect(org, orgoutlet, dest, which); obj_connect(new, *newoutlet, dest, which); (*newoutlet)++; } static int has_fanout(t_object*obj) { int obj_nout=obj_noutlets(obj); int nout; /* check if we actually do have a fan out */ for(nout=0; noutgl_list; gobj; gobj=gobj->g_next) { t_object*obj=g2o(gobj); if(obj && glist_isselected(cnv, gobj) && (s_trigger != obj->te_g.g_pd->c_name)) { return 0; } } return 1; } /* ------------------------- triggerize ---------------------------- */ static int triggerize_fanout_inplace(t_glist*x, t_object*obj) { /* avoid fanouts in [t] objects by adding additional outlets */ int posX=obj->te_xpix; int posY=obj->te_ypix; t_atom*argv=binbuf_getvec(obj->te_binbuf); int argc=binbuf_getnatom(obj->te_binbuf); int obj_nout=obj_noutlets(obj); int nout, newout; t_binbuf*b=0; t_object*stub=0; /* check if we actually do have a fan out */ if(!has_fanout(obj))return 0; /* create a new trigger object, that has outlets for the fans */ b=binbuf_new(); binbuf_addv(b, "ssii", gensym("#X"), gensym("obj"), posX, posY); binbuf_add(b, 1, argv); argc--; argv++; for(nout=0; noutte_xpix-10; int posY=obj->te_ypix+20; t_binbuf*b=binbuf_new(); int didit=0; /* if the object is a [trigger], we just insert new outlets */ if(s_trigger == obj->te_g.g_pd->c_name) { return triggerize_fanout_inplace(x, obj); } /* for other objects, we create a new [trigger a a] object and replace the fan-out with that */ for(nout=0; nout1) { /* fan out */ int i; t_object*stub=0; binbuf_clear(b); binbuf_addv(b, "ssiis", gensym("#X"), gensym("obj"), posX, posY, gensym("t")); for(i=0; igl_list; gobj; gobj=gobj->g_next) { t_object*obj=g2o(gobj); if(obj && glist_isselected(cnv, gobj) && triggerize_fanout(cnv, obj)) count++; } return count; } static int triggerize_line(t_glist*x) { /* triggerize a single selected line, by inserting a [t a] object * (or it's signal equivalen) */ t_editor*ed=x->gl_editor; int src_obj, src_out, dst_obj ,dst_in; t_gobj *src = 0, *dst = 0; t_binbuf*b=0; int posx=100, posy=100; t_object*stub=0; if(!ed->e_selectedline) return 0; src_obj=ed->e_selectline_index1; src_out=ed->e_selectline_outno; dst_obj=ed->e_selectline_index2; dst_in =ed->e_selectline_inno; for (src = x->gl_list; src_obj; src = src->g_next, src_obj--) if (!src->g_next) goto bad; for (dst = x->gl_list; dst_obj; dst = dst->g_next, dst_obj--) if (!dst->g_next) goto bad; src_obj=ed->e_selectline_index1; dst_obj=ed->e_selectline_index2; if(1) { t_object*obj1=g2o(src); t_object*obj2=g2o(dst); if(obj1 && obj2) { posx=(obj1->te_xpix+obj2->te_xpix)>>1; posy=(obj1->te_ypix+obj2->te_ypix)>>1; } } b=binbuf_new(); if(obj_issignaloutlet(g2o(src), src_out)) { binbuf_addv(b, "ssiiiisi;", gensym("#N"), gensym("canvas"), 200, 100, 190, 200, gensym("nop~"), 0); binbuf_addv(b, "ssiis;", gensym("#X"), gensym("obj"), 50, 70, gensym("inlet~")); binbuf_addv(b, "ssiis;", gensym("#X"), gensym("obj"), 50,140, gensym("outlet~")); binbuf_addv(b, "ssiiii;", gensym("#X"), gensym("connect"), 0,0,1,0); binbuf_addv(b, "ssiiss", gensym("#X"), gensym("restore"), posx, posy, gensym("pd"), gensym("nop~")); } else { binbuf_addv(b,"ssii", gensym("#X"), gensym("obj"), posx, posy); binbuf_addv(b,"ss", gensym("t"), gensym("a")); } binbuf_addsemi(b); stub=triggerize_createobj(x, b); binbuf_free(b);b=0; obj_disconnect(g2o(src), src_out, g2o(dst), dst_in); obj_connect(g2o(src), src_out, stub, 0); obj_connect(stub, 0, g2o(dst), dst_in); glist_select(x, o2g(stub)); return 1; bad: return 0; } static int minimize_trigger(t_glist*cnv, t_object*obj) { /* remove all unused outlets from [trigger] */ t_binbuf*b=binbuf_new(); t_atom*argv=binbuf_getvec(obj->te_binbuf); t_object*stub=0; int obj_nout=obj_noutlets(obj); int nout; int count = 0; binbuf_addv(b, "ssii", gensym("#X"), gensym("obj"), obj->te_xpix, obj->te_ypix); binbuf_add(b, 1, argv); /* go through all the outlets, and add those that have connections */ for(nout = 0; nout < obj_nout; nout++) { t_outlet*out=0; t_outconnect*conn = obj_starttraverseoutlet(obj, &out, nout); if(conn) { binbuf_add(b, 1, argv + 1 + nout); } else { count++; } } if(!count || count == obj_nout) { /* either no outlet to delete or all: skip this object */ binbuf_free(b); return 0; } /* create the replacement object (which only has outlets that are going to be connected) */ stub=triggerize_createobj(cnv, b); /* no go through the original object's outlets, and duplicate the connection * of each to the new object */ for(nout=0, count=0; noutte_binbuf); t_atom*argv=binbuf_getvec(obj->te_binbuf); t_object*stub=0; int obj_nout=obj_noutlets(obj); int nout; binbuf_addv(b, "ssii", gensym("#X"), gensym("obj"), obj->te_xpix, obj->te_ypix); binbuf_add(b, 1, argv); binbuf_addv(b, "s", gensym("a")); binbuf_add(b, argc-1, argv+1); stub=triggerize_createobj(cnv, b); for(nout=0; noutgl_list; gobj; gobj=gobj->g_next) { t_object*obj=g2o(gobj); if(obj && glist_isselected(cnv, gobj)) { const t_symbol*c_name=obj->te_g.g_pd->c_name; if((s_trigger == c_name) && fun(cnv, obj)) count++; } } return count; } static int triggerize_triggers(t_glist*cnv) { /* cleanup [trigger] objects */ int count=0; /* nothing to do, if the selection is not exclusively [trigger] objects */ if(!only_triggers_selected(cnv)) return 0; /* TODO: here's the place to merge multiple connected triggers */ /* * remove all unused outlets from (selected) triggers */ count = with_triggers(cnv, minimize_trigger); if(count) return count; /* * expand each (selected) trigger to the left */ count = with_triggers(cnv, expand_trigger); if(count) return count; /* nothing more to do */ return 0; } static void canvas_do_triggerize(t_glist*cnv) { /* * selected msg-connection: insert [t a] * selected sig-connection: insert [pd nop~] * selected [trigger]s with fan-outs: remove them (by inserting new outlets of the correct type) * selected objects with fan-outs: remove fan-outs * selected [trigger]: remove unused outlets * selected [trigger]: else, add left-most "a" outlet */ if(triggerize_line(cnv))return; if(triggerize_fanouts(cnv))return; if(triggerize_triggers(cnv))return; } static void canvas_triggerize(t_glist*cnv) { int dspstate; if(NULL == cnv)return; /* suspend system */ dspstate = canvas_suspend_dsp(); canvas_do_triggerize(cnv); /* restore state */ canvas_redraw(cnv); glist_redraw(cnv); canvas_resume_dsp(dspstate); } void triggerize_setup(void) { if(NULL==canvas_class)return; post("triggerize - insert [trigger] ad lib."); if(NULL==zgetfn(&canvas_class, gensym("triggerize"))) class_addmethod(canvas_class, (t_method)canvas_triggerize, gensym("triggerize"), 0); } iem_utils-v0.0.20180206/punish/patcherize-plugin/0000755000175000017500000000000013236306220021621 5ustar zmoelnigzmoelnigiem_utils-v0.0.20180206/punish/patcherize-plugin/patcherize.c0000644000175000017500000005260413207347567024153 0ustar zmoelnigzmoelnig/****************************************************** * * patcherize - implementation file * * copyleft (c) IOhannes m zmölnig * * 2016:forum::für::umläute:2016 * * institute of electronic music and acoustics (iem) * ****************************************************** * * license: GNU General Public License v.2 (or later) * ******************************************************/ /* * * - patcherize selection * * send a 'patcherize' message to the canvas, and all currently selected objects will * be moved into a newly created subpatch * * TODO: * - subpatch label * + if the containing canvas is visible, go into edit-mode and let the user type a canvas-name immediately * * LATER: * - save selection to file * */ #include "m_pd.h" #include "g_canvas.h" #include "m_imp.h" #include #include #include /* ------------------------- patcherize ---------------------------- */ /* ------------ utilities ---------- */ void update_minmax_i(int value, int*min_value, int*max_value) { if(min_value && *min_value > value) *min_value = value; if(max_value && *max_value < value) *max_value = value; } static t_gobj*o2g(t_object*obj) { return &(obj->te_g); } static t_object*g2o(t_gobj*gobj) { return pd_checkobject(&gobj->g_pd); } static void print_glist(t_glist*glist) { t_gobj*obj = NULL; if(NULL == glist)return; post("\tglist=%p", glist); for(obj=glist->gl_list; obj; obj=obj->g_next) { post ("\t%p [%p]", obj, obj->g_next); } } static int glist_suspend_editor(t_glist*glist) { int wanteditor = (NULL != glist->gl_editor); canvas_destroy_editor(glist); return wanteditor; } static void glist_resume_editor(t_glist*glist, int wanteditor) { if(wanteditor) { canvas_create_editor(glist); } glist_redraw(glist); } static int object_isabstraction(t_object*obj) { if(!obj || !obj->te_g.g_pd)return 0; return (gensym("canvas") == obj->te_g.g_pd->c_name && canvas_isabstraction((t_canvas*)obj)); } static int object_issubpatch(t_object*obj) { if(!obj || !obj->te_g.g_pd)return 0; return (gensym("canvas") == obj->te_g.g_pd->c_name && !canvas_isabstraction((t_canvas*)obj)); } static void object_typedmess(t_object *x, t_symbol *s, int argc, t_atom *argv) { pd_typedmess(&x->te_g.g_pd, s, argc, argv); } /* returns 0 if the object is to be excluded from patcherization */ static t_symbol**s_excluded_classnames = 0; static void build_exclude_list(void) { int i=0; s_excluded_classnames=getbytes(5 * sizeof(*s_excluded_classnames)); s_excluded_classnames[i++]=gensym("inlet"); s_excluded_classnames[i++]=gensym("outlet"); s_excluded_classnames[i++]=gensym("inlet~"); s_excluded_classnames[i++]=gensym("outlet~"); s_excluded_classnames[i++]=0; } static int include_in_patcherization(const t_object*obj) { const t_symbol*c_name=obj->te_g.g_pd->c_name; t_symbol**excluded; if(!s_excluded_classnames)build_exclude_list(); for(excluded=s_excluded_classnames;*excluded; excluded++) { if(c_name == *excluded)return 0; } return 1; } struct _patcherize_connectto { t_object *object; /* object that we connect to */ unsigned int index; /* which inlet of the given object is this? */ struct _patcherize_connectto *next; }; /* connection between subpatch and surrounding environment */ typedef struct _patcherize_connection { int is_signal; /* is this a signal outlet? */ t_object*object; /* object that we connect from */ unsigned int index; /* which outlet of the given object is this? */ struct _patcherize_connectto*to; /* list of connections */ struct _patcherize_connection*next; } t_patcherize_connection; typedef struct _patcherize_connections { t_patcherize_connection*inlets; t_patcherize_connection*outlets; } t_patcherize_connections; static int patcherize_conn_leftof_ref(t_object*ref_obj, unsigned int ref_idx, t_object*obj, unsigned int idx) { if(obj->te_xpix < ref_obj->te_xpix) return 1; if(obj->te_xpix > ref_obj->te_xpix) return 0; if(idx < ref_idx) return 1; if(idx > ref_idx) return 0; if(obj->te_ypix < ref_obj->te_ypix) return 1; if(obj->te_ypix > ref_obj->te_ypix) return 0; return 0; } static void insert_connection_to(t_patcherize_connection*iolets,t_object*to_obj, unsigned int to_index) { struct _patcherize_connectto*dest=iolets->to, *last=NULL; while(dest) { if((dest->object == to_obj) && (dest->index == to_index)) /* already inserted */ return; last=dest; dest=dest->next; } dest=calloc(1, sizeof(*dest)); dest->object=to_obj; dest->index=to_index; if(last) last->next=dest; else iolets->to=dest; } static t_patcherize_connection*create_connection(t_object*from_obj, int from_index, t_object*to_obj, int to_index) { t_patcherize_connection*conn=calloc(1, sizeof(*conn)); conn->is_signal=obj_issignaloutlet(from_obj, from_index); conn->object=from_obj; conn->index=from_index; insert_connection_to(conn, to_obj, to_index); return conn; } static t_patcherize_connection*insert_connection(t_patcherize_connection*iolets, t_object*from_obj, unsigned int from_index, t_object*to_obj, unsigned int to_index) { /* check whether iolets already contains from_obj/from_index */ t_patcherize_connection*cur=iolets, *last=NULL, *conn=NULL; if(!cur) { return create_connection(from_obj, from_index, to_obj, to_index); } while(cur) { if((cur->object == from_obj) && (cur->index == from_index)) { /* found it; insert new 'to' */ insert_connection_to(cur, to_obj, to_index); return iolets; } cur=cur->next; } /* if we reach this, then we didn't find the output in our list; so create it */ /* LATER: insert the new connection at a sorted location */ conn=create_connection(from_obj, from_index, to_obj, to_index); /* inserted into sorted list */ cur=iolets; last=NULL; while(cur) { if(patcherize_conn_leftof_ref(cur->object, cur->index, from_obj, from_index)) { /* we sort before current element, so insert! */ conn->next=cur; if(last) { last->next=conn; } else { /* insert beginning */ iolets=conn; } return iolets; } last=cur; cur=cur->next; } /* if we reached this, then the new outlet sorts last */ last->next=conn; return iolets; } static void print_conns(const char*name, t_patcherize_connection*conn) { post("%s: %p", name, conn); while(conn) { struct _patcherize_connectto *to=conn->to; while(to) { post("%s%p[%d] -> %p[%d]", name, conn->object, conn->index, to->object, to->index); to=to->next; } conn=conn->next; } } static t_patcherize_connection*get_object_connections(t_patcherize_connection*iolets, t_glist*cnv, t_object*obj) { int sel=glist_isselected(cnv,&obj->te_g); int obj_nout=obj_noutlets(obj); int nout=0; for(nout=0; noutte_g)) != sel) { /* this is a connection crossing the selection boundary; insert it */ iolets=insert_connection(iolets, obj, nout, dest, which); } } } return iolets; } static t_patcherize_connections*get_connections(t_glist*cnv) { t_patcherize_connections*connections=calloc(1, sizeof(*connections)); /* 1. iterate over all the objects in the canvas, and store any connecting objects */ t_gobj*gobj=NULL; for(gobj=cnv->gl_list; gobj; gobj=gobj->g_next) { t_object*obj=pd_checkobject(&gobj->g_pd); if(!obj)continue; if(glist_isselected(cnv, gobj)) { connections->outlets=get_object_connections(connections->outlets, cnv, obj); } else { connections->inlets=get_object_connections(connections->inlets, cnv, obj); } } return connections; } static unsigned int object_getmaxdollar(t_object*obj, unsigned int intermediate) { t_binbuf*b=obj->te_binbuf; int argc=binbuf_getnatom(b); t_atom*argv=binbuf_getvec(b); while(argc--) { t_atom*a=argv++; unsigned int dollarg=0; if(A_DOLLAR == a->a_type) dollarg=a->a_w.w_index; else if(A_DOLLSYM == a->a_type) { const char*s=a->a_w.w_symbol->s_name; while(*s){ if('$' == *s) { char*endptr=0; long int v=strtol(s+1, &endptr, 10); s=endptr; if(v>dollarg)dollarg=v; } else s++; } } if(dollarg>intermediate)intermediate=dollarg; } return intermediate; } static unsigned int get_maxdollarg(t_object*obj) { unsigned int result=0; if(object_issubpatch(obj)) { // a subpatch! recurse t_gobj*gobj; for(gobj=((t_glist*)obj)->gl_list; gobj; gobj=gobj->g_next) { unsigned int subdollar=get_maxdollarg(g2o(gobj)); if(subdollar>result)result=subdollar; } } return(object_getmaxdollar(obj, result)); } static void free_connectto(struct _patcherize_connectto*conn) { struct _patcherize_connectto*next=0; while(conn) { next=conn->next; conn->object=NULL; conn->index=0; conn->next=NULL; free(conn); conn=next; } } static void free_connection(t_patcherize_connection*conn) { t_patcherize_connection*next=0; while(conn) { next=conn->next; free_connectto(conn->to); conn->object=NULL; conn->index=0; conn->to=NULL; conn->next=NULL; free(conn); conn=next; } } static void free_connections(t_patcherize_connections*conns) { free_connection(conns->inlets); free_connection(conns->outlets); conns->inlets=conns->outlets=NULL; free(conns); } static void patcherize_boundary_disconnect(t_patcherize_connection*from) { while(from) { struct _patcherize_connectto*to=from->to; while(to) { obj_disconnect(from->object, from->index, to->object, to->index); to=to->next; } from=from->next; } } static void patcherize_boundary_reconnect(t_canvas*cnv,t_patcherize_connections*connections) { unsigned int index=0; t_gobj*gobj=cnv->gl_list; t_patcherize_connection*conns=connections->inlets; while(conns) { struct _patcherize_connectto*to=conns->to; /* connect outside objects with new subpatch */ obj_connect(conns->object, conns->index, (t_object*)cnv, index); while(to) { /* connect [inlet]s with inside objects */ obj_connect((t_object*)gobj, 0, to->object, to->index); to=to->next; } index++; gobj=gobj->g_next; conns=conns->next; } conns=connections->outlets; index=0; while(conns) { struct _patcherize_connectto*to=conns->to; /* connect inside objects with [outlet]s */ obj_connect(conns->object, conns->index, (t_object*)gobj, 0); while(to) { /* connect subpatch with outside objects */ obj_connect((t_object*)cnv, index, to->object, to->index); to=to->next; } index++; conns=conns->next; gobj=gobj->g_next; } } static void patcherize_fixcoordinates(unsigned int argc, t_gobj**argv, int xmin, int ymin) { unsigned int i; for(i=0; ig_pd); if(obj) { int x = obj->te_xpix; int y = obj->te_ypix; obj->te_xpix = x - xmin + 30; obj->te_ypix = y - ymin + 60; } } } static int patcherize_single_canvas(t_gobj*gobj, const char*name, int save2file) { /* sub-patcherizing abstraction: turn abstraction into subpatch * filepatcherizing sub-patch : turn sub-patch into abstraction */ t_object*obj=g2o(gobj); if(save2file && object_issubpatch(obj)) { post("patcherizing subpatch"); } else if(!save2file && object_isabstraction(obj)) { if (!name) { t_atom*argv=binbuf_getvec(obj->te_binbuf); name=atom_getsymbol(argv)->s_name; } post("sub-patcherizing abstraction: %s", name); } return 0; } static t_glist*patcherize_makesub(t_canvas*cnv, const char* name, /* subpatch name of filename */ int*save2file_, int X, int Y, int xmin, int ymin, int xmax, int ymax, int xwin, int ywin, t_patcherize_connections*connections, unsigned int maxdollarg); static t_glist* patcherize_makesub_tryagain(t_canvas*cnv, const char*name, int*save2file, int X, int Y, int xmin, int ymin, int xmax, int ymax, int xwin, int ywin, t_patcherize_connections*connections, unsigned int maxdollarg, t_binbuf*b, t_pd *boundx, t_pd *boundn) { /* things went wrong, try again as subpatch */ t_glist*res=patcherize_makesub(cnv, name, 0, X, Y, xmin, ymin, xmax, ymax, xwin, ywin, connections, maxdollarg); if(save2file)*save2file=0; s__X.s_thing = boundx; s__N.s_thing = boundn; binbuf_free(b); return res; } static t_glist*patcherize_makesub(t_canvas*cnv, const char* name, /* subpatch name of filename */ int*save2file_, int X, int Y, int xmin, int ymin, int xmax, int ymax, int xwin, int ywin, t_patcherize_connections*connections, unsigned int maxdollarg) { t_binbuf*b=NULL; t_gobj*result=NULL; t_patcherize_connection*iolets=NULL; int x, y; int width=xmax-xmin; int height=ymax-ymin; int save2file=(save2file_)?*save2file_:0; /* save and clear bindings to symbols #a, $N, $X; restore when done */ t_pd *boundx = s__X.s_thing, *boundn = s__N.s_thing; s__X.s_thing = &cnv->gl_pd; s__N.s_thing = &pd_canvasmaker; if(width <200) width=200; if(height<100)height=100; if (!name || !*name)save2file=0; if(save2file && strcmp(name + strlen(name) - 3, ".pd")) { /* not a Pd patch */ save2file=0; } b=binbuf_new(); if (save2file) { // #N canvas 4 49 450 300 10; binbuf_addv(b, "ssiiiii;", gensym("#N"), gensym("canvas"), xwin+xmin, ywin+ymin, width, height, 10); } else { binbuf_addv(b, "ssiiiisi;", gensym("#N"), gensym("canvas"), xwin+xmin, ywin+ymin, width, height, gensym(name), 0); } iolets=connections->inlets; x=20; y=20; while(iolets) { binbuf_addv(b, "ssiis;", gensym("#X"), gensym("obj"), x, y, obj_issignaloutlet(iolets->object, iolets->index)?gensym("inlet~"):gensym("inlet")); x+=50; iolets=iolets->next; } iolets=connections->outlets; x=20; y=height-30; while(iolets) { binbuf_addv(b, "ssiis;", gensym("#X"), gensym("obj"), x, y, obj_issignaloutlet(iolets->object, iolets->index)?gensym("outlet~"):gensym("outlet")); x+=50; iolets=iolets->next; } if(save2file) { } else { binbuf_addv(b, "ssiiss;", gensym("#X"), gensym("restore"), X, Y, gensym("pd"), gensym(name)); } if(save2file) { /* save the binbuf to file */ char dirbuf[MAXPDSTRING]; const char*nameptr; char*nameptr_res; char objname[MAXPDSTRING]; int fd; int len=strlen(name) -3 ; unsigned int i; strncpy(objname, name, MAXPDSTRING-1); objname[MAXPDSTRING-1]=0; if(len>0 && len= 0) { sys_close(fd); nameptr_res[-1]='/'; if(!strcmp(dirbuf, name)) { strncpy(objname, nameptr_res, MAXPDSTRING-2); objname[strlen(nameptr_res)-3]=0; // strip away ".pd".extension } } binbuf_clear(b); binbuf_addv(b, "ssiis", gensym("#X"), gensym("obj"), X, Y, gensym(objname)); for(i=1; i<=maxdollarg; i++) { t_atom a; char dollstring[MAXPDSTRING]; snprintf(dollstring, MAXPDSTRING-1, "$%d", i); dollstring[MAXPDSTRING-1]=0; SETSYMBOL(&a, gensym(dollstring)); binbuf_add(b, 1, &a); } binbuf_addsemi(b); } binbuf_eval(b, 0,0,0); binbuf_free(b); s__X.s_thing = boundx; s__N.s_thing = boundn; /* the new object is the last in the parent's glist */ for(result=cnv->gl_list; result->g_next;) result=result->g_next; if(save2file_)*save2file_=save2file; return pd_checkglist(&(result->g_pd)); } static void canvas_patcherize(t_glist*cnv, t_symbol*s) { /* migrate selected objects from one canvas to another without re-instantiating them */ int dspstate = 0; int editFrom = 0; t_gobj*gobj = NULL, *last=NULL; int objcount=0; t_gobj**gobjs=0; t_glist*to; int i=0; int xpos=0, ypos=0; int xmin, ymin, xmax, ymax; int numins=0, numouts=0; t_patcherize_connections*connections; const char*name = 0; int save2file=0; int maxdollarg=0; if(NULL == cnv)return; xmin=ymin=INT_MAX; xmax=ymax=INT_MIN; if (s && s->s_name && *s->s_name) { name=s->s_name; save2file=1; } /* store all the selected objects. * this needs to be done because the GUI-cleanup in glist_suspend_editor() * will undo any selection... */ gobjs=getbytes(0*sizeof(*gobjs)); for(gobj=cnv->gl_list; gobj; gobj=gobj->g_next) { if(glist_isselected(cnv, gobj)) { t_object*obj=pd_checkobject(&gobj->g_pd); if(!include_in_patcherization(obj)){ /* deselect excluded objects */ glist_deselect(cnv, gobj); continue; } if(obj) { int dollarg=get_maxdollarg(obj); int x=obj->te_xpix; int y=obj->te_ypix; xpos+=x; ypos+=y; update_minmax_i(x, &xmin, &xmax); update_minmax_i(y, &ymin, &ymax); if(dollarg>maxdollarg)maxdollarg=dollarg; } gobjs=resizebytes(gobjs, (objcount)*sizeof(*gobjs), (objcount+1)*sizeof(*gobjs)); gobjs[objcount]=gobj; objcount++; } } /* if nothing is selected, we are done... */ if(!objcount) { freebytes(gobjs,objcount * sizeof(*gobjs)); return; } if(1==objcount && patcherize_single_canvas(gobjs[0], name, save2file)) { post("single canvas patcherization"); } else { t_patcherize_connection*iolets; connections=get_connections(cnv); iolets=connections->inlets; if(!name)name="/*patcherized*/"; numins=0; while(iolets) { iolets=iolets->next; numins++; } iolets=connections->outlets; numouts=0; while(iolets) { iolets=iolets->next; numouts++; } dspstate=canvas_suspend_dsp(); /* disconnect the boundary connections */ patcherize_boundary_disconnect(connections->inlets); patcherize_boundary_disconnect(connections->outlets); /* create a new sub-patch to patcherize into */ to=patcherize_makesub(cnv, name, &save2file, xpos/objcount, ypos/objcount, xmin, ymin, xmax+50, ymax+150, cnv->gl_screenx1,cnv->gl_screeny1, connections, maxdollarg); if(!to) goto cleanup; editFrom=glist_suspend_editor(cnv); /* move the objects to the new subcanvas */ for(i=0; igl_list; gobj2; last=gobj2, gobj2=gobj2->g_next) { if (gobj == gobj2) { doit=1; break; } } if (!doit)continue; /* remove the object from the 'from'-canvas */ if (last) last->g_next = gobj->g_next; else cnv->gl_list = gobj->g_next; /* append it to the 'to'-canvas */ if(to->gl_list) { for(gobj2=to->gl_list; gobj2 && gobj2->g_next;) gobj2=gobj2->g_next; gobj2->g_next = gobj; } else { to->gl_list = gobj; } gobj->g_next = 0; } patcherize_fixcoordinates(objcount, gobjs, xmin, ymin); /* reconnect the boundary connections */ //print_conns("inlets :",connections->inlets); //print_conns("outlets:",connections->outlets); patcherize_boundary_reconnect(to, connections); } if(save2file) { object_typedmess(&to->gl_obj, gensym("menusave"), 0, 0); } canvas_dirty(cnv, 1); cleanup: /* cleanup */ free_connections(connections); freebytes(gobjs,objcount * sizeof(*gobjs)); /* restore state */ glist_resume_editor(cnv, editFrom); canvas_redraw(cnv); canvas_resume_dsp(dspstate); } void patcherize_setup(void) { if(NULL==canvas_class)return; //iemguts_boilerplate("patcherize - turn objects into a subpatch", 0); post("patcherize - turn objects into a subpatch"); if(NULL==zgetfn(&canvas_class, gensym("patcherize"))) class_addmethod(canvas_class, (t_method)canvas_patcherize, gensym("patcherize"), A_DEFSYM, 0); if(0) { print_glist(NULL); print_conns("", NULL); o2g(NULL); } } iem_utils-v0.0.20180206/punish/patcherize-plugin/README.md0000644000175000017500000000570713004410214023101 0ustar zmoelnigzmoelnigpatcherize ========== - connections to the containing patch will be kept (via inlets/outlets) - objects will keep their internal state # Usage - Select the objects you want to turn into a subpatch - Press Control+Shift+p to turn the selected objects into a subpatch. - the selection will be replaced by a subpatch `[pd /*patcherized*/]` - Alternatively, you can do this via the Menu: `Edit` -> `(Sub)patcherize Selection` You can also create an abstraction from the selection: - Select the objects you want to turn into a subpatch - Use the menu: `Edit` -> `Patcherize selection...` - a "Save As..." menu will appear, asking you where you want to save the patcherized selection (e.g. pick "foo.pd") - The selection will be replaced by an abstraction for the said name (e.g. `[foo]`). - If you saved the abstraction outside Pd's search path, the abstraction will be instantiated with its full name (e.g. `[/home/frodel/foo]`) # Installation ## Building Build the external: make If you have an unusual setup (and/or your Pd installation is at a place not found by the compiler), you can parameterize the build. Try this first: make help ## Installing Put both the externals (`patcherize.pd_linux` or similar) an dthe GUI plugin (`patcherize-plugin.tcl`) into a directory `patcherize-plugin`, and put that into a place where Pd can find it. make install E.g. $ ~/.local/lib/pd/extra/patcherize-plugin/ ~/.local/lib/pd/extra/patcherize-plugin/patcherize.pd_linux ~/.local/lib/pd/extra/patcherize-plugin/patcherize-plugin.tcl # BUGS ## Pd crashes when clicking on a patcherized msgbox Yes. Patcherization does not re-instantiate any object (or msgbox). Instead it just "moves" the selection to the new window, basically leaving the object unaware that it's context has changed. When clicking on the 'msgbox', the "flashing effect" will try to talk to the wrong window, resulting in a crash. This could be fixed by doing a Cut-n-Paste instead of sleekily migrating the objects, but this would result in objects losing their inner state (not a problem for a msgbox, that doesn't have any hidden inner state) ## GUI objects do not respond after being patcherized See above: the reason for this behaviour is the same (albeit less drastic) than the crashing msgbox. Unfortunately, generic GUI objects might (and most probably) will have a hidden inner state - which is the reason why i would rather not go the safe Cut-n-Paste route. # AUTHORS IOhannes m zmölnig # LICENSE `patcherize` is released under the Gnu GPL version 2 (or later). See LICENSE.md for the full text of the GPLv2. ## Special license grant to Miller Puckette I hereby grant Miller S. Puckette the exclusive right to include `patcherize` into Pure Data (Pd) under the BSD 3-clause license under which Pd is currently released. Once it has been included into Pd it is of course re-distributable under that license. Until then, the Gnu GPL v2 (or later) applies. iem_utils-v0.0.20180206/punish/patcherize-plugin/patcherize-plugin.tcl0000644000175000017500000000620613207347074025775 0ustar zmoelnigzmoelnig# META helper plugin for patcherize-selection # META DESCRIPTION adds menu to tell the 'patcherize' library to doit # META AUTHOR IOhannes m zmölnig # META VERSION 0.1 package require pdwindow 0.1 if [catch { package require msgcat ::msgcat::mcload po }] { puts "iem::punish::patcherize: i18n failed" } namespace eval ::iem::punish::patcherize:: { variable label_sub variable label_abs proc focus {winid state} { set menustate [expr $state?"normal":"disabled"] .menubar.edit entryconfigure "$::iem::punish::patcherize::label_sub" -state $menustate .menubar.edit entryconfigure "$::iem::punish::patcherize::label_abs" -state $menustate } ## helper function to pick a filename for saving # (why isn't there something like this in Pd-GUI?) proc savepanel {initialdir {initialfile ""} {defaultextension ".pd"} {filetypes $::filetypes} } { if { "$filetypes" == {$::filetypes} } { set filetypes $::filetypes } if { ! [file isdirectory $initialdir]} {set initialdir $::env(HOME)} set filename [tk_getSaveFile \ -defaultextension $defaultextension \ -filetypes $filetypes \ -initialfile $initialfile \ -initialdir $initialdir] return $filename } proc patcherize2file {winid} { set filename [::iem::punish::patcherize::savepanel "." "" ".pd" [list [list [_ "Pd Files"] {.pd} ]]] if { $filename != "" } { menu_send $::focused_window "patcherize [enquote_path $filename]" } } proc register {} { # create an entry for our "print2svg" in the "file" menu set ::iem::punish::patcherize::label_sub [_ "SubPatcherize Selection"] set ::iem::punish::patcherize::label_abs [_ "Patcherize Selection..."] set accelerator $::pd_menus::accelerator set mymenu .menubar.edit if {$::windowingsystem eq "aqua"} { set inserthere 8 set accelerator "$accelerator+Shift" } else { set inserthere 8 set accelerator "Shift+$accelerator" } set accelerator "$accelerator+P" $mymenu insert $inserthere command \ -label $::iem::punish::patcherize::label_sub \ -state disabled \ -accelerator "$accelerator" \ -command { menu_send $::focused_window patcherize } $mymenu insert [incr inserthere] command \ -label $::iem::punish::patcherize::label_abs \ -state disabled \ -command { ::iem::punish::patcherize::patcherize2file $::focused_window } bind all <$::modifier-Key-P> {menu_send %W patcherize} bind PatchWindow "+::iem::punish::patcherize::focus %W 1" bind PdWindow "+::iem::punish::patcherize::focus %W 0" # attempt to load the 'patcherize' library from iem::punish # (that does all the work) set lib [string map {" " "\\ "} [file join $::current_plugin_loadpath patcherize]] pdsend "pd-_float_template declare -lib $lib" pdtk_post "loaded iem::punish::patcherize-plugin\n" } } ::iem::punish::patcherize::register iem_utils-v0.0.20180206/punish/patcherize-plugin/Makefile.pdlibbuilder0000644000175000017500000011642213207347074025741 0ustar zmoelnigzmoelnig# Makefile.pdlibbuilder dated 2016-11-22 version = 0.4.4 # Helper makefile for Pure Data external libraries. # Written by Katja Vetter March-June 2015 for the public domain. No warranties. # Inspired by Hans Christoph Steiner's Makefile Template and Stephan Beal's # ShakeNMake. # # Grab the newest version of Makefile.pdlibbuilder from # https://github.com/pure-data/pd-lib-builder/ # # GNU make version >= 3.81 required. # # #=== characteristics =========================================================== # # # - defines build settings based on autodetected OS and architecture # - defines rules to build Pd class- or lib executables from C or C++ sources # - defines rules for libdir installation # - defines convenience targets for developer and user # - evaluates implicit dependencies for non-clean builds # # #=== basic usage =============================================================== # # # In your Makefile, define your Pd lib name and class files, and include # Makefile.pdlibbuilder at the end of the Makefile. Like so: # # ________________________________________________________________________ # # # Makefile for mylib # # lib.name = mylib # # class.sources = myclass1.c myclass2.c # # datafiles = myclass1-help.pd myclass2-help.pd README.txt LICENSE.txt # # include Makefile.pdlibbuilder # ________________________________________________________________________ # # # For files in class.sources it is assumed that class basename == source file # basename. The default target builds all classes as individual executables # with Pd's default extension for the platform. For anything more than the # most basic usage, continue reading. # # #=== list of Makefile.pdlibbuilder API variables =============================== # # # Variables available for definition in your library Makefile: # # - lib.name # - lib.setup.sources # - class.sources # - common.sources # - shared.sources # - .class.sources # - .class.ldflags # - .class.ldlibs # - cflags # - ldflags # - ldlibs # - datafiles # - datadirs # - makefiles # - makefiledirs # - externalsdir # # Optional multiline defines evaluated per operating system: # # - forLinux # - forDarwin # - forWindows # # Variables available for your makefile or make command line: # # - make-lib-executable # - suppress-wunused # # Path variables for make command line or environment: # # - PDDIR # - PDINCLUDEDIR # - PDBINDIR # - PDLIBDIR # # Standard make variables for make command line or environment: # # - CPPFLAGS # - CFLAGS # - LDFLAGS # - CC # - CXX # - INSTALL # - DESTDIR # # Deprecated path variables: # # - PD_PATH # - pdincludepath # - pdbinpath # - objectsdir # # #=== descriptions of Makefile.pdlibbuilder API variables ======================= # # # lib.name: # Name of the library directory as it will be installed / distributed. Also the # name of the lib executable in the case where all classes are linked into # a single binary. # # lib.setup.sources: # Source file(s) (C or C++) which must be compiled only when linking all classes # into a single lib binary. # # class.sources: # All sources files (C or C++) for which the condition holds that # class name == source file basename. # # .class.sources: # Source file(s) (C or C++) specific to class . Use this for # multiple-source classes or when class name != source file basename. # # common.sources: # Source file(s) which must be statically linked to each class in the library. # # shared.sources: # Source file(s) (C or C++) to build a shared dynamic link lib, to be linked # with all class executables. # # cflags, ldflags, ldlibs: # Define cflags (preprocessor&compiler), ldflags (linker) and ldlibs (dynamic # link libs) for the whole library. These flags are added to platform-specific # flags defined by Makefile.pdlibbuilder. # # .class.ldflags and .class.ldlibs: # Define ldflags resp. ldlibs specific to class . These flags are # added to platform-specific flags defined by Makefile.pdlibbuilder, and flags # defined in your Makefile for the whole library. Note: cflags can not be # defined per class in the current implementation. # # datafiles and datadirs: # All extra files you want to include in binary distributions of the # library: abstractions and help patches, example patches, meta patch, readme # and license texts, manuals, sound files, etcetera. Use 'datafiles' for all # files that should go into your lib rootdir and 'datadirs' for complete # directories you want to copy from source to distribution. # # forLinux, forDarwin, forWindows: # Shorthand for 'variable definitions for Linux only' etc. Use like: # define forLinux # cflags += -DLINUX # class.sources += linuxthing.c # endef # # makefiles and makefiledirs: # Extra makefiles or directories with makefiles that should be made in sub-make # processes. # # make-lib-executable: # When this variable is defined 'yes' in your makefile or as command argument, # Makefile.pdlibbuilder will try to build all classes into a single library # executable (but it will force exit if lib.setup.sources is undefined). # If your makefile defines 'make-lib-executable=yes' as the library default, # this can still be overriden with 'make-lib-executable=no' as command argument # to build individual class executables (the Makefile.pdlibbuilder default.) # # suppress-wunused: # When this variable is defined ('yes' or any other value), -Wunused-variable, # -Wunused-parameter, -Wunused-value and -Wunused-function are suppressed, # but the other warnings from -Wall are retained. # # PDDIR: # Root directory of 'portable' pd package. When defined, PDINCLUDEDIR and # PDBINDIR will be evaluated as $(PDDIR)/src and $(PDDIR)/bin. # # PDINCLUDEDIR: # Directory where Pd API m_pd.h should be found, and other Pd header files. # Overrides the default search path. # # PDBINDIR: # Directory where pd.dll should be found for linking (Windows only). Overrides # the default search path. # # PDLIBDIR: # Root directory for installation of Pd library directories. Overrides the # default install location. # # DESTDIR: # Prepended path component for staged install. # # CPPFLAGS: # Preprocessor flags which are not strictly required for building. # # CFLAGS: # Compiler flags which are not strictly required for building. Compiler flags # defined by Makefile.pdlibbuilder for warning, optimization and architecture # specification are overriden by CFLAGS. # # LDFLAGS: # Linker flags which are not strictly required for building. Linker flags # defined by Makefile.pdlibbuilder for architecture specification are overriden # by LDFLAGS. # # CC and CXX: # C and C++ compiler programs as defined in your build environment. # # INSTALL # Definition of install program. # # PD_PATH: # Equivalent to PDDIR. Supported for compatibility with pd-extended central # makefile, but deprecated otherwise. # # objectsdir: # Root directory for installation of Pd library directories, like PDLIBDIR but # not overridable by environment. Supported for compatibility with pd-extended # central makefile, but deprecated otherwise. # # pdincludepath, pdbinpath: # As PDINCLUDEDIR and PDBINDIR but not overridable by environment. Deprecated # as user variables. # # #=== paths ===================================================================== # # # Source files in directories other than current working directory must be # prefixed with their relative path. Do not rely on VPATH or vpath. # Object (.o) files are built in the directory of their source files. # Executables are built in current working directory. # # Default search path for m_pd.h and other API header files is platform # dependent, and overridable by PDINCLUDEDIR: # # Linux: /usr/include/pd # # OSX: /Applications/Pd*.app/Contents/Resources/src # # Windows: %PROGRAMFILES%/pd/src # # Default location to install pd libraries is platform dependent, and # overridable by PDLIBDIR: # # Linux: /usr/local/lib/pd-externals # OSX: ~/Library/Pd # Windows: %APPDATA%/Pd # # https://puredata.info/docs/faq/how-do-i-install-externals-and-help-files # The rationale for not installing to ~/pd-externals by default on Linux # is that some people share the home dir between 32 and 64 bit installations. # # #=== targets =================================================================== # # # all: build $(executables) plus optional post target # post: target to build after $(executables) # alldebug: build all with -g option turned on for debug symbols # : force clean build of an individual class # .pre: make preprocessor output file in current working directory # .lst: make asm/source output file in current working directory # # install: install executables and data files # clean: remove build products from source tree # # help: print help text # vars: print makefile variables # allvars: print all variables # depend: print generated prerequisites # coffee: dummy target # # Variable $(executables) expands to class executables plus optional shared lib, # or alternatively to single lib executable when make-lib-executable=true. # Targets pre and post can be defined by library makefile. Make sure to include # Makefile.pdlibbuilder first so default target all will not be redefined. # # #=== Pd-extended libdir concept ================================================ # # # For libdir layout as conceived by Hans-Christoph Steiner, see: # # https://puredata.info/docs/developer/Libdir # # Files README.txt, LICENSE.txt and -meta.pd are part of the libdir # convention. Help patches for each class and abstraction are supposed to be # available. Makefile.pdlibbuilder does not force the presence of these files # however. It does not automatically include such files in libdir installations. # Data files you want to include in distributions must be defined explicitly in # your Makefile. # # #=== Makefile.pdlibbuilder syntax conventions ================================== # # # Makefile.pdlibbuilder variable names are lower case. Default make variables, # environment variables, and standard user variables (CC, CXX, CFLAGS, DESTDIR) # are upper case. Use target 'allvars' to print all variables and their values. # # 'Fields' in data variables are separated by dots, like in 'foo.class.sources'. # Words in variables expressing a function or command are separated by dashes, # like in 'make-lib-executable'. # # #=== useful make options ======================================================= # # # Use 'make -d ' to print debug details of the make process. # Use 'make -p ' to print make's database. # # #=== TODO ====================================================================== # # # - decide whether to use -static-libgcc or shared dll in MinGW # - cygwin support # - android support # - Windows 64 bit support # - figure out how to handle '$' in filenames # - add makefile template targets dpkg-source dist libdir distclean tags? # # #=== end of documentation sections ============================================= # # ################################################################################ ################################################################################ ################################################################################ # GNU make version 3.81 (2006) or higher is required because of the following: # - function 'info' # - variable '.DEFAULT_GOAL' # force exit when make version is < 3.81 ifneq ($(firstword $(sort 3.81 $(MAKE_VERSION))), 3.81) $(error GNU make version 3.81 or higher is required) endif # Relative path to externals root dir in multi-lib source tree like # pd-extended SVN. Default is parent of current working directory. May be # defined differently in including makefile. externalsdir ?= .. # variable you can use to check if Makefile.pdlibbuilder is already included Makefile.pdlibbuilder = true ################################################################################ ### variables: library name and version ######################################## ################################################################################ # strip possibles spaces from lib.name, they mess up calculated file names lib.name := $(strip $(lib.name)) # if meta file exists, check library version metafile := $(wildcard $(lib.name)-meta.pd) ifdef metafile lib.version := $(shell sed -n \ 's|^\#X text [0-9][0-9]* [0-9][0-9]* VERSION \(.*\);|\1|p' \ $(metafile)) endif ################################################################################ ### variables: files ########################################################### ################################################################################ #=== sources =================================================================== # (re)define .class.sources using file names in class.sources define add-class-source $(notdir $(basename $v)).class.sources += $v endef $(foreach v, $(class.sources), $(eval $(add-class-source))) # derive class names from .class.sources variables sourcevariables := $(filter %.class.sources, $(.VARIABLES)) classes := $(basename $(basename $(sourcevariables))) # accumulate all source files specified in makefile classes.sources := $(sort $(foreach v, $(sourcevariables), $($v))) all.sources := $(classes.sources) $(lib.setup.sources) \ $(shared.sources) $(common.sources) #=== object files ============================================================== # construct object filenames from all C and C++ source file names classes.objects := $(addsuffix .o, $(basename $(classes.sources))) common.objects := $(addsuffix .o, $(basename $(common.sources))) shared.objects := $(addsuffix .o, $(basename $(shared.sources))) lib.setup.objects := $(addsuffix .o, $(basename $(lib.setup.sources))) all.objects = $(classes.objects) $(common.objects) $(shared.objects) \ $(lib.setup.objects) #=== executables =============================================================== # use recursive variables here because executable extension is not yet known # construct class executable names from class names classes.executables = $(addsuffix .$(extension), $(classes)) # construct shared lib executable name if shared sources are defined ifdef shared.sources shared.lib = lib$(lib.name).$(shared.extension) else shared.lib = endif ################################################################################ ### variables per platform ##################################################### ################################################################################ #=== flags per architecture ==================================================== # Set architecture-dependent cflags, mainly for Linux. For Mac and Windows, # arch.c.flags are overriden below. machine := $(shell uname -m) # Raspberry Pi 1st generation ifeq ($(machine), armv6l) arch.c.flags = -march=armv6 -mfpu=vfp -mfloat-abi=hard endif # Beagle, Udoo, RPi2 etc. ifeq ($(machine), armv7l) arch.c.flags = -march=armv7-a -mfpu=vfpv3 -mfloat-abi=hard endif # Intel 32 bit, build with SSE and SSE2 instructions ifeq ($(findstring $(machine), i386 i686), $(machine)) arch.c.flags = -march=pentium4 -mfpmath=sse -msse -msse2 endif # Intel/AMD 64 bit, build with SSE, SSE2 and SSE3 instructions ifeq ($(findstring $(machine), ia64 x86_64), $(machine)) arch.c.flags = -march=core2 -mfpmath=sse -msse -msse2 -msse3 endif #=== operating system ========================================================== # The following systems are defined: Linux, Darwin, Windows. GNU and # GNU/kFreeBSD are treated as Linux to get the same options. uname := $(shell uname) ifeq ($(findstring $(uname), Linux GNU GNU/kFreeBSD), $(uname)) system = Linux endif ifeq ($(uname), Darwin) system = Darwin endif ifeq ($(findstring MSYS, $(uname)), MSYS) system = Windows endif ifeq ($(findstring MINGW, $(uname)), MINGW) system = Windows endif # evaluate possible system-specific multiline defines from library makefile $(eval $(for$(system))) # TODO: Cygwin, Android #=== flags and paths for Linux ================================================= ifeq ($(system), Linux) prefix = /usr/local libdir := $(prefix)/lib pkglibdir = $(libdir)/pd-externals pdincludepath := $(wildcard /usr/include/pd) extension = pd_linux cpp.flags := -DUNIX c.flags := -fPIC c.ldflags := -rdynamic -shared -fPIC -Wl,-rpath,"\$$ORIGIN",--enable-new-dtags c.ldlibs := -lc -lm cxx.flags := -fPIC -fcheck-new cxx.ldflags := -rdynamic -shared -fPIC -Wl,-rpath,"\$$ORIGIN",--enable-new-dtags cxx.ldlibs := -lc -lm -lstdc++ shared.extension = so shared.ldflags := -rdynamic -fPIC -shared -Wl,-soname,$(shared.lib) stripflags = --strip-unneeded -R .note -R .comment endif #=== flags and paths for Darwin ================================================ # On OSX we try to build fat binaries by default. It is assumed that OSX i386 # can build for ppc and OSX x86_64 can't. TODO: try to refine this condition. # LLVM-clang doesn't support -fcheck-new, therefore this flag is omitted for # OSX x86_64. ifeq ($(system), Darwin) pkglibdir = $(HOME)/Library/Pd pdincludepath := $(firstword $(wildcard \ /Applications/Pd*.app/Contents/Resources/src)) extension = pd_darwin cpp.flags := -DUNIX -DMACOSX -I /sw/include c.flags := c.ldflags := -undefined suppress -flat_namespace -bundle c.ldlibs := -lc cxx.ldflags := -undefined suppress -flat_namespace -bundle cxx.ldlibs := -lc shared.extension = dylib shared.ldflags = -dynamiclib -undefined dynamic_lookup \ -install_name @loader_path/$(shared.lib) \ -compatibility_version 1 -current_version 1.0 stripflags = -x version.flag := $(filter $(cflags), -mmacosx-version-min=%) ifeq ($(machine), i386) cxx.flags := -fcheck-new arch := ppc i386 x86_64 version.flag ?= -mmacosx-version-min=10.4 endif ifeq ($(machine), x86_64) arch := i386 x86_64 version.flag ?= -mmacosx-version-min=10.5 endif arch.c.flags := $(addprefix -arch , $(arch)) $(version.flag) arch.ld.flags := $(arch.c.flags) endif #=== flags and paths for Windows =============================================== # Standard paths on Windows contain spaces, and GNU make functions treat such # paths as lists, with unintended effects. Therefore we must use shell function # ls instead of make's wildcard, and probe for each standard path individually. # Using double quotes around paths with spaces is obligatory. Since some path # variables are assembled or re-expanded later, great care must be taken to put # quotes at appropriate points throughout the makefile. Thanks, Bill. # paths for 32-bit executables on 64-bit Windows aren't yet defined here (TODO) ifeq ($(system), Windows) pkglibdir := $(APPDATA)/Pd ifndef pdbinpath pdbinpath := $(shell ls -d "$(PROGRAMFILES)/pd/bin") endif ifndef pdincludepath pdincludepath := $(shell ls -d "$(PROGRAMFILES)/pd/src") endif endif # On Windows we build 32 bit by default to match Pd(-extended) binary # distributions. This may change in the future. # TODO: decide whether -mms-bitfields should be specified. ifeq ($(system), Windows) extension = dll CC = gcc CXX = g++ arch.c.flags := -march=pentium4 -msse -msse2 -mfpmath=sse cpp.flags := -DMSW -DNT c.flags := c.ldflags = -static-libgcc -shared \ -Wl,--enable-auto-import "$(pdbinpath)/pd.dll" c.ldlibs := cxx.flags := -fcheck-new cxx.ldflags = -static-libstdc++ -shared \ -Wl,--enable-auto-import "$(pdbinpath)/pd.dll" cxx.ldlibs := shared.extension = dll shared.ldflags = -static-libgcc -shared "$(pdbinpath)/pd.dll" stripflags = --strip-unneeded -R .note -R .comment endif #=== paths ===================================================================== # Platform-dependent default paths are specified above, but overridable. # Path variables in upper case can be defined as make command argument or in the # environment. 'PD_PATH' and 'objectsdir' are supported for compatibility with # the build system that pd-l2ork has inherited from pd-extended. PDDIR ?= $(PD_PATH) PDINCLUDEDIR ?= $(pdincludepath) PDBINDIR ?= $(pdbinpath) PDLIBDIR ?= $(firstword $(objectsdir) $(pkglibdir)) ifneq ($(PDDIR),) PDINCLUDEDIR := $(wildcard $(PDDIR)/src) PDBINDIR := $(wildcard $(PDDIR)/bin) endif # base path where all components of the lib will be installed by default installpath := $(DESTDIR)$(PDLIBDIR)/$(lib.name) # check if include path contains spaces (as is often the case on Windows) # if so, store the path so we can later do checks with it pdincludepathwithspaces := $(if $(word 2, $(PDINCLUDEDIR)), $(PDINCLUDEDIR)) #=== accumulated build flags =================================================== # From GNU make docs: 'Users expect to be able to specify CFLAGS freely # themselves.' So we use CFLAGS to define options which are not strictly # required for compilation: optimizations, architecture specifications, and # warnings. CFLAGS can be safely overriden using a make command argument. # Variables cflags, ldflags and ldlibs may be defined in including makefile. optimization.flags = -O3 -ffast-math -funroll-loops -fomit-frame-pointer warn.flags = -Wall -Wextra -Wshadow -Winline -Wstrict-aliasing # suppress -Wunused-variable & Co if you don't want to clutter a build log ifdef suppress-wunused warn.flags += $(addprefix -Wno-unused-, function parameter value variable) endif CFLAGS = $(warn.flags) $(optimization.flags) $(arch.c.flags) # preprocessor flags cpp.flags := -DPD -I "$(PDINCLUDEDIR)" $(cpp.flags) $(CPPFLAGS) # flags for dependency checking (cflags from makefile may define -I options) depcheck.flags := $(cpp.flags) $(cflags) # architecture specifications for linker are overridable by LDFLAGS LDFLAGS := $(arch.ld.flags) # now add the same ld flags to shared dynamic lib shared.ldflags := $(shared.ldflags) $(LDFLAGS) # accumulated flags for C compiler / linker c.flags := $(cpp.flags) $(c.flags) $(cflags) $(CFLAGS) c.ldflags := $(c.ldflags) $(ldflags) $(LDFLAGS) c.ldlibs := $(c.ldlibs) $(ldlibs) # accumulated flags for C++ compiler / linker cxx.flags := $(cpp.flags) $(cxx.flags) $(cflags) $(CFLAGS) cxx.ldflags := $(cxx.ldflags) $(ldflags) $(LDFLAGS) cxx.ldlibs := $(cxx.ldlibs) $(ldlibs) ################################################################################ ### variables: tools ########################################################### ################################################################################ # aliases so we can later define 'compile-$1' and set 'c' or 'cxx' as argument compile-c := $(CC) compile-cxx := $(CXX) ################################################################################ ### checks ##################################################################### ################################################################################ # At this point most variables are defined. Now do some checks and info's # before rules begin. # 'forward declaration' of default target, needed to do checks all: # To avoid unpredictable results, make sure the default target is not redefined # by including makefile. ifneq ($(.DEFAULT_GOAL), all) $(error Default target must be 'all'.) endif # find out which target(s) will be made ifdef MAKECMDGOALS goals := $(MAKECMDGOALS) else goals := all endif # store path to Pd API m_pd.h if it is found ifdef PDINCLUDEDIR mpdh := $(shell ls "$(PDINCLUDEDIR)/m_pd.h") endif # print Makefile.pdlibbuilder version $(info ++++ info: using Makefile.pdlibbuilder version $(version)) # when making target all, check if m_pd.h is found and print info about it ifeq ($(goals), all) $(if $(mpdh), \ $(info ++++ info: using Pd API $(mpdh)), \ $(warning Where is Pd API m_pd.h? Do 'make help' for info.)) endif # print target info $(info ++++ info: making target $(goals) $(if $(lib.name),in lib $(lib.name))) # when installing, print installpath info $(if $(filter install install-lib, $(goals)), $(info ++++ info: \ installpath is '$(installpath)')) #=== define executables ======================================================== # By default we build class executables, and optionally a shared dynamic link # lib. When make-lib-executable=yes we build all classes into a single lib # executable, on the condition that variable lib.setup.sources is defined. ifeq ($(make-lib-executable),yes) $(if $(lib.setup.sources), ,\ $(error Can not build library blob because lib.setup.sources is undefined)) executables := $(lib.name).$(extension) else executables := $(classes.executables) $(shared.lib) endif ################################################################################ ### rules: special targets ##################################################### ################################################################################ # Disable built-in rules. If some target can't be built with the specified # rules, it should not be built at all. MAKEFLAGS += --no-builtin-rules .PRECIOUS: .SUFFIXES: .PHONY: all post build-lib \ $(classes) $(makefiledirs) $(makefiles) \ install install-executables install-datafiles install-datadirs \ force clean vars allvars depend help ################################################################################ ### rules: build targets ####################################################### ################################################################################ # Target all forces the build of targets [$(executables) post] in # deterministic order. Target $(executables) builds class executables plus # optional shared lib or alternatively a single lib executable when # make-lib-executable=true. Target post is optionally defined by # library makefile. all: post post: $(executables) all: $(info ++++info: target all in lib $(lib.name) completed) # build all with -g option turned on for debug symbols alldebug: c.flags += -g alldebug: cxx.flags += -g alldebug: all #=== class executable ========================================================== # recipe for linking objects in class executable # argument $1 = compiler type (c or cxx) # argument $2 = class basename define link-class $(compile-$1) \ $($1.ldflags) $($2.class.ldflags) \ -o $2.$(extension) \ $(addsuffix .o, $(basename $($2.class.sources))) \ $(addsuffix .o, $(basename $(common.sources))) \ $($1.ldlibs) $($2.class.ldlibs) $(shared.lib) endef # general rule for linking object files in class executable %.$(extension): $(shared.lib) $(info ++++ info: linking objects in $@ for lib $(lib.name)) $(if $(filter %.cc %.cpp, $($*.class.sources)), \ $(call link-class,cxx,$*), \ $(call link-class,c,$*)) #=== library blob ============================================================== # build all classes into single executable build-lib: $(lib.name).$(extension) $(info ++++ info: library blob $(lib.name).$(extension) completed) # recipe for linking objects in lib executable # argument $1 = compiler type (c or cxx) define link-lib $(compile-$1) \ $($1.ldflags) $(lib.ldflags) \ -o $(lib.name).$(extension) $(all.objects) \ $($1.ldlibs) $(lib.ldlibs) endef # rule for linking objects in lib executable # declared conditionally to avoid name clashes ifeq ($(make-lib-executable),yes) $(lib.name).$(extension): $(all.objects) $(if $(filter %.cc %.cpp, $(all.sources)), \ $(call link-lib,cxx), \ $(call link-lib,c)) endif #=== shared dynamic lib ======================================================== # recipe for linking objects in shared executable # argument $1 = compiler type (c or cxx) define link-shared $(compile-$1) \ $(shared.ldflags) \ -o lib$(lib.name).$(shared.extension) $(shared.objects) \ $($1.ldlibs) $(shared.ldlibs) endef # rule for linking objects in shared executable # build recipe is in macro 'link-shared' lib$(lib.name).$(shared.extension): $(shared.objects) $(info ++++ info: linking objects in shared lib $@) $(if $(filter %.cc %.cpp, $(shared.sources)), \ $(call link-shared,cxx), \ $(call link-shared,c)) #=== object files ============================================================== # recipe to make .o file from source # argument $1 is compiler type (c or cxx) define make-object-file $(info ++++ info: making $@ in lib $(lib.name)) $(compile-$1) \ $($1.flags) \ -o $@ -c $< endef # Three rules to create .o files. These are double colon 'terminal' rules, # meaning they are the last in a rules chain. %.o:: %.c $(call make-object-file,c) %.o:: %.cc $(call make-object-file,cxx) %.o:: %.cpp $(call make-object-file,cxx) #=== explicit prerequisites for class executables ============================== # For class executables, prerequisite rules are declared in run time. Target # 'depend' prints these rules for debugging purposes. # declare explicit prerequisites rule like 'class: class.extension' # argument $v is class basename define declare-class-target $v: $v.$(extension) endef # declare explicit prerequisites rule like 'class.extension: object1.o object2.o' # argument $v is class basename define declare-class-executable-target $v.$(extension): $(addsuffix .o, $(basename $($v.class.sources))) \ $(addsuffix .o, $(basename $(common.sources))) endef # evaluate explicit prerequisite rules for all classes $(foreach v, $(classes), $(eval $(declare-class-target))) $(foreach v, $(classes), $(eval $(declare-class-executable-target))) #=== implicit prerequisites for class executables ============================== # Evaluating implicit prerequisites (header files) with help from the # preprocessor is 'expensive' so this is done conditionally and selectively. # Note that it is also possible to trigger a build via install targets, in # which case implicit prerequisites are not checked. # When the Pd include path contains spaces it will mess up the implicit # prerequisites rules. disable-dependency-tracking := $(strip $(pdincludepathwithspaces)) ifndef disable-dependency-tracking must-build-everything := $(filter all, $(goals)) must-build-class := $(filter $(classes), $(goals)) must-build-sources := $(foreach v, $(must-build-class), $($v.class.sources)) endif # declare implicit prerequisites rule like 'object.o: header1.h header2.h ...' # argument $1 is input source file(s) # dir is explicitly added because option -MM strips it by default define declare-object-target $(dir $1)$(filter %.o: %.h, $(shell $(CPP) $(depcheck.flags) -MM $1)) $(MAKEFILE_LIST) endef # evaluate implicit prerequisite rules when rebuilding everything ifdef must-build-everything $(if $(wildcard $(all.objects)), \ $(info ++++ info: evaluating implicit prerequisites in lib $(lib.name).....) \ $(foreach v, $(all.sources), $(eval $(call declare-object-target, $v)))) endif # evaluate implicit prerequisite rules when selectively building classes ifdef must-build-class $(foreach v, $(must-build-sources), \ $(eval $(call declare-object-target, $v))) $(foreach v, $(shared.sources), \ $(eval $(call declare-object-target, $v))) endif ################################################################################ ### rules: preprocessor and assembly files ##################################### ################################################################################ # Preprocessor and assembly output files for bug tracing etc. They are not part # of the build processes for executables. By default these files are created in # the current working directory. Dependency tracking is not performed, the build # is forced instead to make sure it's up to date. force: #=== preprocessor file ========================================================= # make preprocessor output file with extension .pre # argument $1 = compiler type (c or cxx) define make-preprocessor-file $(info ++++ info: making preprocessor output file $(notdir $*.pre) \ in current working directory) $(compile-$1) -E $< $(c.flags) $($1.flags) -o $(notdir $*.pre) endef %.pre:: %.c force $(call make-preprocessor-file,c) %.pre:: %.cc force $(call make-preprocessor-file,cxx) %.pre:: %.cpp force $(call make-preprocessor-file,cxx) #=== assembly file ============================================================= # make C / assembly interleaved output file with extension .lst # argument $1 = compiler type (c or cxx) define make-assembly-file $(info ++++ info: making assembly output file $(notdir $*.lst) \ in current working directory) $(compile-$1) \ -c -Wa,-a,-ad -fverbose-asm \ $($1.flags) \ $< > $(notdir $*.lst) endef %.lst:: %.c force $(call make-assembly-file,c) %.lst:: %.cc force $(call make-assembly-file,cxx) %.lst:: %.cpp force $(call make-assembly-file,cxx) ################################################################################ ### rules: installation targets ################################################ ################################################################################ # Install targets depend on successful exit status of target all because nothing # must be installed in case of a build error. # -p = preserve time stamps # -m = set permission mode (as in chmod) # -d = create all components of specified directories INSTALL = install INSTALL_PROGRAM := $(INSTALL) -p -m 644 INSTALL_DATA := $(INSTALL) -p -m 644 INSTALL_DIR := $(INSTALL) -m 755 -d # strip spaces from file names executables := $(strip $(executables)) datafiles := $(strip $(datafiles)) datadirs := $(strip $(datadirs)) # Do not make any install sub-target with empty variable definition because the # install program would exit with an error. install: $(if $(executables), install-executables) install: $(if $(datafiles), install-datafiles) install: $(if $(datadirs), install-datadirs) install-executables: all $(INSTALL_DIR) -v "$(installpath)" $(foreach v, $(executables), \ $(INSTALL_PROGRAM) '$v' "$(installpath)";) $(info ++++ info: executables of lib $(lib.name) installed \ from $(CURDIR) to $(installpath)) install-datafiles: all $(INSTALL_DIR) -v "$(installpath)" $(foreach v, $(datafiles), \ $(INSTALL_DATA) '$(v)' "$(installpath)";) $(info ++++ info: data files of lib $(lib.name) installed \ from $(CURDIR) to $(installpath)) install-datadirs: all $(foreach v, $(datadirs), $(INSTALL_DIR) "$(installpath)/$v";) $(foreach v, $(datadirs), \ $(INSTALL_DATA) $(wildcard $v/*) "$(installpath)/$v";) $(info ++++ info: data directories of lib $(lib.name) installed \ from $(CURDIR) to $(installpath)) ################################################################################ ### rules: distribution targets ################################################ ################################################################################ # TODO # These targets are implemented in Makefile Template, but I have to figure out # how to do it under the not-so-strict conditions of Makefile.pdlibbuilder. # make source package dist: @echo "target dist not yet implemented" # make Debian source package dpkg-source: @echo "target dpkg-source not yet implemented" $(ORIGDIR): $(DISTDIR): ################################################################################ ### rules: clean targets ####################################################### ################################################################################ # delete build products from build tree clean: rm -f $(all.objects) rm -f $(classes.executables) $(lib.name).$(extension) $(shared.lib) rm -f *.pre *.lst # remove distribution directories and tarballs from build tree distclean: clean @echo "target distclean not yet implemented" ################################################################################ ### rules: submake targets ##################################################### ################################################################################ # Iterate over sub-makefiles or makefiles in other directories. # When 'continue-make=yes' is set, sub-makes will report 'true' to the parent # process regardless of their real exit status. This prevents the parent make # from being aborted by a sub-make error. Useful when you want to quickly find # out which sub-makes from a large set will succeed. ifeq ($(continue-make),yes) continue = || true endif # These targets will trigger sub-make processes for entries in 'makefiledirs' # and 'makefiles'. all alldebug install clean distclean dist dkpg-source: \ $(makefiledirs) $(makefiles) # this expands to identical rules for each entry in 'makefiledirs' $(makefiledirs): $(MAKE) --directory=$@ $(MAKECMDGOALS) $(continue) # this expands to identical rules for each entry in 'makefiles' $(makefiles): $(MAKE) --directory=$(dir $@) --makefile=$(notdir $@) $(MAKECMDGOALS) $(continue) ################################################################################ ### rules: convenience targets ################################################# ################################################################################ #=== show variables ============================================================ # Several 'function' macro's cause errors when expanded within a rule or without # proper arguments. Variables which are set with the define directive are only # shown by name for that reason. functions = \ add-class-source \ declare-class-target \ declare-class-executable-target \ declare-object-target \ link-class \ link-lib \ link-shared \ make-object-file \ make-preprocessor-file \ make-assembly-file # show variables from makefiles vars: $(info ++++ info: showing makefile variables:) $(foreach v,\ $(sort $(filter-out $(functions) functions, $(.VARIABLES))),\ $(if $(filter file, $(origin $v)),\ $(info variable $v = $($v)))) $(foreach v, $(functions), $(info 'function' name: $v)) @echo # show all variables allvars: $(info ++++ info: showing default, automatic and makefile variables:) $(foreach v, \ $(sort $(filter-out $(functions) functions, $(.VARIABLES))), \ $(info variable ($(origin $v)) $v = $($v))) $(foreach v, $(functions), $(info 'function' name: $v)) @echo #=== show dependencies ========================================================= # show generated prerequisites rules depend: $(info ++++ info: generated prerequisite rules) $(foreach v, $(classes), $(info $(declare-class-target))) $(foreach v, $(classes), $(info $(declare-class-executable-target))) $(foreach v, $(all.sources), $(info $(call declare-object-target, $v))) @echo #=== show help text ============================================================ # brief info about targets and paths ifdef mpdh mpdhinfo := $(mpdh) else mpdhinfo := m_pd.h was not found. Is Pd installed? endif help: @echo @echo " Main targets:" @echo " all: build executables (default target)" @echo " install: install all components of the library" @echo " vars: print makefile variables for troubleshooting" @echo " allvars: print all variables for troubleshooting" @echo " help: print this help text" @echo @echo " Pd API m_pd.h:" @echo " $(mpdhinfo)" @echo " You may specify your preferred Pd include directory as argument" @echo " to the make command, like 'PDINCLUDEDIR=path/to/pd/src'." @echo @echo " Path for installation of your libdir(s):" @echo " $(PDLIBDIR)" @echo " Alternatively you may specify your path for installation as argument" @echo " to the make command, like 'PDLIBDIR=path/to/pd-externals'." @echo @echo " Default paths are listed in the doc sections in Makefile.pdlibbuilder." @echo #=== dummy target ============================================================== coffee: @echo "Makefile.pdlibbuilder: Can not make coffee. Sorry." ################################################################################ ### end of rules sections ###################################################### ################################################################################ # for syntax highlighting in vim and github # vim: set filetype=make: iem_utils-v0.0.20180206/punish/patcherize-plugin/Makefile0000755000175000017500000000164113207347074023300 0ustar zmoelnigzmoelnig#!/usr/bin/make -f # Makefile for pure data externals in lib creb. # Needs Makefile.pdlibbuilder to work (https://github.com/pure-data/pd-lib-builder) punish.name = patcherize lib.name = $(punish.name)-plugin # special file that does not provide a class lib.setup.sources = # all other C and C++ files in subdirs are source files per class # (alternatively, enumerate them by hand) class.sources = $(punish.name).c datafiles = \ $(punish.name)-plugin.tcl \ $(wildcard *-help.pd) \ README.md LICENSE.md datadirs = ################################################################################ ### pdlibbuilder ############################################################### ################################################################################ # Include Makefile.pdlibbuilder from this directory, # or else from some user-defined folder PDLIBBUILDER_DIR=./ include $(PDLIBBUILDER_DIR)/Makefile.pdlibbuilder iem_utils-v0.0.20180206/punish/patcherize-plugin/LICENSE.md0000644000175000017500000004364213004410214023226 0ustar zmoelnigzmoelnigGNU GENERAL PUBLIC LICENSE ========================== Version 2, June 1991 > Copyright (C) 1989, 1991 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. # Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Lesser General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. # GNU GENERAL PUBLIC LICENSE # ## TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION ## - *0\.* This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. - 1\. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. - 2\. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. - 3\. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. - 4\. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. - 5\. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. - 6\. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. - 7\. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. - 8\. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. - 9\. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. - 10\. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. ## NO WARRANTY - 11\. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - 12\. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. ## END OF TERMS AND CONDITIONS ## --------------------------------------------------------------------------- ### How to Apply These Terms to Your New Programs ### If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. iem_utils-v0.0.20180206/punish/patcherize-plugin/patcherize-help.pd0000644000175000017500000000271613004410214025230 0ustar zmoelnigzmoelnig#N canvas 241 361 446 325 10; #X declare -lib patcherize -path iemguts -stdpath iemguts; #N canvas 504 133 594 498 guts 0; #X obj 136 176 inlet; #X obj 207 262 sendcanvas 1; #X msg 207 242 patcherize; #X obj 207 222 t b; #X obj 136 380 canvasselect 1; #X msg 136 360 select \$1; #X obj 136 282 t b b; #X msg 215 356 deselect; #X obj 149 105 declare -lib patcherize -path iemguts -stdpath iemguts ; #X obj 425 321 s \$0-on; #X msg 425 300 1; #X obj 425 231 t b; #X msg 188 176 init; #X obj 136 198 route select patcherize init; #X obj 188 154 loadbang; #X msg 136 308 0 \, 1 \, 2; #X obj 136 330 + 8; #X connect 0 0 13 0; #X connect 2 0 1 0; #X connect 3 0 2 0; #X connect 5 0 4 0; #X connect 6 0 15 0; #X connect 6 1 7 0; #X connect 7 0 4 0; #X connect 10 0 9 0; #X connect 11 0 10 0; #X connect 12 0 13 0; #X connect 13 0 6 0; #X connect 13 1 3 0; #X connect 13 2 11 0; #X connect 14 0 12 0; #X connect 15 0 16 0; #X connect 16 0 5 0; #X restore 57 116 pd guts; #X obj 37 274 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144 -1 -1; #X obj 37 252 r \$0-beat; #X msg 57 50 select; #X msg 70 74 patcherize; #X text 114 263 objects will continue to work...; #X text 163 45 1st \, select a few objects; #X text 163 69 then turn selected objects into subpatch; #X obj 125 152 tgl 15 0 empty \$0-on empty 17 7 0 10 -262144 -1 -1 0 1; #X obj 125 196 s \$0-beat; #X obj 125 174 metro 500; #X connect 2 0 1 0; #X connect 3 0 0 0; #X connect 4 0 0 0; #X connect 8 0 10 0; #X connect 10 0 9 0; iem_utils-v0.0.20180206/punish/README.md0000644000175000017500000000132013207347074017454 0ustar zmoelnigzmoelnigpunish - IEM's Pure Data User Interface Hacks ============================================= a collection of hacks for the Pd User Interface # BIG FAT WARNING This collection is intended to explore ideas on how to improve Pd's user interface (from a library perspective). There are known crasher bugs. # Contents ## [patcherize](patcherize-plugin) turn selected objects into a subpatch (or abstraction) ## [triggerize](triggerize-plugin) - replace fan-outs with [trigger]s - expand [trigger] to the *left* - insert [trigger] into wires ## [double-chord](doublechord-plugin) - duplicate connections between two multi-iolet objects # LICENSE each hack comes with its own license # AUTHORS - IOhannes m zmölnig iem_utils-v0.0.20180206/punish/doublechord-plugin/0000755000175000017500000000000013236306220021755 5ustar zmoelnigzmoelnigiem_utils-v0.0.20180206/punish/doublechord-plugin/README.md0000644000175000017500000000267113207347074023254 0ustar zmoelnigzmoelnigdouble chord ============ duplicate patch chords # Usage ### removing fan-outs - Select objects with fan-outs - Press Control+t - the (msg) fan-outs will be replaced by (connected) [t a a] objects # Installation ## Building Build the external: make If you have an unusual setup (and/or your Pd installation is at a place not found by the compiler), you can parameterize the build. Try this first: make help ## Installing TODO these instructions are generic and not necessarily correct Put both the externals (`doublechord.pd_linux` or similar) an dthe GUI plugin (`doublechord-plugin.tcl`) into a directory `doublechord-plugin`, and put that into a place where Pd can find it. make install E.g. $ ~/.local/lib/pd/extra/doublechord-plugin/ ~/.local/lib/pd/extra/doublechord-plugin/doublechord.pd_linux ~/.local/lib/pd/extra/doublechord-plugin/doublechord-plugin.tcl # BUGS ## none known TODO # AUTHORS IOhannes m zmölnig # LICENSE `doublechord` is released under the Gnu GPL version 2 (or later). See LICENSE.md for the full text of the GPLv2. ## Special license grant to Miller Puckette I hereby grant Miller S. Puckette the exclusive right to include `doublechord` into Pure Data (Pd) under the BSD 3-clause license under which Pd is currently released. Once it has been included into Pd it is of course re-distributable under that license. Until then, the Gnu GPL v2 (or later) applies. iem_utils-v0.0.20180206/punish/doublechord-plugin/doublechord-plugin.tcl0000644000175000017500000000121713207347074026262 0ustar zmoelnigzmoelnig# META helper plugin for doublechord-selection # META DESCRIPTION adds menu to tell the 'doublechord' library to doit # META AUTHOR IOhannes m zmölnig # META VERSION 0.1 package require pdwindow 0.1 namespace eval ::iem::punish::doublechord:: { proc register {} { # attempt to load the 'doublechord' library from iem::punish # (that does all the work) set lib [string map {" " "\\ "} [file join $::current_plugin_loadpath doublechord]] pdsend "pd-_float_template declare -lib $lib" pdtk_post "loaded iem::punish::doublechord-plugin\n" } } ::iem::punish::doublechord::register iem_utils-v0.0.20180206/punish/doublechord-plugin/Makefile.pdlibbuilder0000644000175000017500000011642213207347074026075 0ustar zmoelnigzmoelnig# Makefile.pdlibbuilder dated 2016-11-22 version = 0.4.4 # Helper makefile for Pure Data external libraries. # Written by Katja Vetter March-June 2015 for the public domain. No warranties. # Inspired by Hans Christoph Steiner's Makefile Template and Stephan Beal's # ShakeNMake. # # Grab the newest version of Makefile.pdlibbuilder from # https://github.com/pure-data/pd-lib-builder/ # # GNU make version >= 3.81 required. # # #=== characteristics =========================================================== # # # - defines build settings based on autodetected OS and architecture # - defines rules to build Pd class- or lib executables from C or C++ sources # - defines rules for libdir installation # - defines convenience targets for developer and user # - evaluates implicit dependencies for non-clean builds # # #=== basic usage =============================================================== # # # In your Makefile, define your Pd lib name and class files, and include # Makefile.pdlibbuilder at the end of the Makefile. Like so: # # ________________________________________________________________________ # # # Makefile for mylib # # lib.name = mylib # # class.sources = myclass1.c myclass2.c # # datafiles = myclass1-help.pd myclass2-help.pd README.txt LICENSE.txt # # include Makefile.pdlibbuilder # ________________________________________________________________________ # # # For files in class.sources it is assumed that class basename == source file # basename. The default target builds all classes as individual executables # with Pd's default extension for the platform. For anything more than the # most basic usage, continue reading. # # #=== list of Makefile.pdlibbuilder API variables =============================== # # # Variables available for definition in your library Makefile: # # - lib.name # - lib.setup.sources # - class.sources # - common.sources # - shared.sources # - .class.sources # - .class.ldflags # - .class.ldlibs # - cflags # - ldflags # - ldlibs # - datafiles # - datadirs # - makefiles # - makefiledirs # - externalsdir # # Optional multiline defines evaluated per operating system: # # - forLinux # - forDarwin # - forWindows # # Variables available for your makefile or make command line: # # - make-lib-executable # - suppress-wunused # # Path variables for make command line or environment: # # - PDDIR # - PDINCLUDEDIR # - PDBINDIR # - PDLIBDIR # # Standard make variables for make command line or environment: # # - CPPFLAGS # - CFLAGS # - LDFLAGS # - CC # - CXX # - INSTALL # - DESTDIR # # Deprecated path variables: # # - PD_PATH # - pdincludepath # - pdbinpath # - objectsdir # # #=== descriptions of Makefile.pdlibbuilder API variables ======================= # # # lib.name: # Name of the library directory as it will be installed / distributed. Also the # name of the lib executable in the case where all classes are linked into # a single binary. # # lib.setup.sources: # Source file(s) (C or C++) which must be compiled only when linking all classes # into a single lib binary. # # class.sources: # All sources files (C or C++) for which the condition holds that # class name == source file basename. # # .class.sources: # Source file(s) (C or C++) specific to class . Use this for # multiple-source classes or when class name != source file basename. # # common.sources: # Source file(s) which must be statically linked to each class in the library. # # shared.sources: # Source file(s) (C or C++) to build a shared dynamic link lib, to be linked # with all class executables. # # cflags, ldflags, ldlibs: # Define cflags (preprocessor&compiler), ldflags (linker) and ldlibs (dynamic # link libs) for the whole library. These flags are added to platform-specific # flags defined by Makefile.pdlibbuilder. # # .class.ldflags and .class.ldlibs: # Define ldflags resp. ldlibs specific to class . These flags are # added to platform-specific flags defined by Makefile.pdlibbuilder, and flags # defined in your Makefile for the whole library. Note: cflags can not be # defined per class in the current implementation. # # datafiles and datadirs: # All extra files you want to include in binary distributions of the # library: abstractions and help patches, example patches, meta patch, readme # and license texts, manuals, sound files, etcetera. Use 'datafiles' for all # files that should go into your lib rootdir and 'datadirs' for complete # directories you want to copy from source to distribution. # # forLinux, forDarwin, forWindows: # Shorthand for 'variable definitions for Linux only' etc. Use like: # define forLinux # cflags += -DLINUX # class.sources += linuxthing.c # endef # # makefiles and makefiledirs: # Extra makefiles or directories with makefiles that should be made in sub-make # processes. # # make-lib-executable: # When this variable is defined 'yes' in your makefile or as command argument, # Makefile.pdlibbuilder will try to build all classes into a single library # executable (but it will force exit if lib.setup.sources is undefined). # If your makefile defines 'make-lib-executable=yes' as the library default, # this can still be overriden with 'make-lib-executable=no' as command argument # to build individual class executables (the Makefile.pdlibbuilder default.) # # suppress-wunused: # When this variable is defined ('yes' or any other value), -Wunused-variable, # -Wunused-parameter, -Wunused-value and -Wunused-function are suppressed, # but the other warnings from -Wall are retained. # # PDDIR: # Root directory of 'portable' pd package. When defined, PDINCLUDEDIR and # PDBINDIR will be evaluated as $(PDDIR)/src and $(PDDIR)/bin. # # PDINCLUDEDIR: # Directory where Pd API m_pd.h should be found, and other Pd header files. # Overrides the default search path. # # PDBINDIR: # Directory where pd.dll should be found for linking (Windows only). Overrides # the default search path. # # PDLIBDIR: # Root directory for installation of Pd library directories. Overrides the # default install location. # # DESTDIR: # Prepended path component for staged install. # # CPPFLAGS: # Preprocessor flags which are not strictly required for building. # # CFLAGS: # Compiler flags which are not strictly required for building. Compiler flags # defined by Makefile.pdlibbuilder for warning, optimization and architecture # specification are overriden by CFLAGS. # # LDFLAGS: # Linker flags which are not strictly required for building. Linker flags # defined by Makefile.pdlibbuilder for architecture specification are overriden # by LDFLAGS. # # CC and CXX: # C and C++ compiler programs as defined in your build environment. # # INSTALL # Definition of install program. # # PD_PATH: # Equivalent to PDDIR. Supported for compatibility with pd-extended central # makefile, but deprecated otherwise. # # objectsdir: # Root directory for installation of Pd library directories, like PDLIBDIR but # not overridable by environment. Supported for compatibility with pd-extended # central makefile, but deprecated otherwise. # # pdincludepath, pdbinpath: # As PDINCLUDEDIR and PDBINDIR but not overridable by environment. Deprecated # as user variables. # # #=== paths ===================================================================== # # # Source files in directories other than current working directory must be # prefixed with their relative path. Do not rely on VPATH or vpath. # Object (.o) files are built in the directory of their source files. # Executables are built in current working directory. # # Default search path for m_pd.h and other API header files is platform # dependent, and overridable by PDINCLUDEDIR: # # Linux: /usr/include/pd # # OSX: /Applications/Pd*.app/Contents/Resources/src # # Windows: %PROGRAMFILES%/pd/src # # Default location to install pd libraries is platform dependent, and # overridable by PDLIBDIR: # # Linux: /usr/local/lib/pd-externals # OSX: ~/Library/Pd # Windows: %APPDATA%/Pd # # https://puredata.info/docs/faq/how-do-i-install-externals-and-help-files # The rationale for not installing to ~/pd-externals by default on Linux # is that some people share the home dir between 32 and 64 bit installations. # # #=== targets =================================================================== # # # all: build $(executables) plus optional post target # post: target to build after $(executables) # alldebug: build all with -g option turned on for debug symbols # : force clean build of an individual class # .pre: make preprocessor output file in current working directory # .lst: make asm/source output file in current working directory # # install: install executables and data files # clean: remove build products from source tree # # help: print help text # vars: print makefile variables # allvars: print all variables # depend: print generated prerequisites # coffee: dummy target # # Variable $(executables) expands to class executables plus optional shared lib, # or alternatively to single lib executable when make-lib-executable=true. # Targets pre and post can be defined by library makefile. Make sure to include # Makefile.pdlibbuilder first so default target all will not be redefined. # # #=== Pd-extended libdir concept ================================================ # # # For libdir layout as conceived by Hans-Christoph Steiner, see: # # https://puredata.info/docs/developer/Libdir # # Files README.txt, LICENSE.txt and -meta.pd are part of the libdir # convention. Help patches for each class and abstraction are supposed to be # available. Makefile.pdlibbuilder does not force the presence of these files # however. It does not automatically include such files in libdir installations. # Data files you want to include in distributions must be defined explicitly in # your Makefile. # # #=== Makefile.pdlibbuilder syntax conventions ================================== # # # Makefile.pdlibbuilder variable names are lower case. Default make variables, # environment variables, and standard user variables (CC, CXX, CFLAGS, DESTDIR) # are upper case. Use target 'allvars' to print all variables and their values. # # 'Fields' in data variables are separated by dots, like in 'foo.class.sources'. # Words in variables expressing a function or command are separated by dashes, # like in 'make-lib-executable'. # # #=== useful make options ======================================================= # # # Use 'make -d ' to print debug details of the make process. # Use 'make -p ' to print make's database. # # #=== TODO ====================================================================== # # # - decide whether to use -static-libgcc or shared dll in MinGW # - cygwin support # - android support # - Windows 64 bit support # - figure out how to handle '$' in filenames # - add makefile template targets dpkg-source dist libdir distclean tags? # # #=== end of documentation sections ============================================= # # ################################################################################ ################################################################################ ################################################################################ # GNU make version 3.81 (2006) or higher is required because of the following: # - function 'info' # - variable '.DEFAULT_GOAL' # force exit when make version is < 3.81 ifneq ($(firstword $(sort 3.81 $(MAKE_VERSION))), 3.81) $(error GNU make version 3.81 or higher is required) endif # Relative path to externals root dir in multi-lib source tree like # pd-extended SVN. Default is parent of current working directory. May be # defined differently in including makefile. externalsdir ?= .. # variable you can use to check if Makefile.pdlibbuilder is already included Makefile.pdlibbuilder = true ################################################################################ ### variables: library name and version ######################################## ################################################################################ # strip possibles spaces from lib.name, they mess up calculated file names lib.name := $(strip $(lib.name)) # if meta file exists, check library version metafile := $(wildcard $(lib.name)-meta.pd) ifdef metafile lib.version := $(shell sed -n \ 's|^\#X text [0-9][0-9]* [0-9][0-9]* VERSION \(.*\);|\1|p' \ $(metafile)) endif ################################################################################ ### variables: files ########################################################### ################################################################################ #=== sources =================================================================== # (re)define .class.sources using file names in class.sources define add-class-source $(notdir $(basename $v)).class.sources += $v endef $(foreach v, $(class.sources), $(eval $(add-class-source))) # derive class names from .class.sources variables sourcevariables := $(filter %.class.sources, $(.VARIABLES)) classes := $(basename $(basename $(sourcevariables))) # accumulate all source files specified in makefile classes.sources := $(sort $(foreach v, $(sourcevariables), $($v))) all.sources := $(classes.sources) $(lib.setup.sources) \ $(shared.sources) $(common.sources) #=== object files ============================================================== # construct object filenames from all C and C++ source file names classes.objects := $(addsuffix .o, $(basename $(classes.sources))) common.objects := $(addsuffix .o, $(basename $(common.sources))) shared.objects := $(addsuffix .o, $(basename $(shared.sources))) lib.setup.objects := $(addsuffix .o, $(basename $(lib.setup.sources))) all.objects = $(classes.objects) $(common.objects) $(shared.objects) \ $(lib.setup.objects) #=== executables =============================================================== # use recursive variables here because executable extension is not yet known # construct class executable names from class names classes.executables = $(addsuffix .$(extension), $(classes)) # construct shared lib executable name if shared sources are defined ifdef shared.sources shared.lib = lib$(lib.name).$(shared.extension) else shared.lib = endif ################################################################################ ### variables per platform ##################################################### ################################################################################ #=== flags per architecture ==================================================== # Set architecture-dependent cflags, mainly for Linux. For Mac and Windows, # arch.c.flags are overriden below. machine := $(shell uname -m) # Raspberry Pi 1st generation ifeq ($(machine), armv6l) arch.c.flags = -march=armv6 -mfpu=vfp -mfloat-abi=hard endif # Beagle, Udoo, RPi2 etc. ifeq ($(machine), armv7l) arch.c.flags = -march=armv7-a -mfpu=vfpv3 -mfloat-abi=hard endif # Intel 32 bit, build with SSE and SSE2 instructions ifeq ($(findstring $(machine), i386 i686), $(machine)) arch.c.flags = -march=pentium4 -mfpmath=sse -msse -msse2 endif # Intel/AMD 64 bit, build with SSE, SSE2 and SSE3 instructions ifeq ($(findstring $(machine), ia64 x86_64), $(machine)) arch.c.flags = -march=core2 -mfpmath=sse -msse -msse2 -msse3 endif #=== operating system ========================================================== # The following systems are defined: Linux, Darwin, Windows. GNU and # GNU/kFreeBSD are treated as Linux to get the same options. uname := $(shell uname) ifeq ($(findstring $(uname), Linux GNU GNU/kFreeBSD), $(uname)) system = Linux endif ifeq ($(uname), Darwin) system = Darwin endif ifeq ($(findstring MSYS, $(uname)), MSYS) system = Windows endif ifeq ($(findstring MINGW, $(uname)), MINGW) system = Windows endif # evaluate possible system-specific multiline defines from library makefile $(eval $(for$(system))) # TODO: Cygwin, Android #=== flags and paths for Linux ================================================= ifeq ($(system), Linux) prefix = /usr/local libdir := $(prefix)/lib pkglibdir = $(libdir)/pd-externals pdincludepath := $(wildcard /usr/include/pd) extension = pd_linux cpp.flags := -DUNIX c.flags := -fPIC c.ldflags := -rdynamic -shared -fPIC -Wl,-rpath,"\$$ORIGIN",--enable-new-dtags c.ldlibs := -lc -lm cxx.flags := -fPIC -fcheck-new cxx.ldflags := -rdynamic -shared -fPIC -Wl,-rpath,"\$$ORIGIN",--enable-new-dtags cxx.ldlibs := -lc -lm -lstdc++ shared.extension = so shared.ldflags := -rdynamic -fPIC -shared -Wl,-soname,$(shared.lib) stripflags = --strip-unneeded -R .note -R .comment endif #=== flags and paths for Darwin ================================================ # On OSX we try to build fat binaries by default. It is assumed that OSX i386 # can build for ppc and OSX x86_64 can't. TODO: try to refine this condition. # LLVM-clang doesn't support -fcheck-new, therefore this flag is omitted for # OSX x86_64. ifeq ($(system), Darwin) pkglibdir = $(HOME)/Library/Pd pdincludepath := $(firstword $(wildcard \ /Applications/Pd*.app/Contents/Resources/src)) extension = pd_darwin cpp.flags := -DUNIX -DMACOSX -I /sw/include c.flags := c.ldflags := -undefined suppress -flat_namespace -bundle c.ldlibs := -lc cxx.ldflags := -undefined suppress -flat_namespace -bundle cxx.ldlibs := -lc shared.extension = dylib shared.ldflags = -dynamiclib -undefined dynamic_lookup \ -install_name @loader_path/$(shared.lib) \ -compatibility_version 1 -current_version 1.0 stripflags = -x version.flag := $(filter $(cflags), -mmacosx-version-min=%) ifeq ($(machine), i386) cxx.flags := -fcheck-new arch := ppc i386 x86_64 version.flag ?= -mmacosx-version-min=10.4 endif ifeq ($(machine), x86_64) arch := i386 x86_64 version.flag ?= -mmacosx-version-min=10.5 endif arch.c.flags := $(addprefix -arch , $(arch)) $(version.flag) arch.ld.flags := $(arch.c.flags) endif #=== flags and paths for Windows =============================================== # Standard paths on Windows contain spaces, and GNU make functions treat such # paths as lists, with unintended effects. Therefore we must use shell function # ls instead of make's wildcard, and probe for each standard path individually. # Using double quotes around paths with spaces is obligatory. Since some path # variables are assembled or re-expanded later, great care must be taken to put # quotes at appropriate points throughout the makefile. Thanks, Bill. # paths for 32-bit executables on 64-bit Windows aren't yet defined here (TODO) ifeq ($(system), Windows) pkglibdir := $(APPDATA)/Pd ifndef pdbinpath pdbinpath := $(shell ls -d "$(PROGRAMFILES)/pd/bin") endif ifndef pdincludepath pdincludepath := $(shell ls -d "$(PROGRAMFILES)/pd/src") endif endif # On Windows we build 32 bit by default to match Pd(-extended) binary # distributions. This may change in the future. # TODO: decide whether -mms-bitfields should be specified. ifeq ($(system), Windows) extension = dll CC = gcc CXX = g++ arch.c.flags := -march=pentium4 -msse -msse2 -mfpmath=sse cpp.flags := -DMSW -DNT c.flags := c.ldflags = -static-libgcc -shared \ -Wl,--enable-auto-import "$(pdbinpath)/pd.dll" c.ldlibs := cxx.flags := -fcheck-new cxx.ldflags = -static-libstdc++ -shared \ -Wl,--enable-auto-import "$(pdbinpath)/pd.dll" cxx.ldlibs := shared.extension = dll shared.ldflags = -static-libgcc -shared "$(pdbinpath)/pd.dll" stripflags = --strip-unneeded -R .note -R .comment endif #=== paths ===================================================================== # Platform-dependent default paths are specified above, but overridable. # Path variables in upper case can be defined as make command argument or in the # environment. 'PD_PATH' and 'objectsdir' are supported for compatibility with # the build system that pd-l2ork has inherited from pd-extended. PDDIR ?= $(PD_PATH) PDINCLUDEDIR ?= $(pdincludepath) PDBINDIR ?= $(pdbinpath) PDLIBDIR ?= $(firstword $(objectsdir) $(pkglibdir)) ifneq ($(PDDIR),) PDINCLUDEDIR := $(wildcard $(PDDIR)/src) PDBINDIR := $(wildcard $(PDDIR)/bin) endif # base path where all components of the lib will be installed by default installpath := $(DESTDIR)$(PDLIBDIR)/$(lib.name) # check if include path contains spaces (as is often the case on Windows) # if so, store the path so we can later do checks with it pdincludepathwithspaces := $(if $(word 2, $(PDINCLUDEDIR)), $(PDINCLUDEDIR)) #=== accumulated build flags =================================================== # From GNU make docs: 'Users expect to be able to specify CFLAGS freely # themselves.' So we use CFLAGS to define options which are not strictly # required for compilation: optimizations, architecture specifications, and # warnings. CFLAGS can be safely overriden using a make command argument. # Variables cflags, ldflags and ldlibs may be defined in including makefile. optimization.flags = -O3 -ffast-math -funroll-loops -fomit-frame-pointer warn.flags = -Wall -Wextra -Wshadow -Winline -Wstrict-aliasing # suppress -Wunused-variable & Co if you don't want to clutter a build log ifdef suppress-wunused warn.flags += $(addprefix -Wno-unused-, function parameter value variable) endif CFLAGS = $(warn.flags) $(optimization.flags) $(arch.c.flags) # preprocessor flags cpp.flags := -DPD -I "$(PDINCLUDEDIR)" $(cpp.flags) $(CPPFLAGS) # flags for dependency checking (cflags from makefile may define -I options) depcheck.flags := $(cpp.flags) $(cflags) # architecture specifications for linker are overridable by LDFLAGS LDFLAGS := $(arch.ld.flags) # now add the same ld flags to shared dynamic lib shared.ldflags := $(shared.ldflags) $(LDFLAGS) # accumulated flags for C compiler / linker c.flags := $(cpp.flags) $(c.flags) $(cflags) $(CFLAGS) c.ldflags := $(c.ldflags) $(ldflags) $(LDFLAGS) c.ldlibs := $(c.ldlibs) $(ldlibs) # accumulated flags for C++ compiler / linker cxx.flags := $(cpp.flags) $(cxx.flags) $(cflags) $(CFLAGS) cxx.ldflags := $(cxx.ldflags) $(ldflags) $(LDFLAGS) cxx.ldlibs := $(cxx.ldlibs) $(ldlibs) ################################################################################ ### variables: tools ########################################################### ################################################################################ # aliases so we can later define 'compile-$1' and set 'c' or 'cxx' as argument compile-c := $(CC) compile-cxx := $(CXX) ################################################################################ ### checks ##################################################################### ################################################################################ # At this point most variables are defined. Now do some checks and info's # before rules begin. # 'forward declaration' of default target, needed to do checks all: # To avoid unpredictable results, make sure the default target is not redefined # by including makefile. ifneq ($(.DEFAULT_GOAL), all) $(error Default target must be 'all'.) endif # find out which target(s) will be made ifdef MAKECMDGOALS goals := $(MAKECMDGOALS) else goals := all endif # store path to Pd API m_pd.h if it is found ifdef PDINCLUDEDIR mpdh := $(shell ls "$(PDINCLUDEDIR)/m_pd.h") endif # print Makefile.pdlibbuilder version $(info ++++ info: using Makefile.pdlibbuilder version $(version)) # when making target all, check if m_pd.h is found and print info about it ifeq ($(goals), all) $(if $(mpdh), \ $(info ++++ info: using Pd API $(mpdh)), \ $(warning Where is Pd API m_pd.h? Do 'make help' for info.)) endif # print target info $(info ++++ info: making target $(goals) $(if $(lib.name),in lib $(lib.name))) # when installing, print installpath info $(if $(filter install install-lib, $(goals)), $(info ++++ info: \ installpath is '$(installpath)')) #=== define executables ======================================================== # By default we build class executables, and optionally a shared dynamic link # lib. When make-lib-executable=yes we build all classes into a single lib # executable, on the condition that variable lib.setup.sources is defined. ifeq ($(make-lib-executable),yes) $(if $(lib.setup.sources), ,\ $(error Can not build library blob because lib.setup.sources is undefined)) executables := $(lib.name).$(extension) else executables := $(classes.executables) $(shared.lib) endif ################################################################################ ### rules: special targets ##################################################### ################################################################################ # Disable built-in rules. If some target can't be built with the specified # rules, it should not be built at all. MAKEFLAGS += --no-builtin-rules .PRECIOUS: .SUFFIXES: .PHONY: all post build-lib \ $(classes) $(makefiledirs) $(makefiles) \ install install-executables install-datafiles install-datadirs \ force clean vars allvars depend help ################################################################################ ### rules: build targets ####################################################### ################################################################################ # Target all forces the build of targets [$(executables) post] in # deterministic order. Target $(executables) builds class executables plus # optional shared lib or alternatively a single lib executable when # make-lib-executable=true. Target post is optionally defined by # library makefile. all: post post: $(executables) all: $(info ++++info: target all in lib $(lib.name) completed) # build all with -g option turned on for debug symbols alldebug: c.flags += -g alldebug: cxx.flags += -g alldebug: all #=== class executable ========================================================== # recipe for linking objects in class executable # argument $1 = compiler type (c or cxx) # argument $2 = class basename define link-class $(compile-$1) \ $($1.ldflags) $($2.class.ldflags) \ -o $2.$(extension) \ $(addsuffix .o, $(basename $($2.class.sources))) \ $(addsuffix .o, $(basename $(common.sources))) \ $($1.ldlibs) $($2.class.ldlibs) $(shared.lib) endef # general rule for linking object files in class executable %.$(extension): $(shared.lib) $(info ++++ info: linking objects in $@ for lib $(lib.name)) $(if $(filter %.cc %.cpp, $($*.class.sources)), \ $(call link-class,cxx,$*), \ $(call link-class,c,$*)) #=== library blob ============================================================== # build all classes into single executable build-lib: $(lib.name).$(extension) $(info ++++ info: library blob $(lib.name).$(extension) completed) # recipe for linking objects in lib executable # argument $1 = compiler type (c or cxx) define link-lib $(compile-$1) \ $($1.ldflags) $(lib.ldflags) \ -o $(lib.name).$(extension) $(all.objects) \ $($1.ldlibs) $(lib.ldlibs) endef # rule for linking objects in lib executable # declared conditionally to avoid name clashes ifeq ($(make-lib-executable),yes) $(lib.name).$(extension): $(all.objects) $(if $(filter %.cc %.cpp, $(all.sources)), \ $(call link-lib,cxx), \ $(call link-lib,c)) endif #=== shared dynamic lib ======================================================== # recipe for linking objects in shared executable # argument $1 = compiler type (c or cxx) define link-shared $(compile-$1) \ $(shared.ldflags) \ -o lib$(lib.name).$(shared.extension) $(shared.objects) \ $($1.ldlibs) $(shared.ldlibs) endef # rule for linking objects in shared executable # build recipe is in macro 'link-shared' lib$(lib.name).$(shared.extension): $(shared.objects) $(info ++++ info: linking objects in shared lib $@) $(if $(filter %.cc %.cpp, $(shared.sources)), \ $(call link-shared,cxx), \ $(call link-shared,c)) #=== object files ============================================================== # recipe to make .o file from source # argument $1 is compiler type (c or cxx) define make-object-file $(info ++++ info: making $@ in lib $(lib.name)) $(compile-$1) \ $($1.flags) \ -o $@ -c $< endef # Three rules to create .o files. These are double colon 'terminal' rules, # meaning they are the last in a rules chain. %.o:: %.c $(call make-object-file,c) %.o:: %.cc $(call make-object-file,cxx) %.o:: %.cpp $(call make-object-file,cxx) #=== explicit prerequisites for class executables ============================== # For class executables, prerequisite rules are declared in run time. Target # 'depend' prints these rules for debugging purposes. # declare explicit prerequisites rule like 'class: class.extension' # argument $v is class basename define declare-class-target $v: $v.$(extension) endef # declare explicit prerequisites rule like 'class.extension: object1.o object2.o' # argument $v is class basename define declare-class-executable-target $v.$(extension): $(addsuffix .o, $(basename $($v.class.sources))) \ $(addsuffix .o, $(basename $(common.sources))) endef # evaluate explicit prerequisite rules for all classes $(foreach v, $(classes), $(eval $(declare-class-target))) $(foreach v, $(classes), $(eval $(declare-class-executable-target))) #=== implicit prerequisites for class executables ============================== # Evaluating implicit prerequisites (header files) with help from the # preprocessor is 'expensive' so this is done conditionally and selectively. # Note that it is also possible to trigger a build via install targets, in # which case implicit prerequisites are not checked. # When the Pd include path contains spaces it will mess up the implicit # prerequisites rules. disable-dependency-tracking := $(strip $(pdincludepathwithspaces)) ifndef disable-dependency-tracking must-build-everything := $(filter all, $(goals)) must-build-class := $(filter $(classes), $(goals)) must-build-sources := $(foreach v, $(must-build-class), $($v.class.sources)) endif # declare implicit prerequisites rule like 'object.o: header1.h header2.h ...' # argument $1 is input source file(s) # dir is explicitly added because option -MM strips it by default define declare-object-target $(dir $1)$(filter %.o: %.h, $(shell $(CPP) $(depcheck.flags) -MM $1)) $(MAKEFILE_LIST) endef # evaluate implicit prerequisite rules when rebuilding everything ifdef must-build-everything $(if $(wildcard $(all.objects)), \ $(info ++++ info: evaluating implicit prerequisites in lib $(lib.name).....) \ $(foreach v, $(all.sources), $(eval $(call declare-object-target, $v)))) endif # evaluate implicit prerequisite rules when selectively building classes ifdef must-build-class $(foreach v, $(must-build-sources), \ $(eval $(call declare-object-target, $v))) $(foreach v, $(shared.sources), \ $(eval $(call declare-object-target, $v))) endif ################################################################################ ### rules: preprocessor and assembly files ##################################### ################################################################################ # Preprocessor and assembly output files for bug tracing etc. They are not part # of the build processes for executables. By default these files are created in # the current working directory. Dependency tracking is not performed, the build # is forced instead to make sure it's up to date. force: #=== preprocessor file ========================================================= # make preprocessor output file with extension .pre # argument $1 = compiler type (c or cxx) define make-preprocessor-file $(info ++++ info: making preprocessor output file $(notdir $*.pre) \ in current working directory) $(compile-$1) -E $< $(c.flags) $($1.flags) -o $(notdir $*.pre) endef %.pre:: %.c force $(call make-preprocessor-file,c) %.pre:: %.cc force $(call make-preprocessor-file,cxx) %.pre:: %.cpp force $(call make-preprocessor-file,cxx) #=== assembly file ============================================================= # make C / assembly interleaved output file with extension .lst # argument $1 = compiler type (c or cxx) define make-assembly-file $(info ++++ info: making assembly output file $(notdir $*.lst) \ in current working directory) $(compile-$1) \ -c -Wa,-a,-ad -fverbose-asm \ $($1.flags) \ $< > $(notdir $*.lst) endef %.lst:: %.c force $(call make-assembly-file,c) %.lst:: %.cc force $(call make-assembly-file,cxx) %.lst:: %.cpp force $(call make-assembly-file,cxx) ################################################################################ ### rules: installation targets ################################################ ################################################################################ # Install targets depend on successful exit status of target all because nothing # must be installed in case of a build error. # -p = preserve time stamps # -m = set permission mode (as in chmod) # -d = create all components of specified directories INSTALL = install INSTALL_PROGRAM := $(INSTALL) -p -m 644 INSTALL_DATA := $(INSTALL) -p -m 644 INSTALL_DIR := $(INSTALL) -m 755 -d # strip spaces from file names executables := $(strip $(executables)) datafiles := $(strip $(datafiles)) datadirs := $(strip $(datadirs)) # Do not make any install sub-target with empty variable definition because the # install program would exit with an error. install: $(if $(executables), install-executables) install: $(if $(datafiles), install-datafiles) install: $(if $(datadirs), install-datadirs) install-executables: all $(INSTALL_DIR) -v "$(installpath)" $(foreach v, $(executables), \ $(INSTALL_PROGRAM) '$v' "$(installpath)";) $(info ++++ info: executables of lib $(lib.name) installed \ from $(CURDIR) to $(installpath)) install-datafiles: all $(INSTALL_DIR) -v "$(installpath)" $(foreach v, $(datafiles), \ $(INSTALL_DATA) '$(v)' "$(installpath)";) $(info ++++ info: data files of lib $(lib.name) installed \ from $(CURDIR) to $(installpath)) install-datadirs: all $(foreach v, $(datadirs), $(INSTALL_DIR) "$(installpath)/$v";) $(foreach v, $(datadirs), \ $(INSTALL_DATA) $(wildcard $v/*) "$(installpath)/$v";) $(info ++++ info: data directories of lib $(lib.name) installed \ from $(CURDIR) to $(installpath)) ################################################################################ ### rules: distribution targets ################################################ ################################################################################ # TODO # These targets are implemented in Makefile Template, but I have to figure out # how to do it under the not-so-strict conditions of Makefile.pdlibbuilder. # make source package dist: @echo "target dist not yet implemented" # make Debian source package dpkg-source: @echo "target dpkg-source not yet implemented" $(ORIGDIR): $(DISTDIR): ################################################################################ ### rules: clean targets ####################################################### ################################################################################ # delete build products from build tree clean: rm -f $(all.objects) rm -f $(classes.executables) $(lib.name).$(extension) $(shared.lib) rm -f *.pre *.lst # remove distribution directories and tarballs from build tree distclean: clean @echo "target distclean not yet implemented" ################################################################################ ### rules: submake targets ##################################################### ################################################################################ # Iterate over sub-makefiles or makefiles in other directories. # When 'continue-make=yes' is set, sub-makes will report 'true' to the parent # process regardless of their real exit status. This prevents the parent make # from being aborted by a sub-make error. Useful when you want to quickly find # out which sub-makes from a large set will succeed. ifeq ($(continue-make),yes) continue = || true endif # These targets will trigger sub-make processes for entries in 'makefiledirs' # and 'makefiles'. all alldebug install clean distclean dist dkpg-source: \ $(makefiledirs) $(makefiles) # this expands to identical rules for each entry in 'makefiledirs' $(makefiledirs): $(MAKE) --directory=$@ $(MAKECMDGOALS) $(continue) # this expands to identical rules for each entry in 'makefiles' $(makefiles): $(MAKE) --directory=$(dir $@) --makefile=$(notdir $@) $(MAKECMDGOALS) $(continue) ################################################################################ ### rules: convenience targets ################################################# ################################################################################ #=== show variables ============================================================ # Several 'function' macro's cause errors when expanded within a rule or without # proper arguments. Variables which are set with the define directive are only # shown by name for that reason. functions = \ add-class-source \ declare-class-target \ declare-class-executable-target \ declare-object-target \ link-class \ link-lib \ link-shared \ make-object-file \ make-preprocessor-file \ make-assembly-file # show variables from makefiles vars: $(info ++++ info: showing makefile variables:) $(foreach v,\ $(sort $(filter-out $(functions) functions, $(.VARIABLES))),\ $(if $(filter file, $(origin $v)),\ $(info variable $v = $($v)))) $(foreach v, $(functions), $(info 'function' name: $v)) @echo # show all variables allvars: $(info ++++ info: showing default, automatic and makefile variables:) $(foreach v, \ $(sort $(filter-out $(functions) functions, $(.VARIABLES))), \ $(info variable ($(origin $v)) $v = $($v))) $(foreach v, $(functions), $(info 'function' name: $v)) @echo #=== show dependencies ========================================================= # show generated prerequisites rules depend: $(info ++++ info: generated prerequisite rules) $(foreach v, $(classes), $(info $(declare-class-target))) $(foreach v, $(classes), $(info $(declare-class-executable-target))) $(foreach v, $(all.sources), $(info $(call declare-object-target, $v))) @echo #=== show help text ============================================================ # brief info about targets and paths ifdef mpdh mpdhinfo := $(mpdh) else mpdhinfo := m_pd.h was not found. Is Pd installed? endif help: @echo @echo " Main targets:" @echo " all: build executables (default target)" @echo " install: install all components of the library" @echo " vars: print makefile variables for troubleshooting" @echo " allvars: print all variables for troubleshooting" @echo " help: print this help text" @echo @echo " Pd API m_pd.h:" @echo " $(mpdhinfo)" @echo " You may specify your preferred Pd include directory as argument" @echo " to the make command, like 'PDINCLUDEDIR=path/to/pd/src'." @echo @echo " Path for installation of your libdir(s):" @echo " $(PDLIBDIR)" @echo " Alternatively you may specify your path for installation as argument" @echo " to the make command, like 'PDLIBDIR=path/to/pd-externals'." @echo @echo " Default paths are listed in the doc sections in Makefile.pdlibbuilder." @echo #=== dummy target ============================================================== coffee: @echo "Makefile.pdlibbuilder: Can not make coffee. Sorry." ################################################################################ ### end of rules sections ###################################################### ################################################################################ # for syntax highlighting in vim and github # vim: set filetype=make: iem_utils-v0.0.20180206/punish/doublechord-plugin/doublechord.c0000644000175000017500000000547013207347074024433 0ustar zmoelnigzmoelnig/****************************************************** * * doublechord - implementation file * * copyleft (c) IOhannes m zmölnig * * 2017:forum::für::umläute:2017 * * institute of electronic music and acoustics (iem) * ****************************************************** * * license: GNU General Public License v.2 (or later) * ******************************************************/ /* * * - doublechord: duplicate patch chords * * select a connection (aka 'patch chord'), and press Ctrl-D * the connection will be duplicated to the right (if possible), * connecting the same two objects but the next outlets/inlets * */ #include "m_pd.h" #include "m_imp.h" #include "g_canvas.h" static t_object* index2glist(const t_glist*glist, int index) { t_gobj*obj=glist->gl_list; while(index-->0 && obj) { obj=obj->g_next; } return (t_object*)obj; } static int is_connected(t_object*src, int nsrc, const t_object*dst, const int ndst) { t_outlet *out = 0; t_outconnect*conn=obj_starttraverseoutlet(src, &out, nsrc); while(conn) { int which = 0; t_inlet *in = 0; t_object *dest = 0; conn=obj_nexttraverseoutlet(conn, &dest, &in, &which); if ((dst == dest) && (ndst == which)) return 1; } return 0; } /* ------------------------- doublechord ---------------------------- */ static void canvas_doublechord(t_canvas *x) { if (x && x->gl_editor && x->gl_editor->e_selectedline) { t_atom ap[4]; int outno = x->gl_editor->e_selectline_outno + 1; int inno = x->gl_editor->e_selectline_inno + 1; t_object*outobj = index2glist(x, x->gl_editor->e_selectline_index1); t_object*inobj = index2glist(x, x->gl_editor->e_selectline_index2); while(is_connected(outobj, outno, inobj, inno)) { outno++; inno++; } if (!outobj || obj_noutlets(outobj) <= outno) return; if (!inobj || obj_ninlets (inobj ) <= inno ) return; if(obj_issignaloutlet(outobj, outno) && !obj_issignalinlet(inobj, inno)) return; SETFLOAT(ap+0, x->gl_editor->e_selectline_index1); SETFLOAT(ap+1, outno); SETFLOAT(ap+2, x->gl_editor->e_selectline_index2); SETFLOAT(ap+3, inno); pd_typedmess((t_pd*)x, gensym("connect"), 4, ap); x->gl_editor->e_selectline_outno = outno; x->gl_editor->e_selectline_inno = inno; } else { pd_typedmess((t_pd*)x, gensym("duplicate doublechord"), 0, 0); } } void doublechord_setup(void) { t_gotfn dupfun = 0; if(NULL==canvas_class)return; post("double-chord - duplicate patch chords"); dupfun = zgetfn(&canvas_class, gensym("duplicate")); if((t_method)canvas_doublechord != (t_method)dupfun) { class_addmethod(canvas_class, (t_method)dupfun, gensym("duplicate doublechord"), 0); class_addmethod(canvas_class, (t_method)canvas_doublechord, gensym("duplicate"), 0); } } iem_utils-v0.0.20180206/punish/doublechord-plugin/Makefile0000755000175000017500000000164213207347074023435 0ustar zmoelnigzmoelnig#!/usr/bin/make -f # Makefile for pure data externals in lib creb. # Needs Makefile.pdlibbuilder to work (https://github.com/pure-data/pd-lib-builder) punish.name = doublechord lib.name = $(punish.name)-plugin # special file that does not provide a class lib.setup.sources = # all other C and C++ files in subdirs are source files per class # (alternatively, enumerate them by hand) class.sources = $(punish.name).c datafiles = \ $(punish.name)-plugin.tcl \ $(wildcard *-help.pd) \ README.md LICENSE.md datadirs = ################################################################################ ### pdlibbuilder ############################################################### ################################################################################ # Include Makefile.pdlibbuilder from this directory, # or else from some user-defined folder PDLIBBUILDER_DIR=./ include $(PDLIBBUILDER_DIR)/Makefile.pdlibbuilder iem_utils-v0.0.20180206/punish/doublechord-plugin/LICENSE.md0000644000175000017500000004364213207347074023404 0ustar zmoelnigzmoelnigGNU GENERAL PUBLIC LICENSE ========================== Version 2, June 1991 > Copyright (C) 1989, 1991 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. # Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Lesser General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. # GNU GENERAL PUBLIC LICENSE # ## TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION ## - *0\.* This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. - 1\. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. - 2\. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. - 3\. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. - 4\. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. - 5\. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. - 6\. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. - 7\. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. - 8\. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. - 9\. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. - 10\. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. ## NO WARRANTY - 11\. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - 12\. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. ## END OF TERMS AND CONDITIONS ## --------------------------------------------------------------------------- ### How to Apply These Terms to Your New Programs ### If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. iem_utils-v0.0.20180206/punish/doublechord-plugin/doublechord-help.pd0000644000175000017500000000344713207347074025544 0ustar zmoelnigzmoelnig#N canvas 82 100 571 575 10; #X text 89 46 doublechord; #X text 89 57 ===========; #X text 25 88 an easy way to connect an object with many outlets and an object with many inlets.; #X text 30 150 usage:; #X text 111 152 1.) create two objects; #X text 111 168 2.) connect them; #X text 111 185 3.) select the *connection*; #X text 111 203 4.) press - (duplicate) to create a new connection right of the selected connection., f 43; #X text 111 247 5.) press - again to create more connections ; #X text 83 285 Pd will stop creating new connections once you've reached the rightmost inlet resp. outlet.; #X text 83 315 It will also stop \, if the outlet cannot be connected to the inlet because they are incompatible (e.g. you cannot connect a signal-outlet with a non-signal inlet); #X text 84 360 If there's already a connection in place \, Pd will skip it and proceed to the right.; #N canvas 180 311 450 300 \$0-try-it-out 0; #X restore 136 460 pd \$0-try-it-out; #X text 268 461 <- try it!; #N canvas 202 208 969 430 try 0; #X obj 100 100 bng 20 250 50 0 \$0-try \$0-try empty 17 7 0 10 -262144 -1 -1; #X obj 168 125 r \$0-try; #X obj 168 147 t b b; #X obj 168 241 s pd-\$0-try-it-out; #X obj 310 102 loadbang; #X msg 168 199 vis 1 \, editmode 1; #X msg 80 199 clear; #X obj 310 124 t b b; #X msg 337 150 editmode 1 \, vis 0; #X msg 310 183 clear \, obj 100 100 unpack 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 \, obj 100 150 pack 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 \, connect 0 1 1 0 \, text 50 50 select the connection and click Ctrl-D (again).; #X connect 1 0 2 0; #X connect 2 0 5 0; #X connect 2 1 9 0; #X connect 4 0 7 0; #X connect 5 0 3 0; #X connect 6 0 3 0; #X connect 7 0 9 0; #X connect 7 1 8 0; #X connect 8 0 3 0; #X connect 9 0 3 0; #X coords 0 -1 1 1 20 20 2 100 100; #X restore 243 457 pd try; iem_utils-v0.0.20180206/punish/.travis.yml0000644000175000017500000000270013004410214020267 0ustar zmoelnigzmoelniglanguage: c sudo: required dist: trusty env: global: - secure: "VtjMps4NzAMe2I3/CClJ6r8XJeXZ+4dtQR2EIul+IgPNhCexLA96Y9MLjXaE90+frOYZvuQUN/WXjqRrc5M3PgsaRnSRqlpqQSQX47AII/qoY8xf/mEJ2fn/QhF63XDRe+91cVFNG5MHUKLPDcl3QhiPBUmkN8eJtFDPrtXZiU+2zGs+sbyqB/E5BCvQAq1QCqSNbI/JUTQpcafbQf11rrzfsJBo9e/C/VK6rK+LB8Xch1ajiKPlud/VL8RXef8DfReOSsQ0LP0VI1Aj4tQs17zqKXOaUiMQUav3s7qTcIuLVaYf6w0bY3a6URV59Lj5F9+B7gkbwuAJLNPO8Dv87WeIZE8NreszPRLsTUoLrsq8OgDKiYEi4dfZH1vPpF8YhkQy+eaWImi7l7E5NNzi/k8oa6Ej/1P3aRvMuivpX8c0GRJDF5LOowG8WfGF8IkW1KeoRvYM/N7ZnIzppeMgEhKx6V+cXY1RZDUjgCO5hjUUhi9Yj1JRuInPoc5pycG0HbaMwVaZe+zyiTWRX7takuh0gQrsq1r6jg7PkcU+V8+U7QiXfwfp8KzMSr0TZxiw7DDO/Fzckg0wTsFb6Ya7RTvQPx7hM84RJ6eXzt0a+ixkKEntKaljTaW2pKvqFuTjHYq7ybisf6dnR6mjk02uqigvoVaZclDR/stLeWTqf5Q=" - COVERITY_SCAN_BRANCH_PATTERN="(master|coverity-.*)" - COVERITY_SCAN_NOTIFICATION_EMAIL="dev@umlaeute.mur.at" - COVERITY_SCAN_BUILD_COMMAND="make" matrix: include: - compiler: clang - compiler: gcc env: - COVERITY_SCAN_PROJECT_NAME="$TRAVIS_REPO_SLUG" before_install: - sudo apt-get update -qq - sudo apt-get install -qq puredata-dev before_script: # implement Coverity Scan with before_script instead of addons.coverity_scan # to work around too-early quota check by the coverity_scan addon - if [[ -n $COVERITY_SCAN_PROJECT_NAME ]] ; then curl -s 'https://scan.coverity.com/scripts/travisci_build_coverity_scan.sh' | bash || true ; fi script: - make iem_utils-v0.0.20180206/punish/Makefile0000644000175000017500000000041613207347074017642 0ustar zmoelnigzmoelnigsubprojects=patcherize triggerize doublechord .PHONY: all $(subprojects) all: $(subprojects) $(subprojects): $(MAKE) -C $@-plugin .PHONY: clean $(subprojects%=%-clean) clean: $(subprojects:%=%-clean) $(subprojects:%=%-clean): $(MAKE) -C $(@:%-clean=%-plugin) clean iem_utils-v0.0.20180206/tclprompt-plugin/0000755000175000017500000000000012661077617020221 5ustar zmoelnigzmoelnigiem_utils-v0.0.20180206/tclprompt-plugin/tclprompt-plugin.tcl0000644000175000017500000001036412661077617024251 0ustar zmoelnigzmoelnig# META TCL/TK prompt plugin # META DESCRIPTION enables a wee Tcl/Tk cmdline within the Pd-console # META AUTHOR IOhannes m zmölnig , Hans-Christoph Steiner # META VERSION 0.1 package require pdwindow 0.1 namespace eval ::tclprompt:: { } proc ::tclprompt_disable_menu {} { # disable the TclPrompt menu (as gives an error if we re-create) set mymenu .menubar.help if {[catch {$mymenu entryconfigure [_ "Tcl prompt"] -state disabled}]} { } } ## first check if the Pd-runtime provides a tcl_entry (and use it) if {[catch XXX::pdwindow::create_tcl_entry errorname]} { ## if that fails, we need to provide our own (code shamelessly taken from Pd-0.46) namespace eval ::tclprompt:: { variable tclentry {} variable tclentry_history {"console show"} variable history_position 0 variable show 1 } proc ::tclprompt::eval_tclentry {} { variable tclentry variable tclentry_history variable history_position 0 if {$tclentry eq ""} {return} ;# no need to do anything if empty if {[catch {uplevel #0 $tclentry} errorname]} { global errorInfo switch -regexp -- $errorname { "missing close-brace" { ::pdwindow::error [concat [_ "(Tcl) MISSING CLOSE-BRACE '\}': "] $errorInfo]\n } "missing close-bracket" { ::pdwindow::error [concat [_ "(Tcl) MISSING CLOSE-BRACKET '\]': "] $errorInfo]\n } "^invalid command name" { ::pdwindow::error [concat [_ "(Tcl) INVALID COMMAND NAME: "] $errorInfo]\n } default { ::pdwindow::error [concat [_ "(Tcl) UNHANDLED ERROR: "] $errorInfo]\n } } } lappend tclentry_history $tclentry set tclentry {} } proc ::tclprompt::get_history {direction} { variable tclentry_history variable history_position incr history_position $direction if {$history_position < 0} {set history_position 0} if {$history_position > [llength $tclentry_history]} { set history_position [llength $tclentry_history] } .pdwindow.tclprompt.entry delete 0 end .pdwindow.tclprompt.entry insert 0 \ [lindex $tclentry_history end-[expr $history_position - 1]] } proc ::tclprompt::validate_tcl {} { variable tclentry if {[info complete $tclentry]} { .pdwindow.tclprompt.entry configure -background "white" } else { .pdwindow.tclprompt.entry configure -background "#FFF0F0" } } #--create tcl entry-----------------------------------------------------------# proc ::tclprompt::create {} { # Tcl entry box frame frame .pdwindow.tclprompt -borderwidth 0 pack .pdwindow.tclprompt -side bottom -fill x -before .pdwindow.text label .pdwindow.tclprompt.label -text [_ "Tcl:"] -anchor e pack .pdwindow.tclprompt.label -side left entry .pdwindow.tclprompt.entry -width 200 \ -exportselection 1 -insertwidth 2 -insertbackground blue \ -textvariable ::tclprompt::tclentry -font {$::font_family -12} pack .pdwindow.tclprompt.entry -side left -fill x # bindings for the Tcl entry widget bind .pdwindow.tclprompt.entry <$::modifier-Key-a> "%W selection range 0 end; break" bind .pdwindow.tclprompt.entry "::tclprompt::eval_tclentry" bind .pdwindow.tclprompt.entry "::tclprompt::get_history 1" bind .pdwindow.tclprompt.entry "::tclprompt::get_history -1" bind .pdwindow.tclprompt.entry +"::tclprompt::validate_tcl" bind .pdwindow.text "focus .pdwindow.tclprompt.entry; break" # pack .pdwindow.tclprompt } proc ::tclprompt::destroy {} { ::destroy .pdwindow.tclprompt } ::tclprompt_disable_menu set mymenu .menubar.help $mymenu add separator $mymenu add check -label [_ "Tcl prompt"] -variable ::tclprompt::show \ -command {::tclprompt::toggle $::tclprompt::show} # bind all <$::modifier-Key-s> {::deken::open_helpbrowser .helpbrowser2} ::tclprompt::create } else { puts "built-in TclPrompt" ::tclprompt_disable_menu proc ::tclprompt::create {} {} proc ::tclprompt::destroy {} { # actually we *can* destroy it, but we cannot re-create it ::pdwindow::error "cannot destroy built-in TclPrompt" } } proc ::tclprompt::toggle {state} { if { $state } { ::tclprompt::create } { ::tclprompt::destroy } } proc ::tclprompt::test {} { after 1000 ::tclprompt::create ::tclprompt::destroy } pdtk_post "loaded tclprompt-plugin\n" iem_utils-v0.0.20180206/tclprompt-plugin/LICENSE0000644000175000017500000000271412661077617021232 0ustar zmoelnigzmoelnigCopyright (c) 2015, pure-data All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of tclprompt-plugin nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. iem_utils-v0.0.20180206/tclprompt-plugin/README.md0000644000175000017500000000115212661077617021477 0ustar zmoelnigzmoelniginteractive Tcl/Tk prompt === When developing GUI-plugins (or debugging Pd) it often helps to have a little interactive Tcl/Tk prompt within Pd. This plugin enables one for you. For Pd versions that come with their own implementation of a TclPrompt (that's Pd-0.43..0.46) it will simply enable that one. For newer versions of Pd that lack a built-in TclPrompt, the plugin provides one. ## Installing simply copy the [tclprompt-plugin.tcl](https://raw.githubusercontent.com/pure-data/tclprompt-plugin/master/tclprompt-plugin.tcl) into your Pd searchpath. ## AUTHORS - IOhannes m zmölnig - Hans-Christoph Steiner